SendDownStreamIrp 関数
このトピックで提供される SendDownStreamIrp
関数のコード例では、ACPI ドライバーに同期 IOCTL 要求を送信するドライバーが指定した関数の実装方法を示しています。 SendDownStreamIrp
関数を使用して、IOCTL_ACPI_EVAL_METHOD 要求、IOCTL_ACPI_EVAL_METHOD_EX 要求、または IOCTL_ACPI_ENUM_CHILDREN 要求を送信できます。
このセクションに含まれる SendDownStreamIrp
関数のコード例では、次の一連の操作を実行します。
イベント オブジェクトを作成します。
IoBuildDeviceIoControlRequest 呼び出して、IOCTL 要求を作成します。
IoCallDriver を呼び出して、IOCTL 要求を送信します。
要求が完了したことを示すイベント オブジェクトが ACPI ドライバーからシグナルを受け取るまで待機します。
要求の状態を呼び出し元に返します。
NTSTATUS
SendDownStreamIrp(
IN PDEVICE_OBJECT Pdo,
IN ULONG Ioctl,
IN PVOID InputBuffer,
IN ULONG InputSize,
IN PVOID OutputBuffer,
IN ULONG OutputSize
)
/*
Routine Description:
General-purpose function called to send a request to the PDO.
The IOCTL argument accepts the control method being passed down
by the calling function
This subroutine is only valid for the IOCTLS other than ASYNC EVAL.
Parameters:
Pdo - the request is sent to this device object
Ioctl - the request - specified by the calling function
InputBuffer - incoming request
InputSize - size of the incoming request
OutputBuffer - the answer
OutputSize - size of the answer buffer
Return Value:
NT Status of the operation
*/
{
IO_STATUS_BLOCK ioBlock;
KEVENT myIoctlEvent;
NTSTATUS status;
PIRP irp;
// Initialize an event to wait on
KeInitializeEvent(&myIoctlEvent, SynchronizationEvent, FALSE);
// Build the request
irp = IoBuildDeviceIoControlRequest(
Ioctl,
Pdo,
InputBuffer,
InputSize,
OutputBuffer,
OutputSize,
FALSE,
&myIoctlEvent,
&ioBlock);
if (!irp) {
return STATUS_INSUFFICIENT_RESOURCES;
}
// Pass request to Pdo, always wait for completion routine
status = IoCallDriver(Pdo, irp);
if (status == STATUS_PENDING) {
// Wait for the IRP to be completed, and then return the status code
KeWaitForSingleObject(
&myIoctlEvent,
Executive,
KernelMode,
FALSE,
NULL);
status = ioBlock.Status;
}
return status;
}