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.
Die SRBEX_DATA Struktur ist das generalisierte Format für erweiterte SRB-Daten.
Syntax
typedef struct _SRBEX_DATA {
SRBEXDATATYPE Type;
ULONG Length;
UCHAR Data[ANYSIZE_ARRAY];
} SRBEX_DATA, *PSRBEX_DATA;
Angehörige
Type
Datentypindikator für die erweiterte SRB-Datenstruktur. Die möglichen Werte für Type sind einer der folgenden.
| Wert | Bedeutung |
|---|---|
|
Der erweiterte SRB-Datentyp ist unbekannt. |
|
Die erweiterten SRB-Daten werden als SRBEX_DATA_BIDIRECTIONAL Struktur formatiert. |
|
Die erweiterten SRB-Daten werden als SRBEX_DATA_SCSI_CDB16 Struktur formatiert. |
|
Die erweiterten SRB-Daten werden als SRBEX_DATA_SCSI_CDB32 Struktur formatiert. |
|
Die erweiterten SRB-Daten werden als SRBEX_DATA_SCSI_CDB_VAR Struktur formatiert. |
|
Die erweiterten SRB-Daten werden als SRBEX_DATA_WMI Struktur formatiert. |
|
Die erweiterten SRB-Daten werden als SRBEX_DATA_POWER Struktur formatiert. |
|
Die erweiterten SRB-Daten werden als SRBEX_DATA_PNP Struktur formatiert. |
|
Die erweiterten SRB-Daten werden als SRBEX_DATA_IO_INFO Struktur formatiert. |
Length
Länge der SRB-Daten in Bytes, die im Data Member vorhanden sind.
Data[ANYSIZE_ARRAY]
Der erweiterte SRB-Datenblockinhalt.
Bemerkungen
Die erweiterten SRB-Daten sind vorhanden, wenn das SrbExDataOffset Array in der STORAGE_REQUEST_BLOCK-Struktur gültige Offsetpositionen enthält. Ein Speichertreiber verweist zunächst auf einen Speicheroffsetspeicherort, der in SrbExDataOffset- als SRBEX_DATA Struktur enthalten ist. Ein Zeiger auf den Datenblock wird dann basierend auf dem Datentypwert im Type-Element in den entsprechenden Strukturtyptyptyp umwandeln.
Das folgende Beispielcodefragment zeigt, wie Sie auf die erweiterten Daten für die SRB-Funktion von SRB_FUNCTION_PNP zugreifen.
BOOLEAN CheckIo( _In_ PSCSI_REQUEST_BLOCK Srb)
{
BOOLEAN result = TRUE;
ULONG function;
PSTORAGE_REQUEST_BLOCK SrbEx = (PSTORAGE_REQUEST_BLOCK)Srb;
PSRBEX_DATA SrbExData = NULL;
function = (SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK) ? SrbEx->SrbFunction : Srb->Function;
switch (function)
{
case SRB_FUNCTION_PNP:
{
STOR_PNP_ACTION PnpAction;
BOOLEAN ForAdapter;
if (SrbEx->Function == SRB_FUNCTION_STORAGE_REQUEST_BLOCK)
{
PSRBEX_DATA_PNP SrbExDataPnp = NULL;
SrbExData = (PSRBEX_DATA) ((PUCHAR)SrbEx + SrbEx->SrbExDataOffset[0]);
if (SrbExData->Type == SrbExDataTypePnp)
{
SrbExDataPnp = (PSRBEX_DATA_PNP) SrbExData;
ForAdapter = (SrbExDataPnp->SrbPnPFlags == SRB_PNP_FLAGS_ADAPTER_REQUEST);
PnpAction = SrbExDataPnp->PnPAction;
}
else
{
ForAdapter = FALSE;
result = FALSE;
}
}
else
{
PSCSI_PNP_REQUEST_BLOCK PnpSrb = (PSCSI_PNP_REQUEST_BLOCK)Srb;
ForAdapter = (PnpSrb->SrbPnPFlags == SRB_PNP_FLAGS_ADAPTER_REQUEST);
PnpAction = PnpSrb->PnPAction;
}
if (ForAdapter)
{
switch (PnpAction)
{
case StorRemoveDevice:
//
// ...
//
Srb->SrbStatus = SRB_STATUS_SUCCESS;
break;
default:
Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
result = FALSE;
break:
}
}
default:
break;
}
return result;
}
Anforderungen
| Anforderung | Wert |
|---|---|
| mindestens unterstützte Client- | Verfügbar ab Windows 8. |
| Header- | srb.h (include Storport.h, Srb.h, Minitape.h) |