首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从NDIS Miniport调用KMDF WDF接口?

如何从NDIS Miniport调用KMDF WDF接口?
EN

Stack Overflow用户
提问于 2017-08-11 05:37:30
回答 2查看 211关注 0票数 1

我有一个总线驱动程序,它为自定义以太网卡的每个物理端口创建一个PDO。我也有一个NDIS微型端口驱动程序,安装在每个PDO上。

总线驱动程序基于static Toaster示例。NDIS微型端口基于经过修改以匹配硬件的Netvmini。

代码语言:javascript
复制
ToasterInterface.InterfaceHeader.InterfaceReference =
    WdfDeviceInterfaceReferenceNoOp;
ToasterInterface.InterfaceHeader.InterfaceDereference =
    WdfDeviceInterfaceDereferenceNoOp;

ToasterInterface.GetCrispinessLevel  = Bus_GetCrispinessLevel;
ToasterInterface.SetCrispinessLevel  = Bus_SetCrispinessLevel;
ToasterInterface.IsSafetyLockEnabled = Bus_IsSafetyLockEnabled;

WDF_QUERY_INTERFACE_CONFIG_INIT(&qiConfig,
                                (PINTERFACE) &ToasterInterface,
                                &GUID_TOASTER_INTERFACE_STANDARD,
                                NULL);

status = WdfDeviceAddQueryInterface(hChild,&qiConfig);

如何从NDIS驱动程序调用KMDF WDF定义的接口?谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-08-15 09:26:54

从驱动程序的NDIS端,您可以调用NdisMGetDeviceProperty来获取单个微型端口的FDO。在这里,以通常的方式调用IoCallDriver (或IoSynchronousCallDriver来节省几行代码)来发出IRP_MN_QUERY_INTERFACE

您需要确保在MiniportHalt完成之前取消对总线接口的引用。

票数 1
EN

Stack Overflow用户

发布于 2017-08-16 21:05:20

以下是为我工作的代码。

代码语言:javascript
复制
    // ***********************************
    // Inside Header (Both Drivers, Shared)
    // ***********************************

    typedef
    NTSTATUS
    (*PMY_BUS_INTERFACE_TEST) (
        _In_ PINTERFACE InterfaceHeader,
        _In_ PVOID pDataIn,
        _In_ size_t szDataInSize
        );

    typedef struct _MY_BUS_INTERFACE {
        INTERFACE InterfaceHeader;
        PMY_BUS_INTERFACE_TEST InterfaceTest;
    } MY_BUS_INTERFACE, *PMY_BUS_INTERFACE;

    #define MY_BUS_INTERFACE_VERSION 1
    DEFINE_GUID(GUID_MY_BUS_INTERFACE, 0x12345678, 0x1234, 0x1234, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88);


    // ***********************************
    // pdo.c: inside Bus_CreatePdo
    // ***********************************


    //
    // Test Interface
    //
    MY_BUS_INTERFACE arincInterface;
    RtlZeroMemory(&arincInterface, sizeof(MY_BUS_INTERFACE));
    arincInterface.InterfaceHeader.Size = sizeof(MY_BUS_INTERFACE);
    arincInterface.InterfaceHeader.Version = MY_BUS_INTERFACE_VERSION;
    arincInterface.InterfaceHeader.Context = (PVOID)hChild;
    arincInterface.InterfaceHeader.InterfaceReference = WdfDeviceInterfaceReferenceNoOp;
    arincInterface.InterfaceHeader.InterfaceDereference = WdfDeviceInterfaceDereferenceNoOp;

    arincInterface.InterfaceTest = Bus_InterfaceTest;

    WDF_QUERY_INTERFACE_CONFIG qic;
    WDF_QUERY_INTERFACE_CONFIG_INIT(&qic,
        (PINTERFACE)&arincInterface,
        &GUID_MY_BUS_INTERFACE,
        NULL);


    // ***********************************
    // Inside pdo.c
    // ***********************************

    NTSTATUS
    Bus_InterfaceTest(
        _In_ PINTERFACE InterfaceHeader,
        _In_ PVOID pDataIn,
        _In_ size_t szDataInSize
    )
    {
        NTSTATUS status = STATUS_SUCCESS;

        UNREFERENCED_PARAMETER(InterfaceHeader);
        UNREFERENCED_PARAMETER(pDataIn);
        UNREFERENCED_PARAMETER(szDataInSize);

        KdPrint(("Bus_InterfaceTest: pDataIn [%p] [%llu] \n", pDataIn, szDataInSize));

        status = -678;

        return status;
    }



    // ***********************************
    // Inside Miniport Driver
    // ***********************************

    //
    // Query Interface Setup
    //
    MY_BUS_INTERFACE myBusInterface;
    PMY_BUS_INTERFACE pMyBusInterface = &myBusInterface;

    //
    // Initialize an event to block on
    //
    KEVENT event;
    KeInitializeEvent(&event, SynchronizationEvent, FALSE);

    //
    // Build an irp
    //
    IO_STATUS_BLOCK     ioStatus;

    PIRP irp = IoBuildSynchronousFsdRequest(
        IRP_MJ_PNP,
        Adapter->NextDeviceObject,
        NULL,
        0,
        NULL,
        &event,
        &ioStatus
    );

    if (!irp) {
        pMyBusInterface = NULL;
        Status = STATUS_INSUFFICIENT_RESOURCES;
        break;
    }

    irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
    irp->IoStatus.Information = 0;

    //
    // Get the irp stack location
    //
    PIO_STACK_LOCATION irpSp = IoGetNextIrpStackLocation(irp);

    //
    // Use QUERY_INTERFACE to get the address of the direct-call
    // ACPI interfaces.
    //
    irpSp->MajorFunction = IRP_MJ_PNP;
    irpSp->MinorFunction = IRP_MN_QUERY_INTERFACE;
    irpSp->Parameters.QueryInterface.InterfaceType = (LPGUID)&GUID_MY_BUS_INTERFACE;
    irpSp->Parameters.QueryInterface.Version = MY_BUS_INTERFACE_VERSION;
    irpSp->Parameters.QueryInterface.Size = sizeof(MY_BUS_INTERFACE);
    irpSp->Parameters.QueryInterface.Interface = (PINTERFACE)pMyBusInterface;
    irpSp->Parameters.QueryInterface.InterfaceSpecificData = NULL;

    //
    // send the request down
    //
    NTSTATUS status = IoCallDriver(Adapter->NextDeviceObject, irp);
    if (status == STATUS_PENDING) {
        KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
        status = ioStatus.Status;
    }
    else if (!NT_SUCCESS(status))
    {
        KdPrint(("IoCallDriver was not pending or success \n"));
        break;
    }

    //
    // test interface
    //
    char testData[260] = "TEST";
    NTSTATUS interfaceTestStatus = (*myBusInterface.InterfaceTest)(
        (PINTERFACE)pMyBusInterface,
        (PVOID)testData,
        strlen(testData)
        );
    if (interfaceTestStatus == -678)
    {
        KdPrint(("************************************** \n"));
        KdPrint(("***     InterfaceTest SUCCESS      *** \n"));
        KdPrint(("************************************** \n"));

        status = STATUS_SUCCESS;
    }
    else {
        KdPrint(("************************************** \n"));
        KdPrint(("***     InterfaceTest FAILURE      *** \n"));
        KdPrint(("************************************** \n"));
        status = STATUS_UNSUCCESSFUL;
        (*myBusInterface.InterfaceHeader.InterfaceDereference)(myBusInterface.InterfaceHeader.Context);
        break;
    }

    //
    // Dereference Interface
    //
    (*myBusInterface.InterfaceHeader.InterfaceDereference)(myBusInterface.InterfaceHeader.Context);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45623815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档