Vor vielen Jahren hab ich mal etwas ähnliches gesucht und daraus diese Funktion(en) gebastelt:
Delphi-Quellcode:
function GetLD(Drive: Char): Cardinal;
var
Buffer : String;
begin
Buffer := Format('\\.\%s:',[Drive]);
Result := CreateFile(PChar(Buffer),
GENERIC_READ OR GENERIC_WRITE,
FILE_SHARE_READ OR FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
If Result = INVALID_HANDLE_VALUE Then
begin
Result := CreateFile(PChar(Buffer),
GENERIC_READ,
FILE_SHARE_READ OR FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
end;
end;
function GetPhysicalDiskNumber(Drive: Char): shortint;
var
LD : DWORD;
DiskExtents : PVolumeDiskExtents;
DiskExtent : TDiskExtent;
BytesReturned : Cardinal;
begin
Result := -1;
LD := GetLD(Drive);
If LD = INVALID_HANDLE_VALUE Then Exit;
Try
DiskExtents := AllocMem(Max_Path);
DeviceIOControl(LD,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
nil,
0,
DiskExtents,
MAX_PATH,
BytesReturned,
nil);
If DiskExtents^.NumberOfDiskExtents > 0 Then
begin
DiskExtent := DiskExtents^.Extents[0];
Result := DiskExtent.DiskNumber;
end;
Finally
CloseHandle(LD);
end;
end;
Ich sehe gerade, dass da wahrscheinlich ein schickes Speicherleck drin ist, und auch sonst ist der Code eher suboptimal - naja, ist eben alter Code (und wahrscheinlich weniger schlimm als der Code von jemand anders, den ich seit vorgestern in den Fingern habe).
MfG Dalai