| 
 | 
 
就是 只会删除第二个设备对象 和符号连接,而第一个创建的设备对象和他符号连接不会被删除 , 
这是什么原因啊? 
 
 
不清楚 是否能这样写(那本 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; |   
 
 
 
 |