Funzione SendDownStreamIrp
L'esempio di codice per la SendDownStreamIrp
funzione fornita in questo argomento illustra come implementare una funzione fornita dal driver che invia richieste IOCTL sincrone al driver ACPI. La SendDownStreamIrp
funzione può essere usata per inviare una richiesta di IOCTL_ACPI_EVAL_METHOD , una richiesta di IOCTL_ACPI_EVAL_METHOD_EX o una richiesta di IOCTL_ACPI_ENUM_CHILDREN .
Il codice di esempio per la funzione inclusa in questa sezione esegue la SendDownStreamIrp
sequenza di operazioni seguente:
Crea un oggetto evento.
Chiama IoBuildDeviceIoControlRequest per creare la richiesta IOCTL.
Chiama IoCallDriver per inviare la richiesta IOCTL.
Attende fino a quando il driver ACPI segnala l'oggetto evento, che indica che la richiesta è stata completata.
Restituisce lo stato della richiesta al chiamante.
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;
}
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per