阅读:2981回复:7
中间层驱动问题(寒江独钓)恳请版主帮忙,谢谢
买了寒江独钓,阅读最后一章,中间层驱动时,发现书中和代码中不一致。在hook.c的myAddDevice函数中if(gDeviceObject != NULL)
应该按书中的if(gDeviceObject == NULL),我改完后,并添加了符号链接。编译安装后,不能打开我创建的符号链接,但可以打开原有的符号链接。而且,发现myAddDevice中增加的控制设备,好像实际并没有创建成功,在设备管理器中并没有(我已经显示了隐藏的设备),原有passthru设备创建成功。 恳请指教! 谢谢 |
|
沙发#
发布于:2010-09-29 10:08
1. 先使用Winobj工具查看这个符号链接是否存在。
2. 你打开符号链接的代码贴出来。 |
|
|
板凳#
发布于:2010-10-10 16:31
我用winobj看了创建的符号连接和设备都有,但是就是打不开。
驱动代码如下 NTSTATUS myAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ) { if(gDeviceObject == NULL) { // 在这里面创建我们自己的设备对象,或者申请所需要的资源。 // 为了区分不同实例,将设备对象名构造成:”MyNdisDevice”+HardwareID。 UNICODE_STRING nameString; WCHAR wcsName[256]; UNICODE_STRING preName = RTL_CONSTANT_STRING(L"\\Device\\MyNdisDevice"); //////////////////////////////////// /////////////////////////////////我添加的 UNICODE_STRING symb_link =RTL_CONSTANT_STRING(L"\\DosDevices\\MyNdisDOSL"); // 首先取得设备的HDID。 ULONG nameLength = 0; WCHAR wcsHardwareID[256]; //足够大了 NTSTATUS status = IoGetDeviceProperty (PhysicalDeviceObject, DevicePropertyHardwareID, 256, wcsHardwareID, &nameLength); if(status != STATUS_SUCCESS){ KdPrint(("Failed to get hardware ID %x\n", status)); return status; } KdPrint(("Success to txf Adddevice")); // 下面构造设备对象的名字,根据上面的规则:“MyNdisDevice”+ HardwareID。 RtlInitEmptyUnicodeString( &nameString, wcsName, 256*2); RtlCopyUnicodeString( &nameString, &preName); //RtlUnicodeStringPrintf(&nameString, L"%wZ_%d_", &preName, 0); RtlAppendUnicodeToString( &nameString, wcsHardwareID); status = IoCreateDevice(DriverObject, 0, &nameString, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &gDeviceObject); // 如果创建失败了,我们有权利让函数以失败返回 // 但这样我们的驱动加载也就失败了 if(status != STATUS_SUCCESS){ KdPrint(("Failed to create device %ws\n", nameString)); return status; } KdPrint(("Success to txf Create device")); //////////////////////////////////////////// ///////////////////////////////////我添加的 // // 生成符号链接 status = IoCreateSymbolicLink(&symb_link,&nameString); if(status != STATUS_SUCCESS) { KdPrint(("Failed to create device Dosl %ws\n", symb_link)); IoDeleteDevice(gDeviceObject); return status; } KdPrint(("Success to txf Create Dosl")); } //ExAllocatePoolWithTag(); //申请资源及其他 // // 还可以加入其他正确的操作 // // 现在调用保存的Ndis库中的AddDevice实现 // 千万不要忘记,否则就会大错特错了 return systemAddDevice(DriverObject, PhysicalDeviceObject); } |
|
地板#
发布于:2010-10-10 16:32
应用层代码如下
m_hDevice = CreateFile("\\\\.\\MyNdisDOSL", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (m_hDevice == INVALID_HANDLE_VALUE) { AfxMessageBox("打开驱动失败!"); } |
|
地下室#
发布于:2010-10-10 16:33
如果我打开passthru这个符号链接可以正常打开
|
|
5楼#
发布于:2010-10-14 07:09
好冷清阿
|
|
6楼#
发布于:2010-10-14 21:39
来个人看看阿 !谢谢!!!
|
|
7楼#
发布于:2010-10-14 23:14
用户态打开失败的时候,取下GetLastError。打开设备时跟踪下IRP_MJ_CREATE的处理代码,注意返回的NTSTATUS
|
|