tosiz
驱动牛犊
驱动牛犊
  • 注册日期2007-03-03
  • 最后登录2010-07-10
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望21点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1217回复:0

USB过滤驱动安装问题

楼主#
更多 发布于:2007-03-27 20:06
无意中 获得 USB 过滤驱动一份
有禁止,启用,只读USB的功能

我如何在我的程序中使用这个第三方过滤驱动?

目前个人解决办法:
1.参照了 武安河 大侠的过滤驱动开发,里面有介绍如何使用第三方过滤驱动的
我依样画瓢,可是再 StartService时候却总是失败
代码如下:

    // 获取驱动驱动程序ProcDrv.sys的完整目录
    // 注意,您应该将ProcDrv工程编译产生的ProcDrv.sys文件复制到当前工程目录下
    char szDriverPath[256];
    char szLinkName[] = "UsbCtrl";
//    char* p;
//    ::GetFullPathName("usbfilter.sys", 256, szDriverPath, &p);
    //
//    ::GetWindowsDirectory(szDriverPath,256);
    
//    PathAppend(szDriverPath,"SYSTEM32\\Drivers");
//    PathAppend(szDriverPath,"usbfilt.sys");
    typedef void (*_Install)();
    HINSTANCE hLib=LoadLibrary("USBCtrlDll.dll");

    _Install Install=(_Install)GetProcAddress(hLib,"Install");

    

    Install();
    FreeLibrary(hLib);


    // 打开SCM管理器
    m_hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if(m_hSCM == NULL)
    {
        printf(" 打开服务控制管理器失败,可能是因为您不拥有Administrator权限\n");
        ::CloseServiceHandle(m_hSCM);
        return;
    }

    // 创建或打开服务
    m_hService = ::CreateService(m_hSCM, szLinkName, szLinkName, SERVICE_ALL_ACCESS,
                SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
                szDriverPath, NULL, 0, NULL, NULL, NULL);
    if(m_hService == NULL)
    {
        int nError = ::GetLastError();
        if(nError == ERROR_SERVICE_EXISTS || nError == ERROR_SERVICE_MARKED_FOR_DELETE)
        {
            m_hService = ::OpenService(m_hSCM, szLinkName, SERVICE_ALL_ACCESS);
        }
    }
    if(m_hService == NULL)
    {
        printf(" 创建服务出错!\n");
        ::DeleteService(m_hService);
        ::CloseServiceHandle(m_hService);
        ::CloseServiceHandle(m_hSCM);

        return;
    }
    // 启动服务
    if(!::StartService(m_hService, 0, NULL))  // 这里调用DriverEntry例程
    {
        int nError = ::GetLastError();
        if(nError != ERROR_SERVICE_ALREADY_RUNNING)
        {    
            printf(" 启动服务出错!%d \n", nError);
            ::DeleteService(m_hService);
            ::CloseServiceHandle(m_hService);
            ::CloseServiceHandle(m_hSCM);
            return;
        }
    }


    // 打开到驱动程序所控制设备的句柄
    char sz[256] = "";
    wsprintf(sz, "\\\\.\\%s", szLinkName);
    m_hDriver = ::CreateFile(sz,
        GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(m_hDriver == INVALID_HANDLE_VALUE)
    {    
        printf(" 打开设备失败! \n");
        ::DeleteService(m_hService);
        ::CloseServiceHandle(m_hService);
        ::CloseServiceHandle(m_hSCM);
        return;
    }

这是,我用来安装驱动的代码!其中的USBCtrlDll.dll是 我根据 ds32生成的WDM 过滤驱动而
得来,用来安装 过滤驱动使用的Dll!武安河 大侠 那本书,也是如此安装第三方驱动的


2.使用ddk改写的 Inf文件安装,发现效果没有,用 Symbolic Link Viewer 查看,发现没有
安装成功的 符号连接



请大侠们 针对如此问题,帮忙看下问题的所在,给给建议!不胜感激!
希望给出详细解答!
游客

返回顶部