![]() |
IOCTL_DISK_GET_DRIVE_LAYOUT will nicht!?
Hallo,
ich versuche mich ja nun schon eine Weile an deviceIOcontrol. Nch viel hin und her funktioniert nun auch neiniges. Aber IOCTL_DISK_GET_DRIVE_LAYOUT will nicht. Kann mir jemand helfen:
Delphi-Quellcode:
Ohne "GENERIC_WRITE or GENERIC_READ" in CreateFile kommt
var
i : Integer; Device : string; hDevice : Cardinal; dummy : DWORD; bigBuf : DWord; r : DRIVE_LAYOUT_INFORMATION; begin hDevice := CreateFile(PChar('\\.\PHYSICALDRIVE0'), GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if hDevice <> INVALID_HANDLE_VALUE then begin bigbuf:=sizeof(DRIVE_LAYOUT_INFORMATION) + 15 * sizeof(PARTITION_INFORMATION); if not DeviceIOControl(hDevice, IOCTL_DISK_GET_DRIVE_LAYOUT, nil, 0, @r, bigbuf, dummy, nil) then begin showmessage(SysErrorMessage( GetLastError )+' '+inttostr(getlasterror)); end end; CloseHandle(hDevice); end; Nr. 5: Zugriff verweigert. Mit kommt: Nr. 122: Der an einen Systemaufruf übergebene Bereich ist zu klein. Ich habe bigbuf natürlich vergrößert. Ab einer gewissen Größe kommt das CPU-Fenster, davor der gleiche Fehler. Was mache ich falsch? Gruß Mattze |
Re: IOCTL_DISK_GET_DRIVE_LAYOUT will nicht!?
Dein Puffer ist zu klein.
Effektiv sind ja in der Variablen "r" nur sizeof(DRIVE_LAYOUT_INFORMATION) Bytes vorhanden. Behauptet wird aber, dass sizeof(DRIVE_LAYOUT_INFORMATION) + 15 * sizeof(PARTITION_INFORMATION) vorhanden wären. Folge -> der Heap wird überschrieben -> AV |
Re: IOCTL_DISK_GET_DRIVE_LAYOUT will nicht!?
Ich hab's raus!
Einerseits ist das natürlich richtig, dass ich zwar den bigbuf gesetzt habe, aber nicht genügend Platz für r reservierte. Kein Problem! Zum anderen die Frage, wie viel Speicher man reservieren muss. Da habe ich bei Microsoft etwas überlesen! Für jede Partition werden 4 Einträge in der Partitionstabelle angelegt!!! Bei 6 Partitions gibt es also 24 Einträge!!! Interessant ist in diesem Zusammenhang, dass die "Leereinträge" teilweise auch ausgefüllt sind. So steht da z. B. ein Partitiontyp drin. Der hat evtl. (???) sogar eine Bedeutung für die "echte" Partition, die davor als erstes in der Tabelle steht. Ein Beispiel bei mir: Physicaldisk0 hat 6 Partitionen. Die erste ist C:, bootbar usw. Der Partitionstyp im "echten" Eintrag ist 7 - Partition IFS. Im darauffolgenden Leereintrag ist er 15? Die nächsten Partitionen haben alle ebenfalls den "echten" Eintrag 7 und den nächsten Eintrag 5 (Extended Partition). Wenn ich wüsste, was 15 ist? Aber der Unterschied ist klar! Das kann alles stimmen! Gruß Mattze |
Re: IOCTL_DISK_GET_DRIVE_LAYOUT will nicht!?
Zitat:
Ich habe mich die Tage auch mit IOCTL_DISK_GET_DRIVE_LAYOUT befaßt .. 15 = extended partition Alle folgenden Einträge sind also logische Laufwerke innerhalb der erweiterten Partition. Aber .. auf meiner HD ist da LINUX drin. Kennt jemand eine gute Dokumentation der Partitionseinträge in extended partitions ? Beste Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz