By the letter of the disk (volume), we determine the number of the disk in the system.
1 2 3 4 5 6 7 8 |
var volLetter: Char; driveIndex: Integer; begin volLetter:= 'C'; driveIndex:= getDeviceNumberByLetter(volLetter); ShowMessage(IntToStr(driveIndex)); end; |
Options
volLetter - drive letter without colon
Result
Disk number on success and (-1) on failure or if the disk does not exist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function getDeviceNumberByLetter(ALetter: Char): Integer; const IOCTL_STORAGE_GET_DEVICE_NUMBER = $2D1080; type TDeviceInfo = packed record DeviceType, DeviceNumber, PartitionNumber :dword end; var hDevice: THandle; BytesReturned: DWORD; DeviceInfo: TDeviceInfo; begin Result := -1; if not DirectoryExists(ALetter + ':\') then exit; hDevice := CreateFile(PChar('\\.\' + ALetter + ':'), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); Win32Check(hDevice <> INVALID_HANDLE_VALUE); try Win32Check(DeviceIoControl(hDevice, IOCTL_STORAGE_GET_DEVICE_NUMBER, nil, 0, @DeviceInfo, SizeOf(TDeviceInfo), BytesReturned, nil)); Result := DeviceInfo.DeviceNumber; finally CloseHandle(hDevice); end; end; |