Einzelnen Beitrag anzeigen

Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#1

Wechseldatenträger auswerfen

  Alt 20. Mai 2009, 13:14
Hallo,

stehe vor einem kleinen Problem und hoffe, dass ihr mir helfen könnt.
Und zwar geht es darum, einen Wechseldatenträger (hauptsächlich USB-Sticks) aus meinem eigenen Programm heraus sicher zu entfernen (also zunächst abzumelden, wie über das Tray-Icon "Hardware sicher entfernen"). Hab natürlich schon gesucht (in der DP und über Google) und mir auch schon was zusammengebastelt, was ansatzweise schon ganz gut funktioniert. Ich arbeite hierbei mit der Methode DeviceIoControl. Meine Vorgenhensweise ist dabei folgendermaßen:
  • Volume-Handle holen:

    Delphi-Quellcode:
    AccessFlags := GENERIC_READ or GENERIC_WRITE;
    //
    VolumeName := Format('\\.\%s:', [ADrive]);
    //
    Result := CreateFile(PChar(VolumeName), AccessFlags, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  • Wenn Volume-Handle gültig ist (und DriveType DRIVE_REMOVABLE):
    --> Volume sperren (DeviceIoControl mit zweitem Parameter FSCTL_LOCK_VOLUME)
  • --> Volume dismounten (DeviceIoControl mit zweitem Parameter FSCTL_DISMOUNT_VOLUME)
  • --> PreventMediaRemoval auf false setzen (DeviceIoControl mit zweitem Parameter IOCTL_STORAGE_MEDIA_REMOVAL)
  • --> Volume auswerfen (DeviceIoControl mit zweitem Parameter IOCTL_STORAGE_EJECT_MEDIA)
  • --> Volume-Handle mit CloseHandle-Funktion "schließen"

Teste ich meinen Quellcode mit einem USB-Stick, so scheint das ganze schon zu funktionieren. Die LED blinkt zunächst und geht dann irgendwann aus, wie es auch beim Standard-Abmelden mit dem Tray-Icon der Fall ist. Allerdings wird das Gerät anscheinend nicht vollständig abgemeldet. Das Laufwerk-Icon bleibt im Explorer erhalten und auch das Tray-Icon zum Abmelden verschwindet nicht. Ein Zugriff auf den Datenträger ist allerdings nicht mehr möglich (Nachricht "Bitte Datenträger in Laufwerk einlegen" oder ähnlich). Wenn ich über den Geräte-Manager von Windows nach geänderter Hardware suchen lassen, bleibt das Problem weiterhin bestehen. Muss ich Windows noch irgendetwas mitteilen oder habe ich in meinem Code einfach nur etwas vergessen?

Hoffe, ich hab mich verständlich ausgedrückt und mein Problem ist lösbar
Danke schonmal

Patti
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat