Delen via


SendDownStreamIrp Function

In het codevoorbeeld voor de SendDownStreamIrp functie die in dit onderwerp wordt opgegeven, ziet u hoe u een door het stuurprogramma geleverde functie implementeert waarmee synchrone IOCTL-aanvragen worden verzonden naar het ACPI-stuurprogramma. 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.

De voorbeeldcode voor de SendDownStreamIrp functie die in deze sectie is opgenomen, voert de volgende reeks bewerkingen uit:

  • Hiermee maakt u een gebeurtenisobject.

  • Calls IoBuildDeviceIoControlRequest to create the IOCTL request.

  • Calls IoCallDriver to send the IOCTL request.

  • Wacht totdat het ACPI-stuurprogramma het gebeurtenisobject aangeeft, wat aangeeft dat de aanvraag is voltooid.

  • Retourneert de status van de aanvraag aan de beller.

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;
}