AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Bug beim auslesen der Physikalischen Festplatten
Thema durchsuchen
Ansicht
Themen-Optionen

Bug beim auslesen der Physikalischen Festplatten

Ein Thema von dbdeath74 · begonnen am 5. Jul 2006 · letzter Beitrag vom 14. Jul 2006
Antwort Antwort
dbdeath74

Registriert seit: 30. Aug 2005
53 Beiträge
 
#1

Bug beim auslesen der Physikalischen Festplatten

  Alt 5. Jul 2006, 17:23
Hallo zusammen,

ich hab mal wieder ein kleineres Problem
Ich verwende diesen Code von Luckie um die Physikalischen festplatten auszulesen

Delphi-Quellcode:
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;
Code hatte ich hier gefunden:
http://www.delphipraxis.net/viewtopi...3570&view=next

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
hDevice := CreateFile(pointer(Device), 0, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); wird für die Werte i = 0 und 1 von Device
Device := '\\.\PhysicalDrive'+IntToStr(i); ein valides Handle für ein und dieselbe Festplatte erzeugt.

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
  Mit Zitat antworten Zitat
dbdeath74

Registriert seit: 30. Aug 2005
53 Beiträge
 
#2

Re: Bug beim auslesen der Physikalischen Festplatten

  Alt 14. Jul 2006, 13:47
Keiner eine Idee ?
Ich selbst kann nicht nachvollziehen wieso ich bei nur einem Rechner zweimal das selbe Handle bekomme.

Gruß Oliver
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#3

Re: Bug beim auslesen der Physikalischen Festplatten

  Alt 14. Jul 2006, 14:08
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?
  Mit Zitat antworten Zitat
dbdeath74

Registriert seit: 30. Aug 2005
53 Beiträge
 
#4

Re: Bug beim auslesen der Physikalischen Festplatten

  Alt 14. Jul 2006, 16:16
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Bug beim auslesen der Physikalischen Festplatten

  Alt 14. Jul 2006, 18:02
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:
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;
oder
Delphi-Quellcode:
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;
Eventuell ist in dem Rechner auch ein RAID-System, dann gibt's ja auch mehr physikalische Platten, als Logische,
oder nicht alles ist gemountet,
oder ...?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:27 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