AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

Ein Thema von Alter Mann · begonnen am 7. Sep 2010 · letzter Beitrag vom 8. Sep 2010
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
949 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

  Alt 8. Sep 2010, 10:17
Moin, Moin

so die letzten Änderungen sind eingeflossen und im ersten Beitrag hinterlegt.
Den geneigten Leser sei ans Herz gelegt nicht alles was hier bisher geschrieben
wurde ist mit Substanz hinterlegt. So wurden Änderungen vorgeschlagen
ohne sie selbst vorher zu prüfen (sprich durch den Compiler zu jagen) bzw.
und das ist meine Schuld, der Code im Anhang benutzt zu haben ohne auf die Änderungen im
abgebildeten Code einzugehen. Ein Vergleich der entsprechenden Fehler-Stellen hätte gereicht.

Einige Sachen wurden mit Absicht nicht übernommen, so ist zum Beispiel:
Delphi-Quellcode:

function GetDeviceNumber(const aPhysicalDrive : Byte;
                         var aDynDeviceRec : TDynDeviceRec) : Boolean; overload;
var
  pVolume : PChar;
  dwSize : DWORD;
  hVolume : THandle;
  DG : DISK_GEOMETRY;
  pDLI : PDRIVE_LAYOUT_INFORMATION;
  lpBytesReturned : DWORD;
  I, piCount,
  dliSize : Integer;
begin
  Result := false;
  dwSize := Length(Format('\\.\PHYSICALDRIVE%d', [aPhysicalDrive])) + 1;
  pVolume := StrAlloc(dwSize);
  try
    StrPCopy(pVolume, Format('\\.\PHYSICALDRIVE%d', [aPhysicalDrive]));
    hVolume := CreateFile(pVolume,
drin geblieben, auch wenn himitsu anderer Meinung ist. Eine Verkürzung auf:
Delphi-Quellcode:

function GetDeviceNumber(const aPhysicalDrive : Byte;
                         var aDynDeviceRec : TDynDeviceRec) : Boolean; overload;
var
  hVolume : THandle;
  DG : DISK_GEOMETRY;
  pDLI : PDRIVE_LAYOUT_INFORMATION;
  lpBytesReturned : DWORD;
  I, piCount,
  dliSize : Integer;
begin
  Result := false;
  try
    hVolume := CreateFile(PChar(Format('\\.\PHYSICALDRIVE%d', [aPhysicalDrive]),
brachte irgendwelche Pseudobezeichnungen und falsche Rückgabewerte.

Meinen Dank an allen die geholfen haben, dass das Beispiel unter D7 genauso läuft wie unter D2009.

Alter Mann
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#2

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

  Alt 8. Sep 2010, 11:37
himitsus Weg ist an sich schon der richtige.
Alter Mann, du gehst den C Weg und allokierst Speicher für Strings, was in Delphi ja garnicht notwendig ist. Man arbeitet solange mit dem Typ String bis eine WinAPI ein PWideChar will und konvertiert ihn dann dahin.

Ich hatte auch schon einige Probleme mit der Formatfunktion, wenn man den Wert direkt in PWideChar wandelt. Deshalb sollte man den Rückgabewert in eine Stringvariable speichern und diese dann an die WinAPI übergeben.

StrAlloc ist übrigens aus Kompatibilitätsgründen vorhanden und sollte nicht mehr verwendet werden.

JwaWindows und Windows sollte man nicht gleichzeitig verwenden, da die Typen nicht kompatibel/austauschbar für Delphi sind.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.542 Beiträge
 
Delphi 12 Athens
 
#3

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

  Alt 8. Sep 2010, 11:50
Was sind denn diese "irgendwelche Pseudobezeichnungen" gewesen?


Solange der Wert, welcher nach PChar konvertiert wurde, nur innerhalb der aufrufenden Funktion genutzt wird (bei CreateFile ist das der Fall), sollte es eigentlich keine Probleme geben.

Delphi legt für das Result von Format automatisch eine temporäre Variable an und konvertiert erst danach nach PChar.
Diese temporäre Variable wird erst nach dem Aufruf dieser Funktion freigegeben (am Ende der Procedur/Funktion in welcher dieses genutzt wurde) oder zwecks Optimierung wiederverwendet (z.B. innerhalb von Schleifen).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#4

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

  Alt 8. Sep 2010, 12:04
Sollte man denken, aber Erfahrung sitzt tiefer.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.542 Beiträge
 
Delphi 12 Athens
 
#5

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

  Alt 8. Sep 2010, 12:06
Sollte man denken, aber Erfahrung sitzt tiefer.
Meine Erfahrung war, daß ich bisher mit Format+PChar noch keine Probleme hatte.
Nja, vielleicht habt ihr einen der extrem selten Delphi-Bugs gefunden.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#6

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

  Alt 8. Sep 2010, 12:25
Wäre nicht das erste Mal.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
444 Beiträge
 
Delphi 12 Athens
 
#7

AW: IOCTL_STORAGE_GET_DEVICE_NUMBER, DRIVE_GEOMETRY und DRIVE_LAYOUT

  Alt 8. Sep 2010, 14:44
Ich wollte heute mal die überarbeitete Version ausprobieren.

Das Auslesen logischer Laufwerke funktioniert problemlos. Das Auslesen physikalischer Laufwerke liefert eine Exception:

Im Projekt DI.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00464663 in Modul 'DI.exe'. Lesen von Adresse 00000000' aufgetreten.

Das ganze geschieht in der Datei uDevice.pas in Zeile 367. Falls ich hier was testen soll, bitte um Mitteilung genauerer Daten.
Devid
Devid Espenschied
Pre-Sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 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