3

我有一个 NDIS 驱动程序,它在连接属性的已安装项目列表和设备管理器中都列出;问题是,我如何编写一个用于管理驱动程序属性的扩展,以及如何安装它?

当然,一个普通的 GUI 程序可以与驱动程序通信、设置属性、获取版本号和其他统计信息等,这就是 DeviceIoControl 存在的目的;但是,这是否意味着不存在通知驱动程序配置更改的专用接口?

NDIS 驱动程序配置屏幕截图

如果有人可以将此问题转发到 eggheadcafe/osr 的 ntdev 列表,那就太好了。

4

1 回答 1

5

如果您希望网络驱动程序在 LAN 属性对话框中有一些 UI,那么您需要执行以下操作:

创建一个 NotifyObject(如果您还没有)

NotifyObject 本质上是一个与您的驱动程序关联的 COM 对象。做一个,

  1. 制作一个可以创建新 COM 类的 DLL。(如果你使用ATL 的类工厂,它只有几行代码。我强烈建议使用 ATL 来实现 COM 对象。这超出了 LAN 属性 GUI 的范围,但你应该查找DllGetClassObject,一个继承的 C++ 类来自CComObjectRootCComCoClass, 调用OBJECT_ENTRY_AUTO, 和 aBEGIN_COM_MAP如果您是 COM 新手。)
  2. ClsId={guid}通过将和ComponentDll=filename放入您的 INF将您的 COM 对象与驱动程序相关联。

在 COM 对象上实现INetCfgComponentPropertyUi

  1. 关键方法是MergePropPages。在此方法中,您分配属性表页面并将它们合并到适配器属性中。此操作类似于以下伪代码:

    HPROPSHEETPAGE *psharray = CoTaskMemAlloc(NUMBER_OF_PAGES * sizeof(HPROPSHEETPAGE);
    for (i = 0; i < NUMBER_OF_PAGES; i++)
        psharray[i] = CreatePropertySheetPage(&psp);
    
  2. API 是事务性的。确保在ApplyProperties方法中应用任何更改,并(如果适用)在CancelProperties.

  3. 您无需在QueryPropertyUior中执行任何操作SetContext,但如果您需要获取注册表项位置,您可能希望保存上下文。

测试您的更改

如果一切顺利,那么每次有任何网络配置更改时,都会加载新的通知对象。如果正在显示 GUI,则 Windows 将查询您的类以获取 INetCfgComponentPropertyUi 接口并调用MergePropPages.

我发现在我的 DLL 中的关键位置放置硬编码断点很有帮助,然后附加一个内核调试器,这样我就可以始终找到 DLL,无论哪个进程正在加载它。(在 Windows 7 上,您将被加载到 drvinst.exe,使用用户模式调试器很难找到它。)

于 2011-11-22T02:40:04.213 回答