zoukankan      html  css  js  c++  java
  • 以NT方式安装驱动

    不想说什么,固定模式:

    //装载NT驱动程序
    BOOL LoadNTDriver(TCHAR* lpDriverName, TCHAR* lpDriverPathName)
    {
        BOOL bRet = FALSE;
    
        SC_HANDLE hServiceMgr = NULL;//SCM管理器的句柄
        SC_HANDLE hServiceDDK = NULL;//NT驱动程序的服务句柄
    
                                     //打开服务控制管理器
        hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    
        if (hServiceMgr == NULL)
        {
            //OpenSCManager失败
            TRACE("OpenSCManager() Faild %d ! 
    ", GetLastError());
            bRet = FALSE;
            goto BExit;
        }
        else
        {
            //OpenSCManager成功
            TRACE("OpenSCManager() ok ! 
    ");
        }
    
        //创建驱动所对应的服务
        hServiceDDK = CreateService(hServiceMgr,
            lpDriverName, //驱动程序的在注册表中的名字  
            lpDriverName, // 注册表驱动程序的 DisplayName 值  
            SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限  
            SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  
            SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值  
            SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  
            lpDriverPathName, // 注册表驱动程序的 ImagePath 值  
            NULL,
            NULL,
            NULL,
            NULL,
            NULL);
    
        DWORD dwRtn = 0;
        //判断服务是否失败
        if (hServiceDDK == NULL)
        {
            dwRtn = GetLastError();
            if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS)
            {
                //由于其他原因创建服务失败
                TRACE("CrateService() 失败 %d ! 
    ", dwRtn);
                bRet = FALSE;
                goto BExit;
            }
            else
            {
                //服务创建失败,是由于服务已经创立过
                TRACE("CrateService() 服务创建失败,是由于服务已经创立过 ERROR is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! 
    ");
            }
    
            // 驱动程序已经加载,只需要打开  
            hServiceDDK = OpenService(hServiceMgr, lpDriverName, SERVICE_ALL_ACCESS);
            if (hServiceDDK == NULL)
            {
                //如果打开服务也失败,则意味错误
                dwRtn = GetLastError();
                TRACE("OpenService() 失败 %d ! 
    ", dwRtn);
                bRet = FALSE;
                goto BExit;
            }
            else
            {
                TRACE("OpenService() 成功 ! 
    ");
            }
        }
        else
        {
            TRACE("CrateService() 成功 ! 
    ");
        }
    
        //开启此项服务
        bRet = StartService(hServiceDDK, NULL, NULL);
        if (!bRet)  //开启服务不成功
        {
            dwRtn = GetLastError();
            TRACE("StartService() 失败 服务可能已经开启%d ! 
    ", dwRtn);
        }
    
        bRet = TRUE;
    
        //离开前关闭句柄
    BExit:
        if (hServiceDDK)
        {
            CloseServiceHandle(hServiceDDK);
        }
        if (hServiceMgr)
        {
            CloseServiceHandle(hServiceMgr);
        }
        return bRet;
    }
    //卸载驱动程序  
    BOOL UnLoadSys(TCHAR * szSvrName)
    {
        //一定义所用到的变量
        BOOL bRet = FALSE;
        SC_HANDLE hSCM = NULL;//SCM管理器的句柄,用来存放OpenSCManager的返回值
        SC_HANDLE hService = NULL;//NT驱动程序的服务句柄,用来存放OpenService的返回值
        SERVICE_STATUS SvrSta;
    
        //二打开SCM管理器
        hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if (hSCM == NULL)
        {
            //带开SCM管理器失败
            TRACE("OpenSCManager() Faild %d ! 
    ", GetLastError());
            bRet = FALSE;
            goto BeforeLeave;
        }
        else
        {
            //打开SCM管理器成功
            TRACE("OpenSCManager() ok ! 
    ");
        }
    
        //三打开驱动所对应的服务
        hService = OpenService(hSCM, szSvrName, SERVICE_ALL_ACCESS);
    
        if (hService == NULL)
        {
            //打开驱动所对应的服务失败 退出
            TRACE("OpenService() Faild %d ! 
    ", GetLastError());
            bRet = FALSE;
            goto BeforeLeave;
        }
        else
        {
            TRACE("OpenService() ok ! 
    ");  //打开驱动所对应的服务 成功
        }
    
        //四停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。  
        if (!ControlService(hService, SERVICE_CONTROL_STOP, &SvrSta))
        {
            TRACE("用ControlService() 停止驱动程序失败 错误号:%d !
    ", GetLastError());
        }
        else
        {
            //停止驱动程序成功
            TRACE("用ControlService() 停止驱动程序成功 !
    ");
        }
    
        //五动态卸载驱动服务。  
        if (!DeleteService(hService))  //TRUE//FALSE
        {
            //卸载失败
            TRACE("卸载失败:DeleteSrevice()错误号:%d !
    ", GetLastError());
        }
        else
        {
            //卸载成功
            TRACE("卸载成功 !
    ");
        }
    
        bRet = TRUE;
    
        //六 离开前关闭打开的句柄
    BeforeLeave:
        if (hService>0)
        {
            CloseServiceHandle(hService);
        }
    
        if (hSCM>0)
        {
            CloseServiceHandle(hSCM);
        }
        return bRet;
    }
        BOOL bRet = TRUE;
    
        bRet = LoadNTDriver(_T("eyou_driver"), _T("D:\xxx\x64\PGame.sys"));
        if (bRet == TRUE){
            AfxMessageBox(_T("安装成功"));
        }
        else {
            AfxMessageBox(_T("安装失败"));
        }
    
    
        UnLoadSys(_T("eyou_driver"));
  • 相关阅读:
    吴裕雄--天生自然WEB前端开发实战--Ajax
    吴裕雄--天生自然WEB前端开发实战--jQuery
    吴裕雄--天生自然WEB前端开发实战--数据验证
    吴裕雄--天生自然WEB前端开发实战--DOM编程
    cpodeblocks+freeglut+glew 用到的库文件上传到附件 亲测可用
    haizei c++ 试听课程知识点 day2 --第2讲
    vim命令 转
    hizei c++ 试听课程知识点 day2
    haizei c++ 试听课程知识点 day1
    C#连接SQL Server时提示'用户登录失败'
  • 原文地址:https://www.cnblogs.com/signal/p/8329109.html
Copyright © 2011-2022 走看看