static void CreateDeviceKey(string device_name, WindowsIdentity identity) { using (SafeFileHandle handle = OpenFile(@"\Device\DeviceApi\CMApi", FileAccessRights.Synchronize | FileAccessRights.GenericRead | FileAccessRights.GenericWrite, ShareMode.None, FileOpenOptions.NonDirectoryFile | FileOpenOptions.SynchronousIoNonAlert, false)) { CmApiOpenKeyData data = new CmApiOpenKeyData(0x111, 1, device_name, GenericAccessRights.MaximumAllowed, true, 0, Marshal.SizeOf(typeof(CmApiOpenKeyResult))); CmApiOpenKeyResult result = null; WindowsImpersonationContext ctx = null; if (identity != null) { ctx = identity.Impersonate(); } try { result = DeviceIoControl <CmApiOpenKeyResult>(handle, 0x47085B, data); } finally { if (ctx != null) { ctx.Undo(); } } StatusToNtException(result.status); } }
static RegistryKey CreateDeviceKey(string device_name) { using (SafeFileHandle handle = OpenFile(@"\Device\DeviceApi\CMApi", FileAccessRights.Synchronize | FileAccessRights.GenericRead | FileAccessRights.GenericWrite, ShareMode.None, FileOpenOptions.NonDirectoryFile | FileOpenOptions.SynchronousIoNonAlert, false)) { CmApiOpenKeyData data = new CmApiOpenKeyData(0x211, 1, device_name, GenericAccessRights.MaximumAllowed, true, 0, Marshal.SizeOf(typeof(CmApiOpenKeyResult))); CmApiOpenKeyResult result = DeviceIoControl <CmApiOpenKeyResult>(handle, 0x47085B, data); StatusToNtException(result.status); return(RegistryKey.FromHandle(new SafeRegistryHandle(new IntPtr(result.handle), true))); } }