TAPE_PROCESS_COMMAND_ROUTINE Rückruffunktion (minitape.h)

TAPE_PROCESS_COMMAND_ROUTINE behandelt die gerätespezifischen Aspekte einer IOCTL-Anforderung.

Syntax

TAPE_PROCESS_COMMAND_ROUTINE TapeProcessCommandRoutine;

TAPE_STATUS TapeProcessCommandRoutine(
  [in, out]      PVOID MinitapeExtension,
  [in, out]      PVOID CommandExtension,
  [in, out]      PVOID CommandParameters,
  [in, out]      PSCSI_REQUEST_BLOCK Srb,
  [in]           ULONG CallNumber,
  [in, optional] TAPE_STATUS StatusOfLastCommand,
  [in, out]      PULONG RetryFlags
)
{...}

Parameter

[in, out] MinitapeExtension

Zeiger auf die treiberspezifische Minibanderweiterung. Dies ist NULL , wenn der Miniklassentreiber bei der Initialisierung keine Minitape-Erweiterung anfordern hat.

[in, out] CommandExtension

Zeiger auf die Befehlserweiterung. Dies ist NULL , wenn der Miniklassentreiber bei der Initialisierung keine Befehlserweiterung anfordern hat.

[in, out] CommandParameters

Zeiger auf einen Vom Aufrufer zugeordneten Puffer, der eine TAPE_CREATE_PARTITION-Struktur enthält.

[in, out] Srb

Zeiger auf einen vom Bandklassentreiber zugewiesenen und teilweise ausgefüllten SRB. TAPE_PROCESS_COMMAND_ROUTINE müssen die CDB im SRB ausfüllen.

  • Cdb : Zeiger auf den SCSI-CDB für den Befehl. Löschen Sie den CDB mit TapeClassZeroMemory , bevor Sie ihn ausfüllen.
  • CdbLength : Gibt die Anzahl der Bytes im CDB an.
TAPE_PROCESS_COMMAND_ROUTINE können auch die folgenden Member im SRB ausfüllen:
  • DataBuffer : Zeiger auf den zu übertragenden Datenpuffer. Verwenden Sie TapeClassAllocateSrbBuffer , um einen DataBuffer mit einer Länge zuzuweisen, die größer oder gleich DataTransferLength ist.
  • DataTransferLength : Gibt die Anzahl der Bytes an, die im SRB übertragen werden sollen. Dieses Element wird von TapeClassAllocateSrbBuffer festgelegt.
  • TimeOutValue : Gibt einen Timeoutwert für diesen Befehl an, der den Standard-Timeoutwert der Geräteerweiterung des Bandklassentreibers überschreibt.
  • SrbFlags : Gibt ein Flag für diesen Befehl an. Der Bandminiklassentreiber muss SRB_FLAGS_DATA_OUT festlegen, wenn der SRB Daten an das Bandlaufwerk sendet. Dieser Member kann null sein, wenn der SRB Daten vom Bandlaufwerk anfordert oder wenn vom Befehl keine Daten übertragen werden.

[in] CallNumber

Gibt an, wie oft TAPE_PROCESS_COMMAND_ROUTINE aufgerufen wurde, um einen bestimmten Bandbefehl zu verarbeiten. CallNumber ist null, wenn diese Routine zum ersten Mal aufgerufen wird, und wird für jeden nachfolgenden Aufruf erhöht, bis der Miniklassentreiber einen TAPE_STATUS Wert zurückgibt, der angibt, dass der Befehl abgeschlossen ist.

[in, optional] StatusOfLastCommand

Gibt die status des letzten Befehls an. Beim ersten Aufruf von TAPE_PROCESS_COMMAND_ROUTINE zum Verarbeiten einer bestimmten Anforderung wird StatusOfLastCommand TAPE_STATUS_SUCCESS. Bei nachfolgenden Aufrufen ist StatusOfLastCommand entweder TAPE_STATUS_SUCCESS oder ein Fehler status, wenn ein Fehler aufgetreten ist und der Bandminiklassentreiber im vorherigen Aufruf RETURN_ERRORS in RetryFlags festgelegt hat.

[in, out] RetryFlags

Zeiger auf eine Variable, die angibt, welche Aktion der Bandklassentreiber ausführen soll, wenn ein Bandgerät einen Fehler meldet.

Das Wort mit niedriger Reihenfolge gibt die Anzahl der Wiederholungen an, die bei einem SCSI-Befehlsfehler ausgeführt werden sollen. Der Standardwert ist 0 (keine Wiederholungen).

Das Wort mit hoher Ordnung enthält Flags, die angeben, wie der Bandklassentreiber die Steuerung zurückgeben soll, wenn ein Fehler auftritt:

  • Wenn RETURN_ERRORS und IGNORE_ERRORS eindeutig sind (Standard), gibt der Bandklassentreiber einen Fehler status an den ursprünglichen Anforderer zurück.
  • Wenn der Miniklassentreiber RETURN_ERRORS festlegt, ruft der Bandklassentreiber TAPE_PROCESS_COMMAND_ROUTINE auf, wobei StatusOfLastCommand auf einen Fehler status festgelegt ist.
  • Wenn der Miniklassentreiber IGNORE_ERRORS festlegt, konvertiert der Bandklassentreiber einen Fehler status in Erfolg und ruft TAPE_PROCESS_COMMAND_ROUTINE auf, wobei StatusOfLastCommand auf erfolg festgelegt ist.

Rückgabewert

Rückgabecode Beschreibung
TAPE_STATUS_SEND_SRB_AND_CALLBACK
Gibt dem Bandklassentreiber an, dass der SRB ausgefüllt wurde und bereit ist, an das Zielgerät gesendet zu werden. Standardmäßig ruft der Bandklassentreiber TAPE_PROCESS_COMMAND_ROUTINE nur wieder auf, wenn der SRB erfolgreich ist. Ein Miniklassentreiber kann das Standardverhalten ändern, indem Er RetryFlags vor der Rückgabe von TAPE_PROCESS_COMMAND_ROUTINE festlegen.
TAPE_STATUS_CALLBACK
Weist den Bandklassentreiber an, CallNumber zu erhöhen und TAPE_PROCESS_COMMAND_ROUTINE erneut aufzurufen, ohne einen SRB an das Bandgerät zu senden.
TAPE_STATUS_CHECK_TEST_UNIT_READY
Weist den Bandklassentreiber an, einen SRB für den Befehl TEST UNIT READY auszufüllen und den SRB an das Gerät zu senden.
TAPE_STATUS_XXX
Jeder andere Rückgabecode gibt dem Bandklassentreiber an, dass der Befehl abgeschlossen ist, und gibt Erfolg, Fehler oder Warnung an. Mögliche Vervollständigungsrückgabewerte für diese Routine sind u. a.:
TAPE_STATUS_SUCCESS
TAPE_STATUS_INSUFFICIENT_RESOURCES
TAPE_STATUS_INVALID_DEVICE_REQUEST
TAPE_STATUS_INVALID_PARAMETER
TAPE_STATUS_IO_DEVICE_ERROR
TAPE_STATUS_MEDIA_WRITE_PROTECTED
TAPE_STATUS_NOT_IMPLEMENTED

Hinweise

Diesem Rückrufplatzhalter können die folgenden Funktionen zugewiesen werden:

CreatePartition

CreatePartition verarbeitet die gerätespezifischen Aspekte einer IOCTL_TAPE_CREATE_PARTITION Anforderung. Diese Routine ist erforderlich. CreatePartition erstellt eine Partition auf einem Band, indem der CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Das Erstellen einer Partition erfordert in der Regel eine Reihe von SRBs, um den Vorgang abzuschließen. Nachdem CreatePartition einen bestimmten SRB ausgefüllt und zurückgegeben hat, sendet der Bandklassentreiber den SRB an das Zielgerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlagsTapeMiniCreatePartition erneut auf.

CreatePartition muss die folgenden Member im SRB ausfüllen, bevor Sie zum Bandklassentreiber zurückkehren:

Wenn der Bandminiklassentreiber Partitionsinformationen in der Minitape-Erweiterung speichert, aktualisiert CreatePartition die Erweiterung, bevor sie mit TAPE_STATUS_SUCCESS zum Bandklassentreiber zurückkehren.

Löschen

Erase behandelt die gerätespezifischen Aspekte einer IOCTL_TAPE_ERASE Anforderung. Diese Routine ist erforderlich. Löschen löscht ein Band, indem das CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Für das Löschen eines Bandes ist in der Regel ein SRB erforderlich, um den Vorgang abzuschließen. Nachdem Erase den SRB ausgefüllt und zurückgibt, sendet der Bandklassentreiber den SRB an das Gerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlags erneut Erase auf. Erase gibt dann TAPE_STATUS_SUCCESS zurück.

GetDriveParameters

GetDriveParameters verarbeitet die gerätespezifischen Aspekte einer IOCTL_TAPE_GET_DRIVE_PARAMS Anforderung. Diese Routine ist erforderlich. GetDriveParameters ruft Bandlaufwerkparameter ab, indem der CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Das Abrufen von Laufwerksparametern erfordert in der Regel eine Reihe von SRBs, um den Vorgang abzuschließen. Nachdem GetDriveParameters einen bestimmten SRB ausgefüllt und zurückgibt, sendet der Bandklassentreiber den SRB an das Zielgerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlagsGetDriveParameters erneut auf.

GetMediaParameters

GetMediaParameters verarbeitet die gerätespezifischen Aspekte einer IOCTL_TAPE_GET_MEDIA_PARAMS-Anforderung . Diese Routine ist erforderlich. GetMediaParameters ruft Bandmedienparameter ab, indem der CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Das Abrufen von Medienparametern erfordert in der Regel mehrere SRB, um den Vorgang abzuschließen, beginnend mit einer Testeinheit, die vom Miniklassentreiber angefordert wird, indem TAPE_STATUS_CHECK_TEST_UNIT_READY zurückgegeben wird, wenn der Bandklassentreiber die Routine zum ersten Mal aufruft.

Nachdem GetMediaParameters einen bestimmten SRB ausgefüllt und zurückgegeben hat, sendet der Bandklassentreiber den SRB an das Gerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlags getMediaParameters erneut auf.

GetMediaTypes

GetMediaTypes verarbeitet die gerätespezifischen Aspekte einer IOCTL_STORAGE_GET_MEDIA_TYPES_EX Anforderung. Diese Routine ist erforderlich. GetMediaTypes ruft Informationen zu den Medientypen ab, die von einem Bandgerät unterstützt werden, indem der CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Das Abrufen von Medientypen erfordert in der Regel mehr als einen SRB, um den Vorgang abzuschließen, beginnend mit einer Testeinheit, die vom Miniklassentreiber angefordert wird, indem TAPE_STATUS_CHECK_TEST_UNIT_READY zurückgegeben wird, wenn der Bandklassentreiber die Routine zum ersten Mal aufruft.

Getposition

GetPosition verarbeitet die gerätespezifischen Aspekte einer IOCTL_TAPE_GET_POSITION Anforderung. Diese Routine ist erforderlich. GetPosition liest die Position eines Bandes durch Ausfüllen des CDB in einem SRB, der vom Bandklassentreiber übergeben wird. Zum Lesen der Bandposition ist in der Regel mehr als ein SRB erforderlich, um den Vorgang abzuschließen. Häufig beginnend mit einer Testeinheit, die vom Miniklassentreiber angefordert wird, indem TAPE_STATUS_CHECK_TEST_UNIT_READY zurückgegeben wird, wenn der Bandklassentreiber die Routine zum ersten Mal aufruft.

Getstatus

GetStatus behandelt die gerätespezifischen Aspekte einer IOCTL_TAPE_GET_STATUS-Anforderung . Diese Routine ist erforderlich. GetStatus liest die status eines Bandgeräts, in der Regel durch Anweisen des Bandklassentreibers, einen Bereitbefehl für die Testeinheit auszusetzen.

Wenn ein Gerät angibt, ob für ein Laufwerk eine bereinigungsfähige Daten erforderlich sind (im Gegensatz zur Meldung der Notwendigkeit einer Bereinigung als Fehler, die ein Miniklassentreiber in seiner TapeMiniTapeError-Routine behandeln würde), füllt GetStatus den CDB im SRB aus, der vom Bandklassentreiber übergeben wird, um die Sense-Daten zu erhalten, und gibt ggf. TAPE_STATUS_REQUIRES_CLEANING zurück.

Zubereiten

Die Vorbereitung behandelt die gerätespezifischen Aspekte einer IOCTL_TAPE_PREPARE-Anforderung . Diese Routine ist erforderlich. Vorbereiten bereitet ein Band vor, indem das CDB in einem SRB ausgefüllt wird, der vom Bandklassentreiber übergeben wird. Wenn das Gerät den angeforderten Vorgang unterstützt, erfordert die Vorbereitung eines Bandes in der Regel ein SRB. Nachdem Prepare den SRB ausgefüllt und zurückgegeben hat, sendet der Bandklassentreiber den SRB an das Gerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlagserneut Prepare auf.

SetDriveParameters

SetDriveParameters behandelt die gerätespezifischen Aspekte einer IOCTL_TAPE_SET_DRIVE_PARAMS-Anforderung . Diese Routine ist erforderlich. SetDriveParameters legt Parameter für ein Bandgerät fest, indem das CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Das Festlegen von Parametern umfasst in der Regel eine Reihe von SRBs, um den Vorgang abzuschließen. Nachdem SetDriveParameters einen bestimmten SRB ausgefüllt und zurückgegeben hat, sendet der Bandklassentreiber den SRB an das Gerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlagsSetDriveParameters erneut auf.

SetMediaParameters

SetMediaParameters behandelt die gerätespezifischen Aspekte einer IOCTL_TAPE_SET_MEDIA_PARAMS-Anforderung . Diese Routine ist erforderlich. SetMediaParameters legt die Blockgröße eines Bandes fest, indem das CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Das Festlegen der Blockgröße erfordert in der Regel mehr als einen SRB, um den Vorgang abzuschließen, beginnend mit einer Testeinheit, die vom Miniklassentreiber angefordert wird, indem TAPE_STATUS_CHECK_TEST_UNIT_READY zurückgegeben wird, wenn der Bandklassentreiber die Routine zum ersten Mal aufruft.

Nachdem SetMediaParameters einen bestimmten SRB ausgefüllt und zurückgegeben hat, sendet der Bandklassentreiber den SRB an das Gerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlagssetMediaParameters erneut auf .

SetPosition

SetPosition behandelt die gerätespezifischen Aspekte einer IOCTL_TAPE_SET_POSITION-Anforderung . Diese Routine ist erforderlich. SetPosition legt die Position eines Bandes fest, indem das CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Zum Festlegen der Position ist in der Regel ein SRB erforderlich. Nachdem SetPosition den SRB ausgefüllt und zurückgegeben hat, sendet der Bandklassentreiber den SRB an das Gerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlagsSetPosition erneut auf. SetPosition gibt dann TAPE_STATUS_SUCCESS zurück.

WriteMarks

WriteMarks behandelt die gerätespezifischen Aspekte einer IOCTL_TAPE_WRITE_MARKS-Anforderung . Diese Routine ist erforderlich. WriteMarks schreibt Markierungen auf ein Band, indem das CDB in einem vom Bandklassentreiber übergebenen SRB ausgefüllt wird. Beim Schreiben von Markierungen wird in der Regel ein SRB benötigt, um den Vorgang abzuschließen. Nachdem WriteMarks den SRB ausgefüllt und zurückgegeben hat, sendet der Bandklassentreiber den SRB an das Gerät und ruft je nach Ergebnis des SRB und dem Wert von RetryFlagserneut WriteMarks auf. WriteMarks gibt dann TAPE_STATUS_SUCCESS zurück.

PreProcessReadWrite

PreProcessReadWrite ist eine optionale, spezielle Routine, die alle gerätespezifischen Vorgänge ausführt, die vor Lese- und Schreibvorgängen erforderlich sind. Die meisten Band-Miniklassentreiber benötigen diese Routine nicht. Die Aktivitäten der PreProcessReadWrite-Routine sind gerätespezifisch. Die Routine kann die vom Klassentreiber übergebenen Informationen verwenden, um eine spezielle Vorverarbeitung für Lese- und Schreibvorgänge zu implementieren. Wenn ein Laufwerk über begrenzte Funktionen verfügt, benötigt der Treiber diese Routine möglicherweise, um beispielsweise einen kohärenten Zustand aufrechtzuerhalten.

Wenn ein Band-Miniklassentreiber einen Nicht-NULL-Einstiegspunkt für diese Routine in der TAPE_INIT_DATA_EX Struktur festlegt, die er von seiner DriverEntry-Routine an TapeClassInitialize übergibt, ruft der Bandklassentreiber ihn vor jedem Lese- und Schreibvorgang auf dem Bandgerät auf. Der Klassentreiber erwartet von dieser Routine keine Informationen zurück.

WMIOperations

WMIOperations ist der gemeinsame Einstiegspunkt für alle WMI-Aufrufe vom Bandklassentreiber. Ein Minidriver, der WMI unterstützt, sollte den Funktionszeigermember WMIOperations in der Struktur festlegen, TAPE_INIT_DATA_EX auf die TAPE_PROCESS_COMMAND_ROUTINE Routine des Minitreibers verweist. Der Minitreiber sollte dies in seiner DriverEntry-Routine tun, bevor TapeClassInitialize aufgerufen wird. Wenn ein Minidriver WMI-Vorgänge nicht unterstützt, sollte das TapeWMIOperations-Feld auf NULL festgelegt werden.

Der Bandklassentreiber weist den Membern der TAPE_WMI_OPERATIONS-Struktur Werte zu und übergibt diese Struktur an die WMIOperations-Routine des Minitreibers im CommandParameters-Parameter . Wie bei anderen Minidriver-Routinen füllt, erstellt und initialisiert WMIOperations die SCSI-Anforderungsblöcke (SRB) und die Befehlsdeskriptorblöcke (CDB), die zum Implementieren der angegebenen WMI-Methode erforderlich sind, und gibt die Steuerung an den Bandklassentreiber zurück. Der Bandklassentreiber ruft dann den Porttreiber auf, um die Anforderung auszuführen.

Der Minidriver gibt die WMI-Daten im Puffer zurück, auf den der DataBuffer-Member der TAPE_WMI_OPERATIONS-Struktur verweist.

Anforderungen

Anforderung Wert
Zielplattform Desktop
Kopfzeile minitape.h (schließen Sie Minitape.h ein)

Weitere Informationen

SCSI_REQUEST_BLOCK

TAPE_STATUS

TapeClassAllocateSrbBuffer

TapeClassZeroMemory