|
就是 只会删除第二个设备对象 和符号连接,而第一个创建的设备对象和他符号连接不会被删除 ,
这是什么原因啊?
不清楚 是否能这样写(那本 windows驱动开发详解 我都没看多少页,就是看到了那个卸载例程我就有这想法,去写2个设备对象 用循环的方式卸载)
对了:写驱动 c或者c++ 他们调用约定不同吗?
我用c++ 的方式写的
extern "C"
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDrivObj,
PUNICODE_STRING pRegistryPath)
请问 其他函数 需要加这个 extern "C"吗?
-----------------------------------------------
2个创建设备对象 函数 分别是:1 。2
1创建设备对象后 调用2函数(再次创建设备对象)
通过 驱动对象 去找到这个 第一个设备对象的扩展地址,然后赋值给 2函数的设备扩展
pDevExt = (PDEVICE_EXTENSION)(pDriverObject->DeviceObject->DeviceExtension);
pDevExt->pNexDeviceObj = pDevObj;
------------------------------
1函数
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDeviceObj = pDevObj;
pDevExt->ustrDeviceName = ustrDevName;
pDevExt->ustrSymLinkName = SymLinkName;
pDevExt->pNexDeviceObj = NULL;
// 在创造一个设备
CreateDevices(pDriverObject);
-------------------------------------------------
2函数
NTSTATUS CreateDevices(IN PDRIVER_OBJECT pDriverObject)
{
。。。。。。。。。。
前面省略吧
。。。。。。。。。。
pDevObj->Flags |= DO_BUFFERED_IO;
pDevExt = (PDEVICE_EXTENSION)(pDriverObject->DeviceObject->DeviceExtension);
pDevExt->pNexDeviceObj = pDevObj;
//.....................
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDeviceObj = pDevObj;
pDevExt->ustrDeviceName = ustrDevName;
pDevExt->ustrSymLinkName = SymLinkName;
pDevExt->pNexDeviceObj =NULL;
}
对了 卸载例程 我是模仿 WINDOWS驱动开发技术详解的(最前面的那个卸载例程)
VOID MyDDKUnload(IN PDRIVER_OBJECT pDriverObj)
{
PDEVICE_OBJECT pNexDev;
pNexDev = pDriverObj->DeviceObject;
while(pNexDev != NULL)
{
PDEVICE_EXTENSION pDevExt;
pDevExt =(PDEVICE_EXTENSION)(pNexDev->DeviceExtension);
//删除符号链接
IoDeleteSymbolicLink(&(pDevExt->ustrSymLinkName));
pNexDev = pDevExt->pNexDeviceObj;
IoDeleteDevice(pDevExt->pDeviceObj);
}
KdPrint(("卸载成功!"));
}
还有这个结构体
typedef struct DEVICE_EXTENSION
{
PDEVICE_OBJECT pDeviceObj;
PDEVICE_OBJECT pNexDeviceObj;
UNICODE_STRING ustrDeviceName;
UNICODE_STRING ustrSymLinkName;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION; |
|