Tja
Ehrlich gesagt, bin ich mir beim Titel nicht so sicher. Es geht sich strenggenommen um folgendes:
Ich schreibe eine Anwendung, die Festplatteninformationen auslesen soll. Ich habe mir dazu Luckies HDDInfo.pas angesehen, und habe festgestellt, dass er es sich recht einfach gemacht hat:
Delphi-Quellcode:
procedure THDDInfo.GetHDDsCount;
var
i : Integer;
Device : string;
hDevice : Cardinal;
begin
for i := 0 to 9 do
begin
Device := '\\.\PhysicalDrive' + IntToStr(i);
hDevice := CreateFile(pointer(Device), 0, FILE_SHARE_READ or
FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if hDevice <> INVALID_HANDLE_VALUE then
Inc(FHDDsCount);
end;
end;
So wird die Anzahl der Festplatten ermittelt. Und die DiskGeometry wird so ermittelt:
Delphi-Quellcode:
procedure THDDInfo.GetDiskGeometry;
var
i : Integer;
Device : string;
hDevice : Cardinal;
dg : DISK_GEOMETRY;
dummy : DWORD;
begin
setlength(FCylinders, FHDDsCount);
setlength(FTracksPercylinder, FHDDsCount);
setlength(FSectorsPerTrack, FHDDsCount);
setlength(FBytesPerSector, FHDDsCount);
for i := 0 to FHDDsCount - 1 do
begin
Device := '\\.\PhysicalDrive' + IntToStr(i);
hDevice := CreateFile(pointer(Device), 0, FILE_SHARE_READ
or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hDevice <> INVALID_HANDLE_VALUE then
begin
if DeviceIOControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0, @dg,
sizeof(dg), dummy, nil) = true then
begin
FCylinders[i] := dg.Cylinders.QuadPart;
FTracksPerCylinder[i] := dg.TracksPerCylinder;
FSectorsPerTrack[i] := dg.SectorsPerTrack;
FBytesPerSector[i] := dg.BytesPerSector;
end
else
begin
FCylinders[i] := 0;
FTracksPerCylinder[i] := 0;
FSectorsPerTrack[i] := 0;
FBytesPerSector[i] := 0;
end;
end;
CloseHandle(hDevice);
end;
end;
Daraus schließe ich, dass es sich bei "PhysicalDriveX" immer um "FixedMedia" handeln muss. Stimmt das? Wenn nicht, dann hat Luckies Code
imho diesen Denkfehler drin...