IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS IOCTL (ehstorioctl.h)
Cette IOCTL retourne un jeu de résultats contenant l’énumération de tous les objets d’appareil physique de stockage actifs associés à la cible de commande adressable donnée (ACT). Le client peut d’abord rechercher la taille de mémoire tampon requise en émettant cette IOCTL de la manière suivante :
DeviceIoControl(
hDevice,
IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS,
&pdoType,
sizeof(PDO_TYPE),
NULL,
0,
&dwBytesRequired,
NULL );
Avec le paramètre de mémoire tampon de sortie défini sur NULL, le gestionnaire d’E/S efface le bit IRP_INPUT_OPERATION dans les indicateurs IRP. Lors de la détection de ce problème, le pilote de silo de stockage peut définir en toute sécurité IoStatus.Information sur la taille de mémoire tampon requise, ce qui lui indique au client.
Cela fonctionne uniquement, car STATUS_BUFFER_OVERFLOW (0x80000005) est une valeur NT_WARNING() pour laquelle le gestionnaire d’E/S copie IoStatus.Information dans le paramètre lpBytesReturned, en retournant cette valeur au client.
La prudence est requise ici, car IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS est définie avec METHOD_BUFFERED, par conséquent, le gestionnaire d’E/S tente de copier ce nombre d’octets dans la mémoire tampon de sortie.
Code principal
Mémoire tampon d’entrée
La mémoire tampon d’entrée sur Irp->AssociatedIrp.SystemBuffer doit contenir une valeur ULONG telle que définie dans PDO_TYPE,
où tous les PDO de disque, juste le PDO de disque, ou tous les PDO de contrôle ou tous les PDO de silo sont énumérés respectivement en fonction de la valeur d’entrée fournie PDO_TYPE.
Longueur de la mémoire tampon d’entrée
Longueur d’un ULONG.
Mémoire tampon de sortie
Irp->AssociatedIrp.SystemBuffer pointe vers la mémoire tampon qui recevra les résultats de l’énumération PDO. Si le client a fourni une mémoire tampon non-NULL avec le IOCTL émis, le pilote le remplit avec le jeu de résultats uniquement si la valeur de retour Parameters.DeviceIoControl.La valeur de retour est STATUS_SUCCESS si la taille de la mémoire tampon est suffisante et que les résultats ont été copiés dans la mémoire tampon. Sinon, STATUS_INVALID_BUFFER_SIZE est retourné et la mémoire tampon de sortie n’est pas modifiée.
La mémoire tampon d’énumération retournée contient un jeu de résultats structuré en fonction des règles suivantes. La structure de début dans la mémoire tampon, ENUM_PDO_RESULTS, se compose d’un nombre de structures de structure et d’un tableau de structures ENUM_PDO_ENTRY.
Longueur de la mémoire tampon de sortie
OutputBufferLength indique une taille de mémoire tampon suffisante pour inclure l’ensemble du jeu de résultats.
Bloc d’état
L’une des valeurs suivantes peut être retournée dans le champ État :
- STATUS_SUCCESS : la mémoire tampon de sortie contient l’énumération des PDA demandées.
- STATUS_BUFFER_OVERFLOW : le champ Informations est défini sur la taille de mémoire tampon requise pour contenir la sortie du jeu de résultats d’énumération entier.
- STATUS_INVALID_BUFFER_SIZE : la longueur de la mémoire tampon de sortie fournie est insuffisante pour contenir la sortie entière du jeu de résultats d’énumération.
Exigences
Exigence | Valeur |
---|---|
d’en-tête | ehstorioctl.h (include EhStorIoctl.h) |