Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O exemplo de código para a SendDownStreamIrp função fornecida neste tópico mostra como implementar uma função fornecida pelo driver que envia solicitações IOCTL síncronas para o driver ACPI. The SendDownStreamIrp function can be used to send an IOCTL_ACPI_EVAL_METHOD request, an IOCTL_ACPI_EVAL_METHOD_EX request, or an IOCTL_ACPI_ENUM_CHILDREN request.
O código de exemplo para a SendDownStreamIrp função incluída nesta seção executa a seguinte sequência de operações:
Cria um objeto de evento.
Calls IoBuildDeviceIoControlRequest to create the IOCTL request.
Calls IoCallDriver to send the IOCTL request.
Aguarda até que o driver ACPI sinalize o objeto de evento, o que indica que a solicitação foi concluída.
Retorna o status da solicitação para o chamador.
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;
}