structure SRBEX_DATA (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 Données .
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 fait initialement référence à 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 casté 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 (y compris Storport.h, Srb.h, Minitape.h) |
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour