estructura SRBEX_DATA (storport.h)
La estructura SRBEX_DATA es el formato generalizado para contener datos SRB extendidos.
Sintaxis
typedef struct _SRBEX_DATA {
SRBEXDATATYPE Type;
ULONG Length;
UCHAR Data[ANYSIZE_ARRAY];
} SRBEX_DATA, *PSRBEX_DATA;
Miembros
Type
Indicador de tipo de datos para la estructura de datos SRB extendida. Los valores posibles para Type son uno de los siguientes.
Valor | Significado |
---|---|
|
El tipo de datos extendido de SRB es desconocido. |
|
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_BIDIRECTIONAL. |
|
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_SCSI_CDB16. |
|
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_SCSI_CDB32. |
|
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_SCSI_CDB_VAR. |
|
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_WMI. |
|
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_POWER. |
|
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_PNP. |
|
Los datos extendidos de SRB tienen el formato de estructura SRBEX_DATA_IO_INFO. |
Length
Longitud de los datos SRB, en bytes, presentes en el miembro de Datos.
Data[ANYSIZE_ARRAY]
Contenido extendido del bloque de datos SRB.
Observaciones
Los datos extendidos de SRB están presentes cuando la matriz SrbExDataOffset en la estructura de STORAGE_REQUEST_BLOCK contiene ubicaciones de desplazamiento válidas. Un controlador de almacenamiento inicialmente hace referencia a una ubicación de desplazamiento de memoria contenida en SrbExDataOffset como una estructura de SRBEX_DATA. A continuación, se convierte un puntero al bloque de datos en el tipo de estructura adecuado en función del valor de tipo de datos del miembro type de.
En el fragmento de código de ejemplo siguiente se muestra cómo acceder a los datos extendidos de una función SRB de 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;
}
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows 8 |
encabezado de | storport.h (incluya Storport.h, Srb.h, Minitape.h) |