Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ab Windows 7 können Treiber Verwaltungsaktionen für die Daten eines Geräts ausführen. Die Liste der DsM-Aktionen (Data Set Management), die auf einem Speichergerät ausgeführt werden können, werden von Microsoft definiert.
Verwenden von IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
Eine DEVICE_DSM_ACTION Konstante gibt die Aktion an. Diese Konstante wird im Aktionselement der DEVICE_DSM_INPUT Struktur übergeben, die im Systempuffer einer IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES Anforderung enthalten ist. Wenn für die Aktion zusätzliche Parameter erforderlich sind, folgt ein Parameterblock sofort der DEVICE_DSM_INPUT Struktur, und ParameterBlockOffset gibt den Offset vom Anfang der DEVICE_DSM_INPUT Struktur an, mit der der Parameterblock gestartet wird. Gegebenenfalls folgen die Datensatzbereiche unmittelbar dem Parameterblock, und DataSetRangesOffset gibt den Offset vom Beginn der DEVICE_DSM_INPUT-Struktur an, wo die Bereiche starten. Die Systempufferstruktur wird im folgenden Diagramm dargestellt.
Wenn die Verwaltungsaktion die Ausgabe zurückgibt, wird ein Zeiger auf eine DEVICE_DSM_OUTPUT Struktur im OutputBuffer des IOCTL übergeben. Wenn die Aktion zusätzliche aktionsspezifische Ausgabe zurückgibt, folgt ein Ausgabeblock sofort der DEVICE_DSM_OUTPUT Struktur, und OutputBlockOffset gibt den Offset vom Anfang der DEVICE_DSM_OUTPUT Struktur an, mit der der Parameterblock gestartet wird. Die Ausgabepufferstruktur wird im folgenden Diagramm dargestellt.
Prozessablauf einer DSM-Aktion
Der Prozessfluss einer DSM-Aktion wird unten beschrieben, wobei Sender der Aktionsanforderunger und Handler die angeforderte Aktion verarbeitet. Beachten Sie, dass im Stapel mehrere Handler vorhanden sein können.
Der Absender initialisiert den DSM und sendet ihn an den ersten Handler im Stapel, indem er die folgenden Schritte ausführt:
- Weisen Sie eine DEVICE_DSM_DEFINITION Struktur mit der definition zu, die der Aktion zugeordnet ist, und initialisieren Sie sie.
- Rufen Sie DeviceDsmGetInputLength auf, um die größe zu bestimmen, die für den Eingabepuffer der Aktion erforderlich ist, und weisen Sie dann Speicher für diesen Puffer zu.
- Rufen Sie DeviceDsmInitializeInput auf, um die DSM_DEVICE_INPUT-Struktur zu initialisieren und, falls die Aktion Parameter enthält, den Parameterblock zu initialisieren. Das Parameterblockformat hängt von der Aktion ab. Weitere Informationen finden Sie unter DEVICE_DSM_ACTION Beschreibungen .
- Wenn die Aktion Bereiche aufweist, rufen Sie "DeviceDsmAddDataSetRange " für jeden Bereich auf, um dem Eingabepuffer DEVICE_DSM_RANGE Struktur(n) hinzuzufügen.
- Wenn der DSM über eine Ausgabe verfügt, rufen Sie DeviceDsmGetOutputLength auf, um die für den Ausgabepuffer der Aktion erforderliche Größe zu ermitteln, und weisen Sie dann Speicher für diesen Puffer zu.
- Senden Sie eine IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES Anforderung, und übergeben Sie ggf. die initialisierten Eingabedaten im Systempuffer des IOCTL zusammen mit dem zugewiesenen Ausgabepuffer.
Der Handler behandelt die DSM IOCTL-Anforderung auf eine von drei Arten:
- Bearbeiten Sie die Anfrage und geben Sie die Ausgabe zurück, falls vorhanden.
- Behandeln Sie die Anforderung, und leiten Sie sie an den nächsten unteren Treiber im Stapel weiter.
- Leiten Sie die Anforderung an den nächsten unteren Treiber im Stapel weiter, ohne den DSM zu verarbeiten.
Hinweis
Unabhängig davon, ob der Treiber den DSM verarbeitet, kann er die Anforderung nur dann sicher weiterleiten, wenn das höchstwertige Bit (DeviceDsmActionFlag_NonDestructive) in DEVICE_DSM_ACTION gesetzt ist. Wenn DeviceDsmActionFlag_NonDestructivenicht festgelegt ist, sollte der Treiber stattdessen einen Fehler zurückgeben.
Wenn der Handler den DSM verarbeitet, führt er die folgenden Schritte aus:
- Überprüfen Sie die Eingabe durch Aufrufen von DeviceDsmValidateInput.
- Wenn die Eingabe gültig ist, extrahiert Handler die Eingabe, um die Aktion abzurufen. Wenn die Aktion über einen Parameterblock verfügt, ruft HandlerDeviceDsmParameterBlock auf, um den Parameterblock abzurufen. Wenn die Aktion Bereichsdaten enthält, ruft HandlerDeviceDsmDataSetRanges auf, um einen Zeiger auf den Block von Datasetbereichen abzurufen, und führt dann die normale Verarbeitung für den Block aus. Dieser Block befindet sich in DataSetRangesOffset und besteht aus einem oder mehreren zusammenhängenden Einträgen, die als DEVICE_DSM_RANGE Strukturen formatiert sind. Die Länge der Datasetbereiche in Bytes wird im DataSetRangesLength-Element von DEVICE_DSM_INPUT festgelegt.
- Wenn die Aktion eine Ausgabe erfordert, ruft HandlerDeviceDsmValidateOutputLength auf, um den vom Absender bereitgestellten Ausgabepuffer zu überprüfen. Wenn gültig, initialisiert der Handler den DEVICE_DSM_OUTPUT Teil des Ausgabepuffers durch Aufrufen von DeviceDsmInitializeOutput und füllt den Ausgabeblock mit aktionsspezifischer Ausgabe auf, falls vorhanden. Der Handler schließt dann die IOCTL ab und gibt sie entweder zurück oder leitet sie an den nächsten Treiber im Stapel weiter.
Sobald der DSM verarbeitet und an den Absender zurückgegeben wird, überprüft der Absender die Ausgabe, falls vorhanden, durch Aufrufen von DeviceDsmValidateOutput. Wenn die Ausgabe gültig ist, extrahiert Sender ggf. den Ausgabeblock durch Aufrufen von DeviceDsmOutputBlock.
Ausführliche Informationen zu den einzelnen DSM-Aktionen finden Sie unter Geräte-DSM-Aktionsbeschreibungen.