![]() |
Bug beim auslesen der Physikalischen Festplatten
Hallo zusammen,
ich hab mal wieder ein kleineres Problem :) Ich verwende diesen Code von Luckie um die Physikalischen festplatten auszulesen
Delphi-Quellcode:
Code hatte ich hier gefunden:
uses JwaWinIoctl;
// Procedure liest von jeder physikalischen Platte die Zylinder, Sektoren usw. aus // und erechnet daraus die Größe procedure TFrmHIS.FestplatteAuslesen(); var i : Integer; Device : String; dg : DISK_GEOMETRY; hDevice : Cardinal; dummy : DWORD; size : int64; begin for i := 0 to 9 do begin hDevice := null; 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 DeviceIOControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0, @dg, sizeof(dg), dummy, nil); size := dg.Cylinders.QuadPart*dg.TracksPerCylinder*dg.SectorsPerTrack*dg.BytesPerSector; MemHD.Lines.Add('HD'+inttostr(i)+': '+chr(9)+IntToStr(Round(size/ 1048576))); end; end; end; ![]() Mein Programm wird per NetInstall automatisch ausgeführt, sammelt Hardware und NetzwerkInfos, zeigt diese an und schreibt diese in eine Datenbank. Funktioniert eigentlich auch einwandfrei. Habe die Anwendung gerade im Testbetrieb bei 30 Leuten, geht eigentlich überall, nur bei 2 Leuten wird die einzige pyhsikalische Festplatte die sie haben 2mal ausgelesen. Ich kann leider nicht nachvollziehen warum :( Die Physikalische Festplatte der Problemfälle steht nur einmal im Gerätemanager, jeweils als HD0. Durch Debugmeldungen die ich mir habe ausgeben lassen komme ich zu folgendem Schluss: bei
Delphi-Quellcode:
wird für die Werte i = 0 und 1 von Device
hDevice := CreateFile(pointer(Device), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
Delphi-Quellcode:
ein valides Handle für ein und dieselbe Festplatte erzeugt.
Device := '\\.\PhysicalDrive'+IntToStr(i);
Nur weiter komme ich nicht :( Für mich nicht nachvollziehbar wieso das nur bei 2/30 Fällen passiert und sonst einwandfrei. Hat vielleicht jemand eine Idee wie ich dem Fehlerteufel auf die Schliche kommen könnte? Vielen Dank schonmal für eure Antworten. Gruß Oliver |
Re: Bug beim auslesen der Physikalischen Festplatten
Keiner eine Idee ? :(
Ich selbst kann nicht nachvollziehen wieso ich bei nur einem Rechner zweimal das selbe Handle bekomme. Gruß Oliver |
Re: Bug beim auslesen der Physikalischen Festplatten
Wie genau ist denn der Rechner, an dem dieser Fehler auftritt, aufgebaut? Stecken dort Geräte drinne, die einer Festplatte ähnlich sind? USB - Sticks, Diskettenlaufwerke?
|
Re: Bug beim auslesen der Physikalischen Festplatten
Nein keine USB Geräte oder ähnliches.
Nur floppy und CD Rom Davon abgesehn funktioniert mein Programm auch einwandfrei wenn USB Geräte angeschlossen sind. Ich bekomme Wechseldatenträger als Festplatten mit ihrer jeweiligen Größe angezeigt. Auch funktioniert es einwandfrei wenn ein Gerät mehrere Festplatten hat. Nur bei diesem einem Gerär kommt die eine Festplatte doppelt :( |
Re: Bug beim auslesen der Physikalischen Festplatten
Und du bist dir ganz sicher, daß es beide Male auf die selbe Platte zeigt?
du könntst ja als Erstes mal den Rückgabewert von DeviceIOControl mit auswerten.
Delphi-Quellcode:
oder
if hDevice <> INVALID_HANDLE_VALUE then
if DeviceIOControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0, @dg, sizeof(dg), dummy, nil) then begin size := dg.Cylinders.QuadPart*dg.TracksPerCylinder*dg.SectorsPerTrack*dg.BytesPerSector; MemHD.Lines.Add('HD'+inttostr(i)+': '+chr(9)+IntToStr(Round(size/ 1048576))); end;
Delphi-Quellcode:
Eventuell ist in dem Rechner auch ein RAID-System, dann gibt's ja auch mehr physikalische Platten, als Logische,
if (hDevice <> INVALID_HANDLE_VALUE)
and DeviceIOControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, nil, 0, @dg, sizeof(dg), dummy, nil) then begin size := dg.Cylinders.QuadPart*dg.TracksPerCylinder*dg.SectorsPerTrack*dg.BytesPerSector; MemHD.Lines.Add('HD'+inttostr(i)+': '+chr(9)+IntToStr(Round(size/ 1048576))); end; oder nicht alles ist gemountet, oder ...? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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