.INF文件和NCF_HAS_UI:如何编写.dll来显示网络驱动程序的高级属性选项卡?

时间:2011-11-17 11:21:52

标签: user-interface configuration device-driver ndis inf

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

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

NDIS driver configuration screenshot

如果有人可以将此问题转发给eggheadcafe / osr的ntdev列表,那将会很愉快。

1 个答案:

答案 0 :(得分:5)

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

创建NotifyObject (如果您还没有)

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

  1. 创建一个可以创建新COM类的DLL。 (如果使用ATL's class factory,它只有几行代码。我强烈建议使用ATL来实现COM对象。这是LAN Properties GUI的范围,但是你应该查找{{1} },一个继承自DllGetClassObjectCComObjectRoot的C ++类,对CComCoClass的调用,以及OBJECT_ENTRY_AUTO,如果您是COM的新手。)
  2. 通过将BEGIN_COM_MAPClsId={guid}放入您的INF,
  3. Associate your COM object与驱动程序一起使用。
  4. 在COM对象上实施INetCfgComponentPropertyUi

    1. 关键方法是ComponentDll=filename。在此方法中,您将分配propertiesysheet页面并将它们合并到适配器属性中。此操作看起来像这个伪代码:

      MergePropPages
    2. API是交易性的。请务必在HPROPSHEETPAGE *psharray = CoTaskMemAlloc(NUMBER_OF_PAGES * sizeof(HPROPSHEETPAGE); for (i = 0; i < NUMBER_OF_PAGES; i++) psharray[i] = CreatePropertySheetPage(&psp); 方法中应用所有更改,并在ApplyProperties中撤消(如果适用)。

    3. 您无需在CancelPropertiesQueryPropertyUi中执行任何操作,但如果您需要获取注册表项位置,则可能需要保存上下文。
    4. 测试您的更改

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

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