internal Native.STORAGE_DEVICE_NUMBER GetDeviceNumber(string devicePath) { IntPtr hFile = Native.CreateFile(devicePath.TrimEnd('\\'), 0, 0, IntPtr.Zero, Native.OPEN_EXISTING, 0, IntPtr.Zero); if (hFile.ToInt32() == Native.INVALID_HANDLE_VALUE) { throw new Win32Exception(Marshal.GetLastWin32Error()); } int bytesReturned; Native.STORAGE_DEVICE_NUMBER storageDeviceNumber = new Native.STORAGE_DEVICE_NUMBER(); int size = Marshal.SizeOf(storageDeviceNumber); IntPtr buffer = Marshal.AllocHGlobal(size); try { if (!Native.DeviceIoControl(hFile, Native.IOCTL_STORAGE_GET_DEVICE_NUMBER, IntPtr.Zero, 0, buffer, size, out bytesReturned, IntPtr.Zero)) { // do nothing here on purpose } } finally { Native.CloseHandle(hFile); } if (bytesReturned > 0) { storageDeviceNumber = (Native.STORAGE_DEVICE_NUMBER)Marshal.PtrToStructure(buffer, typeof(Native.STORAGE_DEVICE_NUMBER)); } Marshal.FreeHGlobal(buffer); return(storageDeviceNumber); }
private int GetDiskNumber() { // Find disks SafeFileHandle hFile = Native.CreateFile(Path, 0, Native.FILE_SHARE_READ | Native.FILE_SHARE_WRITE, IntPtr.Zero, Native.OPEN_EXISTING, 0, IntPtr.Zero); if (hFile.IsInvalid) { Exception ex = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()); Logger.Log(LogLevel.Error, ex); throw ex; } using (hFile) { Native.STORAGE_DEVICE_NUMBER diskNumber = GetDiskNumber(hFile); return(diskNumber.DeviceNumber); } }