mirror of
https://github.com/cemu-project/DS4Windows.git
synced 2024-12-27 09:01:48 +01:00
146 lines
5.2 KiB
C#
146 lines
5.2 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Security;
|
|
using System.Text;
|
|
|
|
namespace DS4Windows
|
|
{
|
|
[SuppressUnmanagedCodeSecurity]
|
|
class Util
|
|
{
|
|
public enum PROCESS_INFORMATION_CLASS : int
|
|
{
|
|
ProcessBasicInformation = 0,
|
|
ProcessQuotaLimits,
|
|
ProcessIoCounters,
|
|
ProcessVmCounters,
|
|
ProcessTimes,
|
|
ProcessBasePriority,
|
|
ProcessRaisePriority,
|
|
ProcessDebugPort,
|
|
ProcessExceptionPort,
|
|
ProcessAccessToken,
|
|
ProcessLdtInformation,
|
|
ProcessLdtSize,
|
|
ProcessDefaultHardErrorMode,
|
|
ProcessIoPortHandlers,
|
|
ProcessPooledUsageAndLimits,
|
|
ProcessWorkingSetWatch,
|
|
ProcessUserModeIOPL,
|
|
ProcessEnableAlignmentFaultFixup,
|
|
ProcessPriorityClass,
|
|
ProcessWx86Information,
|
|
ProcessHandleCount,
|
|
ProcessAffinityMask,
|
|
ProcessPriorityBoost,
|
|
ProcessDeviceMap,
|
|
ProcessSessionInformation,
|
|
ProcessForegroundInformation,
|
|
ProcessWow64Information,
|
|
ProcessImageFileName,
|
|
ProcessLUIDDeviceMapsEnabled,
|
|
ProcessBreakOnTermination,
|
|
ProcessDebugObjectHandle,
|
|
ProcessDebugFlags,
|
|
ProcessHandleTracing,
|
|
ProcessIoPriority,
|
|
ProcessExecuteFlags,
|
|
ProcessResourceManagement,
|
|
ProcessCookie,
|
|
ProcessImageInformation,
|
|
ProcessCycleTime,
|
|
ProcessPagePriority,
|
|
ProcessInstrumentationCallback,
|
|
ProcessThreadStackAllocation,
|
|
ProcessWorkingSetWatchEx,
|
|
ProcessImageFileNameWin32,
|
|
ProcessImageFileMapping,
|
|
ProcessAffinityUpdateMode,
|
|
ProcessMemoryAllocationMode,
|
|
MaxProcessInfoClass
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public class DEV_BROADCAST_DEVICEINTERFACE
|
|
{
|
|
internal Int32 dbcc_size;
|
|
internal Int32 dbcc_devicetype;
|
|
internal Int32 dbcc_reserved;
|
|
internal Guid dbcc_classguid;
|
|
internal Int16 dbcc_name;
|
|
}
|
|
|
|
public const Int32 DBT_DEVTYP_DEVICEINTERFACE = 0x0005;
|
|
|
|
public const Int32 DEVICE_NOTIFY_WINDOW_HANDLE = 0x0000;
|
|
public const Int32 DEVICE_NOTIFY_SERVICE_HANDLE = 0x0001;
|
|
public const Int32 DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 0x0004;
|
|
|
|
public const Int32 WM_CREATE = 0x0001;
|
|
public const Int32 WM_DEVICECHANGE = 0x0219;
|
|
|
|
public const Int32 DIGCF_PRESENT = 0x0002;
|
|
public const Int32 DIGCF_DEVICEINTERFACE = 0x0010;
|
|
|
|
[DllImport("ntdll.dll", SetLastError = true)]
|
|
public static extern int NtSetInformationProcess(IntPtr processHandle,
|
|
PROCESS_INFORMATION_CLASS processInformationClass, ref IntPtr processInformation, uint processInformationLength);
|
|
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
|
protected static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr NotificationFilter, Int32 Flags);
|
|
|
|
[DllImport("user32.dll", SetLastError = true)]
|
|
protected static extern Boolean UnregisterDeviceNotification(IntPtr Handle);
|
|
|
|
public static Boolean RegisterNotify(IntPtr Form, Guid Class, ref IntPtr Handle, Boolean Window = true)
|
|
{
|
|
IntPtr devBroadcastDeviceInterfaceBuffer = IntPtr.Zero;
|
|
|
|
try
|
|
{
|
|
DEV_BROADCAST_DEVICEINTERFACE devBroadcastDeviceInterface = new DEV_BROADCAST_DEVICEINTERFACE();
|
|
Int32 Size = Marshal.SizeOf(devBroadcastDeviceInterface);
|
|
|
|
devBroadcastDeviceInterface.dbcc_size = Size;
|
|
devBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
|
|
devBroadcastDeviceInterface.dbcc_reserved = 0;
|
|
devBroadcastDeviceInterface.dbcc_classguid = Class;
|
|
|
|
devBroadcastDeviceInterfaceBuffer = Marshal.AllocHGlobal(Size);
|
|
Marshal.StructureToPtr(devBroadcastDeviceInterface, devBroadcastDeviceInterfaceBuffer, true);
|
|
|
|
Handle = RegisterDeviceNotification(Form, devBroadcastDeviceInterfaceBuffer, Window ? DEVICE_NOTIFY_WINDOW_HANDLE : DEVICE_NOTIFY_SERVICE_HANDLE);
|
|
|
|
Marshal.PtrToStructure(devBroadcastDeviceInterfaceBuffer, devBroadcastDeviceInterface);
|
|
|
|
return Handle != IntPtr.Zero;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message);
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
if (devBroadcastDeviceInterfaceBuffer != IntPtr.Zero)
|
|
{
|
|
Marshal.FreeHGlobal(devBroadcastDeviceInterfaceBuffer);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static Boolean UnregisterNotify(IntPtr Handle)
|
|
{
|
|
try
|
|
{
|
|
return UnregisterDeviceNotification(Handle);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("{0} {1}", ex.HelpLink, ex.Message);
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
}
|