Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }