Конференция "WinAPI" » знать PhysicalDrive по имени диска
 
  • igen (07.10.15 14:52) [20]
    Можно через WMI класс Win32_LogicalDiskToPartition (без прав админа!), работает даже на XP, хотя MSDN говорит, что провайдер WMI_Storage для Windows XP не реализован.
    Класс выдаёт инфу в таком виде:

    Antecedent                                                             Dependent                                         EndingAddress  StartingAddress
    \\ST4\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"  \\ST4\root\cimv2:Win32_LogicalDisk.DeviceID="C:"  86754983935    105906176
    \\ST4\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #2"  \\ST4\root\cimv2:Win32_LogicalDisk.DeviceID="D:"  250058113023   86754983936
    \\ST4\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"  \\ST4\root\cimv2:Win32_LogicalDisk.DeviceID="V:"  80025223167    1048576


    Если пугают дебри WMI можно воспользоваться утилитой для генерации WMI кода https://github.com/RRUZ/wmi-delphi-code-creator или просто распарсить командную строку, введя команду wmic.exe (первый запуск на компе может занимать около минуты), затем
    path Win32_LogicalDiskToPartition

  • DayGaykin © (18.10.15 17:23) [21]
    Я делал так:
    1. GetVolumePathName. Получаем точку монтирования по пути.
    2. GetVolumeNameForVolumeMountPoint. Получаем имя раздела.
    3. GetPhysicalDisk. Получаем номер физического диска.

    Права админа не требовались.


    function FindFirstVolume(lpszVolumeName: PChar; cchBufferLength: DWORD): THandle; stdcall external Kernel32 name 'FindFirstVolumeA';
    function FindNextVolume(hFindVolume:THandle; lpszVolumeName: PChar; cchBufferLength: DWORD): BOOL; stdcall external Kernel32 name 'FindNextVolumeA';
    function FindVolumeClose(hFindVolume:THandle): BOOL; stdcall external Kernel32 name 'FindVolumeClose';
    function FindFirstVolumeMountPoint(lpszRootPathName, lpszVolumeMountPoint: PChar; cchBufferLength: DWORD): THandle; stdcall external Kernel32 name 'FindFirstVolumeMountPointA';
    function FindNextVolumeMountPoint(hFindVolumeMountPoint:THandle; lpszVolumeMountPoint: PChar; cchBufferLength: DWORD): BOOL; stdcall external Kernel32 name 'FindNextVolumeMountPointA';
    function FindVolumeMountPointClose(hFindVolumeMountPoint:THandle): BOOL; stdcall external Kernel32 name 'FindVolumeMountPointClose';
    function GetVolumePathName(lpszFileName:LPCTSTR; lpszVolumePathName:LPTSTR; cchBufferLength:DWORD): BOOL; stdcall external Kernel32 name 'GetVolumePathNameA';
    function GetVolumePathNamesForVolumeName(lpszVolumeName: LPCTSTR;lpszVolumePathNames: LPTSTR;cchBufferLength: DWORD;lpcchReturnLength:PDWORD):BOOL; stdcall external Kernel32 name 'GetVolumePathNamesForVolumeNameA';
    function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint: LPCTSTR;lpszVolumeName: LPTSTR;cchBufferLength: DWORD): BOOL; stdcall external Kernel32 name 'GetVolumeNameForVolumeMountPointA';

    function GetPhysicalDisk(Partition: String): Integer;
    type
     _STORAGE_DEVICE_NUMBER = record
       DeviceType: ULONG;
       DeviceNumber: ULONG;
       PartitionNumber: ULONG;
     end;
    const
     IOCTL_STORAGE_GET_DEVICE_NUMBER = $2D1080;
    var
     F: THandle;
     Info: _STORAGE_DEVICE_NUMBER;
     Dummy: DWORD;
    begin
     F := CreateFile(PChar(ExcludeTrailingPathDelimiter(Partition)), 0, FILE_SHARE_DELETE or FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
     Win32Check(F <> INVALID_HANDLE_VALUE);
     try
       Win32Check(DeviceIoControl(F, IOCTL_STORAGE_GET_DEVICE_NUMBER, nil, 0, @Info, SizeOf(Info), Dummy, nil));
       Result := Info.DeviceNumber;
     finally
       CloseHandle(F);
     end;
    end;
  • brother © (18.10.15 20:52) [22]
    некрофилы) но возможно пригодится
 
Конференция "WinAPI" » знать PhysicalDrive по имени диска
Есть новые Нет новых   [118476   +38][b:0][p:0.001]