ftp://ftp.heise.de/pub/ct/listings/0316-208.zipUnd tschüss per Batch
Ich sichere abends per Batch-Datei (Backup per Knopfdruck, c't 8/03, S. 160) meine Daten auf einen USB-Stick. Das klappt prima, es stört mich nur, dass das Skript den Speicherstöpsel nicht automatisch abmelden kann. Ich könnte sonst den Stick nach getaner Arbeit einfach abziehen.
Das hat uns ebenso gestört. Deshalb haben wir das Tool "DevEject" geschrieben (Geordneter Rückzug, c't 16/03, S. 208). Es kann etwa anhand des Laufwerkbuchstabens oder der USB-Klassenbezeichnung Geräte aus Batch-Dateien heraus abmelden.
Haben Sie Ihrem USB-Stick beispielsweise den Buchstaben B zugewiesen, melden Sie ihn mit
DevEject -EjectDrive:B
ab. Um alle USB-Massenspeicher abzumelden, genügt
DevEject "-EjectName:USB Mass Storage Device"
Fügen Sie den Dev-Eject-Befehl am Ende Ihrer Batch-Datei ein. (adb)
Soft-Link 0325206
---------------
Und originalartikel:
Matthias Withopf
Geordneter Rückzug
Geräte unter Windows automatisch abmelden
Windows erkennt externe Speichermedien wie FireWire-Platten oder USB-Sticks beim Anstecken automatisch. Aber vor dem Abstöpseln sollte man dem Betriebssystem tunlichst Bescheid sagen, sonst droht Datenverlust. Ein kleines Programm automatisiert diesen Vorgang.
USB-Stick rein, Backup der Arbeitsdaten drauf und ab nach Hause - wer dieses Feierabend-Szenario automatisieren möchte, schreibt sich eine Batchdatei, die alles Wichtige auf den Stick kopiert und vielleicht zur Sicherheit noch ein Verify durchführt. Schließlich sollte sie den Stick noch beim Betriebssystem abmelden, insbesondere, wenn für verbesserte Leistung der Schreibcache aktiviert ist. Denn sonst könnte es passieren, dass der Anwender den Stick versehentlich abzieht, bevor alle Daten aus dem Cache weggeschrieben sind, und Datenverlust oder sogar ein zerstörtes Dateisystem wäre die Folge. Mit Bordmitteln kann man immerhin den Dialog "Hardware sicher entfernen" aus einer Batchdatei öffnen:
control hotplug.dll
Dann muss der Anwender aber immer noch das zu entfernende Gerät auswählen und "Beenden", "Ok" und "Schließen" klicken - Mausklicks, die Sie sich auch sparen können. Um das Abmelden von Geräten zu automatisieren, haben wir ein C++-Programm entwickelt, das samt Quelltext zum Download bereitsteht (siehe Soft-Link). Die Lösung ist geeignet für Windows 2000, XP und Server 2003 und lässt sich leicht in eigene Projekte integrieren.
USB-Sticks besser nicht einfach abziehen, sonst droht Datenverlust.
Für das Abmelden ist die Funktion CM_Request_Device_Eject() aus der Standard-Windows-Bibliothek "setupapi.dll" zuständig. Die zugehörige Include-Datei für den "PnP Configuration Manager" ist nicht im Lieferumfang der Windows-Compiler oder im "Platform SDK" enthalten, sondern nur im "Device Driver Development Kit" (DDK) für Windows-Treiberentwickler, erhältlich im Rahmen des MSDN-Abonnements. Alternativ kann man es unter
http://www.microsoft.com/whdc/ddk/ordernetddkcd.mspx bestellen. Immerhin stellt Microsoft die DDK-Dokumentation online bereit, die Erläuterung zu obiger Funktion unter [1].
Das C++-Beispielprogramm DevEject enthält die Klasse TDeviceEject und zum Abmelden die Methode Eject(). Um die Abhängigkeit von den DDK-Include-Dateien zu vermeiden, definiert es alles Notwendige selbst. Da unter Windows 9x die benötigte Funktion nicht vorhanden ist, lädt das Programm die DLL erst zur Laufzeit der Klasse und gibt bei unpassendem Betriebssystem immerhin noch eine sinnvolle Fehlermeldung aus. Bei statischem Binden würde das Betriebssystem das Programm gar nicht erst starten.
Auswerfhilfe
DevEject erwartet als Aufrufparameter die Kennung eines oder mehrerer abzumeldender Geräte. Ohne Parameter gibt es eine Liste aller zum Abmelden geeigneten Devices aus. Auch Monitore werden übrigens als auswerfbare Geräte angezeigt, aber keine Angst: Bei unseren Versuchen, einen Bildschirm "auszuwerfen", ist noch kein Monitor vom Tisch gehüpft.
Ein kleiner Trick entlockt dem Gerätemanager zusätzliche Detailinformationen.
Mit dem Parameter "-v" listet DevEject auch die nicht auswerfbaren Geräte auf und rückt sie in einer Art Baumstruktur ein, vergleichbar mit dem Gerätemanager. Um ein Gerät zu identifizieren, vergibt Windows intern Kennungen (DeviceID), die es beispielsweise aus dem Gerätetyp und -hersteller (IDE\DISKMAXTOR...) oder aus PCI-Kennungen (PCI\VEN_8086&DEV_2531...) bildet. Diese DeviceIDs lassen sich ab Windows XP auch im Gerätemanager sichtbar machen, indem man zuvor eine Umgebungsvariable setzt:
set DEVMGR_SHOW_DETAILS=1
devmgmt.msc
Im so geöffneten Gerätemanager enthält das Dialogfeld "Eigenschaften" jedes Eintrags das zusätzliche Register-Steuerelement "Details", in dem verschiedene Kategorien in einem Dropdown-Listenfeld wählbar sind. Die zum Abmelden benötigte ist als "Geräteinstanzkennung" (englisch "Device Instance Id") aufgeführt.
Weitere interessante Kategorien sind beispielsweise unter "Funktionen" zu finden, wo CM_DEVCAP_REMOVABLE anzeigt, dass das Gerät auswerfbar ist. CM_DEVCAP_SURPRISEREMOVALOK bedeutet, dass es tolerabel ist, das Gerät einfach abzuziehen, ohne Datenverlust zu riskieren.
Um ein bestimmtes Gerät abzumelden, gibt man wahlweise seinen Namen, seine Kennung oder seinen Laufwerksbuchstaben an. Beispielsweise meldet
DevEject "-EjectName:USB Mass Storage Device"
alle USB-Massenspeicher ab. Wenn der Name Leerzeichen enthält, muss er wie gezeigt zusammen mit der Option -EjectName in doppelte Anführungszeichen eingeschlossen werden. Eine Kennung (DeviceID) gibt man mit -EjectId an, das Zeichen "*" ist als Wildcard erlaubt. So meldet etwa
DevEject -EjectId:SBP2*
alle FireWire-Geräte ab (CD/DVD und Festplatten).
Falls man den Laufwerksbuchstaben kennt, lässt sich ein Gerät darüber mit der Option "-EjectDrive:x" abmelden. Das klappt allerdings nicht mit allen Geräten, denn uns ist keine Funktion bekannt, die zu einem Laufwerksbuchstaben die zugehörige DeviceID ermittelt. Das Beispielprogramm versucht, die Definition aus der Registry zu lesen, was aber in einigen Fällen scheitert. Dann ist man zum Abmelden auf den Namen oder die Kennung des Geräts angewiesen. Da das Konzept der Laufwerksbuchstaben nur aus Gründen der Kompatibilität zu "alten" Anwendungen notwendig ist, kann es passieren, dass einem Gerät kein Laufwerksbuchstabe zugeordnet ist oder dass es in einem Verzeichnis des Dateisystems (Mount Point) eingehängt ist. Auch dann muss man auf den Namen oder die Kennung ausweichen.
Mit dem "PnP Configuration Manager" lassen sich noch viele weitere nützliche Dinge erledigen, beispielsweise das Trennen eines Notebooks von seiner Docking-Station (mit den Funktionen CM_Is_Dock_Station_Present und CM_Request_Eject_PC) oder das Abfragen von Geräteeinstellungen oder Problemcodes, wenn ein Gerät nicht ordnungsgemäß funktioniert. Diese Codes tauchen auch im Gerätemanager auf und sind im DDK in der Include-Datei "cfg.h" definiert, etwa CM_PROB_NOT_CONFIGURED für den Code 1. Eine Liste der Codes und nützliche Tipps zur Fehlerbehebung sind in Microsofts Knowledge Base im Artikel 245386 zu finden. (bo)
Literatur
[1] DDK-Dokumentation zur verwendeten Systemfunktion:
http://msdn.microsoft.com/library/e...gmgrfn_029e.asp Soft-Link 0316208
--------------------------------------------------------------------------------
Zu diesem Artikel existieren Programmbeispiele
0316_208.zip
0316_208.txt
im zip sind DevEject.exe und source .cpp
mfG
RZ