whatcantuse
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望207点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2981回复:7

中间层驱动问题(寒江独钓)恳请版主帮忙,谢谢

楼主#
更多 发布于:2010-09-27 19:43
买了寒江独钓,阅读最后一章,中间层驱动时,发现书中和代码中不一致。在hook.c的myAddDevice函数中if(gDeviceObject != NULL)
应该按书中的if(gDeviceObject == NULL),我改完后,并添加了符号链接。编译安装后,不能打开我创建的符号链接,但可以打开原有的符号链接。而且,发现myAddDevice中增加的控制设备,好像实际并没有创建成功,在设备管理器中并没有(我已经显示了隐藏的设备),原有passthru设备创建成功。
                        恳请指教!
                             谢谢
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2010-09-29 10:08
1. 先使用Winobj工具查看这个符号链接是否存在。
2. 你打开符号链接的代码贴出来。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
whatcantuse
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望207点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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);
}
whatcantuse
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望207点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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("打开驱动失败!");
    }
whatcantuse
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望207点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-10-10 16:33
如果我打开passthru这个符号链接可以正常打开
whatcantuse
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望207点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2010-10-14 07:09
好冷清阿
whatcantuse
驱动牛犊
驱动牛犊
  • 注册日期2004-05-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望207点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-10-14 21:39
来个人看看阿 !谢谢!!!
diaowubin
驱动牛犊
驱动牛犊
  • 注册日期2008-02-08
  • 最后登录2017-10-12
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望159点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分5分
  • 社区居民
7楼#
发布于:2010-10-14 23:14
用户态打开失败的时候,取下GetLastError。打开设备时跟踪下IRP_MJ_CREATE的处理代码,注意返回的NTSTATUS
游客

返回顶部