Здравствуйте! Не получается получить номер физического диска по логическому, используя IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Структуры:
| Код | type TDiskExtent = packed record DiskNumber: DWORD; StartingOffset: LARGE_INTEGER; ExtentLength: LARGE_INTEGER; end; PDiskExtent = ^TDiskExtent;
type TVolumeDiskExtents = packed record NumberOfDiskExtents: DWORD; Extents: array[0..1] of TDiskExtent; end; PVolumeDiskExtents = ^TVolumeDiskExtents;
|
Сам код:
| Код | function GetVolumeInfo(DriveLatter: string): byte; var pDrvInfo: PVolumeDiskExtents; ret: DWORD; SizeDrvInfo: integer; res: Boolean; h: Thandle; begin Result := 255; ret := 0; if Length(DriveLatter) > 0 then try begin SizeDrvInfo := 1024; GetMem(pDrvInfo, SizeDrvInfo); ZeroMemory(pDrvInfo, SizeDrvInfo); h := CreateFile('\\.\C:', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if h <> INVALID_HANDLE_VALUE then res := DeviceIoControl(H, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, nil, 0, pDrvInfo, SizeDrvInfo, ret, nil) else raise Exception.Create('...'); if res then begin Result := pDrvInfo.Extents[0].DiskNumber; end else raise Exception.Create('...'); end; finally FreeMem(pDrvInfo, SizeDrvInfo); CloseHandle(h); end else raise Exception.Create('...'); end;
|
Так вот, у меня 2 винта. Том c:\ на PhysicalDrive1. Том e:\ на PhysicalDrive0. DiskNumber показывает всегда 0. |