IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS IOCTL (ehstorioctl.h)
Diese IOCTL gibt ein Resultset zurück, das die Enumeration aller aktiven physischen Speicherobjekte (PHYSICAL Device Objects, PDOs) enthält, die dem angegebenen Adressierbaren Befehlsziel (ADDRESSable Command Target, ACT) zugeordnet sind. Der Client kann zunächst die erforderliche Puffergröße untersuchen, indem er diese IOCTL auf folgende Weise ausgibt:
DeviceIoControl(
hDevice,
IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS,
&pdoType,
sizeof(PDO_TYPE),
NULL,
0,
&dwBytesRequired,
NULL );
Wenn der Ausgabepufferparameter auf NULL-festgelegt ist, löscht der E/A-Manager das IRP_INPUT_OPERATION Bit in den IRP-Flags. Nach der Erkennung kann der Speichersilostreiber IoStatus.Information sicher auf die erforderliche Puffergröße festlegen und an den Client angibt.
Dies funktioniert nur, da STATUS_BUFFER_OVERFLOW (0x80000005) ein NT_WARNING()-Wert ist, für den der E/A-Manager IoStatus.Information in den lpBytesReturned-Parameter kopiert und diesen Wert an den Client zurückgibt.
Vorsicht ist hier erforderlich, da IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS mit METHOD_BUFFERED definiert ist, daher versucht der E/A-Manager, diese Anzahl von Bytes in den Ausgabepuffer zu kopieren.
Hauptcode
Eingabepuffer
Der Eingabepuffer bei Irp->AssociatedIrp.SystemBuffer muss einen ULONG-Wert enthalten, der in PDO_TYPEdefiniert ist.
wobei entweder alle PDOs, nur der Datenträger-PDO, nur die Steuer-PDO oder alle Silo-PDOs entsprechend dem bereitgestellten PDO_TYPE Eingabewert aufgezählt werden.
Eingabepufferlänge
Die Länge eines ULONG.
Ausgabepuffer
Irp->AssociatedIrp.SystemBuffer verweist auf den Puffer, der die PDO-Enumerationsergebnisse empfängt. Wenn der Client einen nicht-NULL- Puffer mit der ausgegebenen IOCTL bereitgestellt hat, füllt der Treiber ihn nur dann mit dem Resultset aus, wenn der Parameter.DeviceIoControl.Der Rückgabewert STATUS_SUCCESS ist, wenn die Puffergröße ausreicht und die Ergebnisse in den Puffer kopiert wurden. Andernfalls wird STATUS_INVALID_BUFFER_SIZE zurückgegeben, und der Ausgabepuffer ist unverändert.
Der zurückgegebene Enumerationspuffer enthält ein Resultset, das gemäß den folgenden Regeln strukturiert ist. Die führende Struktur im Puffer, ENUM_PDO_RESULTS, besteht aus einer Strukturanzahl und einem Array von ENUM_PDO_ENTRY Strukturen.
Länge des Ausgabepuffers
OutputBufferLength gibt eine Puffergröße mit ausreichender Länge an, um den gesamten Resultset einzuschließen.
Statusblock
Einer der folgenden Werte kann im Feld Status zurückgegeben werden:
- STATUS_SUCCESS – Der Ausgabepuffer enthält die Aufzählung der angeforderten PDOs.
- STATUS_BUFFER_OVERFLOW – Das Feld "Information" wird auf die erforderliche Puffergröße festgelegt, um die gesamte Ausgabe des Enumerationsergebnissatzes zu enthalten.
- STATUS_INVALID_BUFFER_SIZE : Die angegebene Ausgabepufferlänge reicht nicht aus, um die gesamte Ausgabe des Enumerationsergebnissatzes zu enthalten.
Anforderungen
Anforderung | Wert |
---|---|
Header- | ehstorioctl.h (einschließlich EhStorIoctl.h) |