Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IOCTL_DISK_GET_DRIVE_LAYOUT will nicht!? (https://www.delphipraxis.net/131806-ioctl_disk_get_drive_layout-will-nicht.html)

Mattze 31. Mär 2009 12:48


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:
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;
Ohne "GENERIC_WRITE or GENERIC_READ" in CreateFile kommt
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

shmia 31. Mär 2009 13:12

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

Mattze 31. Mär 2009 17:19

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

Petrus1 17. Mär 2010 14:32

Re: IOCTL_DISK_GET_DRIVE_LAYOUT will nicht!?
 
Zitat:

Zitat von Mattze
...
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? ...

Der Thread ist ja schon älter .. aber trotzdem.

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 05:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz