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

kag*_*san 2 configuration user-interface ndis device-driver inf

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

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

NDIS驱动配置截图

如果有人能将这个问题转发到eggheadcafe/osr的ntdev列表,那将是令人愉快的.

Jef*_*pet 5

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

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

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

  1. 创建一个可以创建新COM类的DLL.(如果你使用ATL的类工厂,它只有几行代码.我强烈建议使用ATL来实现COM对象.这是LAN Properties GUI的范围之外,但你应该查找DllGetClassObject一个继承的C++类来自CComObjectRootCComCoClass,OBJECT_ENTRY_AUTO以及BEGIN_COM_MAP如果您是COM的新手,请致电.)
  2. 通过将您的COM对象放入INF中,将其ClsId={guid}与驱动程序相关联ComponentDll=filename.

在COM对象上实现INetCfgComponentPropertyUi

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

    HPROPSHEETPAGE *psharray = CoTaskMemAlloc(NUMBER_OF_PAGES * sizeof(HPROPSHEETPAGE);
    for (i = 0; i < NUMBER_OF_PAGES; i++)
        psharray[i] = CreatePropertySheetPage(&psp);
    
    Run Code Online (Sandbox Code Playgroud)
  2. API是交易性的.确保应用ApplyProperties方法中的任何更改,并(如果适用)撤消它们CancelProperties.

  3. 您不需要在QueryPropertyUi或中执行任何操作SetContext,但如果您需要获取注册表项位置,则可能需要保存上下文.

测试您的更改

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

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