我有一个NDIS驱动程序,它在连接属性的已安装项目列表和设备管理器中列出;问题是,如何编写一个用于管理驱动程序属性的扩展,以及如何安装它?
当然,普通的GUI程序可以与驱动程序通信,设置属性,获取版本号和其他统计信息等,这就是DeviceIoControl所存在的;但是,这是否意味着不存在专用接口来通知驱动程序有关配置更改的信息?
如果有人可以将此问题转发给eggheadcafe / osr的ntdev列表,那将会很愉快。
答案 0 :(得分:5)
如果您希望网络驱动程序在“LAN属性”对话框中具有某些UI,则需要执行以下操作:
创建NotifyObject (如果您还没有)
NotifyObject本质上是与您的驱动程序关联的COM对象。制作一个,
DllGetClassObject
和CComObjectRoot
的C ++类,对CComCoClass
的调用,以及OBJECT_ENTRY_AUTO
,如果您是COM的新手。)BEGIN_COM_MAP
和ClsId={guid}
放入您的INF,在COM对象上实施INetCfgComponentPropertyUi
关键方法是ComponentDll=filename
。在此方法中,您将分配propertiesysheet页面并将它们合并到适配器属性中。此操作看起来像这个伪代码:
MergePropPages
API是交易性的。请务必在HPROPSHEETPAGE *psharray = CoTaskMemAlloc(NUMBER_OF_PAGES * sizeof(HPROPSHEETPAGE);
for (i = 0; i < NUMBER_OF_PAGES; i++)
psharray[i] = CreatePropertySheetPage(&psp);
方法中应用所有更改,并在ApplyProperties
中撤消(如果适用)。
CancelProperties
或QueryPropertyUi
中执行任何操作,但如果您需要获取注册表项位置,则可能需要保存上下文。测试您的更改
如果一切顺利,那么每次有任何网络配置更改时,您的新通知对象都将被加载。如果正在显示GUI,则Windows将向您的类查询INetCfgComponentPropertyUi接口并调用SetContext
。
我发现将硬编码断点放在我的DLL中的关键位置是有帮助的,然后附加一个内核调试器,这样我总能找到DLL,无论哪个进程加载它。 (在Windows 7上,您将加载到drvinst.exe中,使用用户模式调试器很难找到它。)