struttura SRBEX_DATA (srb.h)
La struttura SRBEX_DATA è il formato generalizzato per contenere dati SRB estesi.
Sintassi
typedef struct _SRBEX_DATA {
SRBEXDATATYPE Type;
ULONG Length;
UCHAR Data[ANYSIZE_ARRAY];
} SRBEX_DATA, *PSRBEX_DATA;
Membri
Type
Indicatore del tipo di dati per la struttura dei dati SRB estesa. I valori possibili per Type sono uno dei seguenti.
Valore | Significato |
---|---|
|
Il tipo di dati esteso SRB è sconosciuto. |
|
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_BIDIRECTIONAL. |
|
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_SCSI_CDB16. |
|
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_SCSI_CDB32. |
|
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_SCSI_CDB_VAR. |
|
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_WMI. |
|
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_POWER. |
|
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_PNP. |
|
I dati estesi di SRB vengono formattati come struttura SRBEX_DATA_IO_INFO. |
Length
Lunghezza dei dati SRB, in byte, presenti nel membro dati.
Data[ANYSIZE_ARRAY]
Contenuto del blocco di dati SRB esteso.
Osservazioni
I dati estesi di SRB sono presenti quando la matrice di SrbExDataOffset nella struttura STORAGE_REQUEST_BLOCK contiene posizioni di offset valide. Un driver di archiviazione fa inizialmente riferimento a una posizione di offset di memoria contenuta in SrbExDataOffset come struttura SRBEX_DATA. Viene quindi eseguito il cast di un puntatore al blocco di dati al tipo di struttura appropriato in base al valore del tipo di dati nel membro tipo.
Il frammento di codice di esempio seguente illustra come accedere ai dati estesi per la funzione SRB di SRB_FUNCTION_PNP.
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;
}
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Disponibile a partire da Windows 8. |
intestazione | srb.h (include Storport.h, Srb.h, Minitape.h) |