Durchführen der Speichertreiberdatensatzverwaltung
Ab Windows 7 können Treiber Verwaltungsaktionen für das Dataset 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 Action-Member der DEVICE_DSM_INPUT-Struktur übergeben, die im Systempuffer einer IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES-Anforderung enthalten ist. Wenn die Aktion zusätzliche Parameter erfordert, folgt ein Parameterblock sofort der DEVICE_DSM_INPUT-Struktur, und ParameterBlockOffset gibt den Offset vom Anfang der DEVICE_DSM_INPUT-Struktur an, an der der Parameterblock beginnt. Datasetbereiche folgen ggf. unmittelbar dem Parameterblock, und DataSetRangesOffset gibt den Offset vom Anfang der DEVICE_DSM_INPUT Struktur an, an der die Bereiche beginnen. Die Systempufferstruktur ist im folgenden Diagramm dargestellt.
Wenn die Verwaltungsaktion eine Ausgabe zurückgibt, wird im OutputBuffer der IOCTL ein Zeiger auf eine DEVICE_DSM_OUTPUT-Struktur übergeben. Wenn die Aktion eine 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, an der der Parameterblock beginnt. Die Struktur des Ausgabepuffers ist im folgenden Diagramm dargestellt.
Prozessablauf einer DSM-Aktion
Der Prozessablauf einer DSM-Aktion wird unten beschrieben, wobei Sender der Aktionsanforderungsgeber und Handler die angeforderte Aktion verarbeitet. Beachten Sie, dass mehrere Handler im Stapel vorhanden sein können.
Der Absender initialisiert den DSM und sendet ihn wie folgt an den ersten Handler im Stapel:
- Ordnen 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 ordnen Sie dann Arbeitsspeicher für diesen Puffer zu.
- Rufen Sie DeviceDsmInitializeInput auf, um die DSM_DEVICE_INPUT-Struktur und, wenn 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(en) hinzuzufügen.
- Wenn der DSM über eine Ausgabe verfügt, rufen Sie DeviceDsmGetOutputLength auf, um die größe zu bestimmen, die für den Ausgabepuffer der Aktion erforderlich ist, und weisen Sie dann Arbeitsspeicher für diesen Puffer zu.
- Senden Sie eine IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES Anforderung, und übergeben Sie dabei die initialisierten Eingabedaten im Systempuffer der IOCTL zusammen mit dem zugeordneten Ausgabepuffer, falls vorhanden.
Der Handler behandelt die DSM-IOCTL-Anforderung auf eine von drei Arten:
- Verarbeiten Sie die Anforderung, und geben Sie ggf. mit der Ausgabe zurück.
- Verarbeiten Sie die Anforderung, und leiten Sie sie an den nächstniedreren Treiber im Stapel weiter.
- Leiten Sie die Anforderung an den nächst niedrigeren Treiber im Stapel weiter, ohne den DSM zu behandeln.
Hinweis
Unabhängig davon, ob der Treiber den DSM verarbeitet, kann er die Anforderung nur dann sicher weiterleiten , wenn DEVICE_DSM_ACTION wichtigstes Bit (DeviceDsmActionFlag_NonDestructive) festgelegt ist. Wenn DeviceDsmActionFlag_NonDestructivenicht festgelegt ist, sollte der Treiber stattdessen mit einem Fehler zurückgeben.
Wenn der Handler die DSM verarbeitet, führt er die folgenden Schritte aus:
- Überprüfen Sie die Eingabe, indem Sie DeviceDsmValidateInput aufrufen.
- Wenn die Eingabe gültig ist, extrahiert der Handler die Eingabe, um die Aktion abzurufen. Wenn die Aktion über einen Parameterblock verfügt, ruft der HandlerDeviceDsmParameterBlock auf, um den Parameterblock abzurufen. Wenn die Aktion Bereichsdaten enthält, ruft der 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 unter 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 der HandlerDeviceDsmValidateOutputLength auf, um den vom Absender bereitgestellten Ausgabepuffer zu überprüfen. Falls gültig, initialisiert der Handler den DEVICE_DSM_OUTPUT Teil des Ausgabepuffers durch Aufruf von DeviceDsmInitializeOutput und füllt den Ausgabeblock ggf. mit einer aktionsspezifischen Ausgabe auf. Der Handler schließt dann die IOCTL ab und gibt die IOCTL entweder zurück oder leitet sie an den nächsten Treiber im Stapel weiter.
Nachdem die DSM verarbeitet und an den Absender zurückgegeben wurde, überprüft der Absender die Ausgabe, falls vorhanden, durch Aufrufen von DeviceDsmValidateOutput. Wenn die Ausgabe gültig ist, extrahiert Sender den Ausgabeblock, falls vorhanden, durch Aufrufen von DeviceDsmOutputBlock.
Ausführliche Informationen zu jeder spezifischen DSM-Aktion finden Sie unter Beschreibungen der Geräte-DSM-Aktion.