SRBEX_DATA structure (srb.h)
La structure SRBEX_DATA est le format généralisé pour contenir des données SRB étendues.
Syntaxe
typedef struct _SRBEX_DATA {
SRBEXDATATYPE Type;
ULONG Length;
UCHAR Data[ANYSIZE_ARRAY];
} SRBEX_DATA, *PSRBEX_DATA;
Membres
Type
Indicateur de type de données pour la structure de données SRB étendue. Les valeurs possibles pour Type sont l’une des suivantes.
Valeur | Signification |
---|---|
|
Le type de données étendu SRB est inconnu. |
|
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_BIDIRECTIONAL . |
|
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_SCSI_CDB16 . |
|
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_SCSI_CDB32 . |
|
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_SCSI_CDB_VAR . |
|
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_WMI . |
|
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_POWER . |
|
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_PNP . |
|
Les données étendues SRB sont mises en forme en tant que structure SRBEX_DATA_IO_INFO . |
Length
Longueur des données SRB, en octets, présentes dans le membre Data .
Data[ANYSIZE_ARRAY]
Contenu du bloc de données SRB étendu.
Remarques
Les données étendues SRB sont présentes lorsque le tableau SrbExDataOffset dans la structure STORAGE_REQUEST_BLOCK contient des emplacements de décalage valides. Un pilote de stockage référence initialement un emplacement de décalage de mémoire contenu dans SrbExDataOffset en tant que structure de SRBEX_DATA . Un pointeur vers le bloc de données est ensuite converti vers le type de structure approprié en fonction de la valeur du type de données dans le membre Type .
L’exemple de fragment de code suivant montre comment accéder aux données étendues pour la fonction 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;
}
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Disponible à partir de Windows 8. |
En-tête | srb.h (inclure Storport.h, Srb.h, Minitape.h) |