获取BUS_INTERFACE_STANDARD

在WDF程序可以通过WdfFdoQueryForInterface函数得到BUS_INTERFACE_STANDARD

而WDM驱动可以通过下面的函数获得

 

static NTSTATUS
GetPCIBusInterfaceStandard(
    __in  PDEVICE_OBJECT DeviceObject,
    __out PBUS_INTERFACE_STANDARD    BusInterfaceStandard
    )
/*++
Routine Description:

    This routine gets the bus interface standard information from the PDO.

Arguments:
    DeviceObject - Device object to query for this information.
    BusInterface - Supplies a pointer to the retrieved information.

Return Value:

    NT status.

--*/
{
    KEVENT event;
    NTSTATUS status;
    PIRP irp;
    IO_STATUS_BLOCK ioStatusBlock;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_OBJECT targetObject;

    PAGED_CODE();

    KeInitializeEvent( &event, NotificationEvent, FALSE );

    targetObject = IoGetAttachedDeviceReference( DeviceObject );

    irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP,
                                        targetObject,
                                        NULL,
                                        0,
                                        NULL,
                                        &event,
                                        &ioStatusBlock );
    if (irp == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto End;
    }

    irpStack = IoGetNextIrpStackLocation( irp );
    irpStack->MinorFunction = IRP_MN_QUERY_INTERFACE;
    irpStack->Parameters.QueryInterface.InterfaceType =
                        (LPGUID) &GUID_BUS_INTERFACE_STANDARD ;
    irpStack->Parameters.QueryInterface.Size = sizeof(BUS_INTERFACE_STANDARD);
    irpStack->Parameters.QueryInterface.Version = 1;
    irpStack->Parameters.QueryInterface.Interface =
                                        (PINTERFACE)BusInterfaceStandard;

    irpStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;

    // Initialize the status to error in case the bus driver does not
    // set it correctly.
    irp->IoStatus.Status = STATUS_NOT_SUPPORTED ;

    status = IoCallDriver( targetObject, irp );
    if (status == STATUS_PENDING) {

        status = KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL);
        ASSERT(NT_SUCCESS(status));
        status = ioStatusBlock.Status;

    }

End:
    // Done with reference
    ObDereferenceObject( targetObject );
    return status;

}

posted @ 2011-06-15 11:10  Fan Zhang  阅读(925)  评论(0编辑  收藏  举报