structure SRBEX_DATA (storport.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 sous forme de structure SRBEX_DATA_BIDIRECTIONAL. |
|
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_SCSI_CDB16. |
|
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_SCSI_CDB32. |
|
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_SCSI_CDB_VAR. |
|
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_WMI. |
|
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_POWER. |
|
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_PNP. |
|
Les données étendues SRB sont mises en forme sous forme de structure SRBEX_DATA_IO_INFO. |
Length
Longueur des données SRB, en octets, présentes dans le membre Data.
Data[ANYSIZE_ARRAY]
Contenu étendu du bloc de données SRB.
Remarques
Les données étendues SRB sont présentes lorsque le tableau SrbExDataOffset dans la structure STORAGE_REQUEST_BLOCK contient des emplacements offset valides. Un pilote de stockage référence initialement un emplacement de décalage de mémoire contenu dans SrbExDataOffset en tant que structure SRBEX_DATA. Un pointeur vers le bloc de données est ensuite converti en type de structure approprié en fonction de la valeur du type de données dans le membre type de.
L’exemple de fragment de code suivant montre comment accéder aux données étendues pour une 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;
}
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Windows 8 |
d’en-tête | storport.h (include Storport.h, Srb.h, Minitape.h) |