-
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]некрофилы) но возможно пригодится