Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Получение номера физического диска по логическому


Автор: Evghenii 30.3.2007, 10:03
Здравствуйте! Не получается получить номер физического диска по логическому, используя 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. 

Автор: Evghenii 30.3.2007, 17:37
Ну хоть какие-то соображения...

Автор: Evghenii 30.3.2007, 18:03
Всё. Проблема решена. Она заключалась в том, что я неправильно объявил запись.
Код

type
  TDiskExtent = record
    DiskNumber: DWORD;
    StartingOffset: LARGE_INTEGER;
    ExtentLength: LARGE_INTEGER;
  end;
  PDiskExtent = ^TDiskExtent;
type
  TVolumeDiskExtents = record
    NumberOfDiskExtents: DWORD;
    Extents: array[0..1] of TDiskExtent;
  end;
  PVolumeDiskExtents = ^TVolumeDiskExtents;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)