首页
社区
课程
招聘
未解决 [求助]加载驱动GetLastError代码123文件名、目录名或卷标语法不正确。
发表于: 2020-1-28 19:05 3364

未解决 [求助]加载驱动GetLastError代码123文件名、目录名或卷标语法不正确。

2020-1-28 19:05
3364
调用代码:
dr->LoadDriver(FileName)
加载代码:
wchar_t  szDriverImagePath[256];
    CString  strDriverImagePath;
    //得到完整的驱动路径
    GetFullPathName(strDriverPath, 256, szDriverImagePath, NULL);
    strDriverImagePath = szDriverImagePath;


    if (strDriverImagePath.IsEmpty()) {
        MessageBoxW(0, L" CLoadDriver::installDriver: 请输入路径名", NULL, MB_OK | MB_ICONWARNING);
        return FALSE;
    }
    if (!pathIsFile(strDriverImagePath)) {
        strDriverImagePath += L"loadNTDriver:文件不存在";
        MessageBoxW(0, strDriverImagePath, NULL, MB_OK | MB_ICONWARNING);
        return FALSE;
    }

    // 提取驱动名
    int nPos;
    nPos = strDriverImagePath.ReverseFind(_T('\\'));

    m_strDvrName = strDriverImagePath.Right(nPos - 1);
    nPos = m_strDvrName.ReverseFind(_T('.'));
    m_strDvrName = m_strDvrName.Left(nPos);

    swprintf_s(m_szServerName, m_strDvrName + L"_ServerName");
    swprintf_s(m_szShowName, m_strDvrName + L"_ShowName");

    AfxMessageBox(strDriverImagePath);
    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失败
        showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver");
        bRet = FALSE;
        goto BeforeLeave;
    }
    else {
        //OpenSCManager成功
        showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");
    }

    //创建驱动所对应的服务
    hServiceDDK = CreateService(hServiceMgr,
        m_szServerName,                //驱动程序的在注册表中的名字  
        m_szShowName,                // 注册表驱动程序的 DisplayName 值  
        SERVICE_ALL_ACCESS,            // 加载驱动程序的访问权限  
        SERVICE_KERNEL_DRIVER,        // 表示加载的服务是驱动程序  
        SERVICE_DEMAND_START,        // 注册表驱动程序的 Start 值  
        SERVICE_ERROR_IGNORE,        // 注册表驱动程序的 ErrorControl 值  
        strDriverImagePath,            // 注册表驱动程序的 ImagePath 值  
        NULL,
        NULL,
        NULL,
        NULL,
        NULL);

    DWORD dwRtn;
    //判断服务是否失败
    if (hServiceDDK == NULL)
    {
        dwRtn = GetLastError();
        if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS)
        {
            //由于其他原因创建服务失败
            //printf("CrateService() Faild %d ! \n", dwRtn);
            showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");
            bRet = FALSE;
            goto BeforeLeave;
        }
        else
        {
            //服务创建失败,是由于服务已经创立过
            //printf("CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n");
            showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");
        }

        // 驱动程序已经加载,只需要打开  
        hServiceDDK = OpenService(hServiceMgr, m_szServerName, SERVICE_ALL_ACCESS);
        if (hServiceDDK == NULL)
        {
            //如果打开服务也失败,则意味错误
            dwRtn = GetLastError();
            printf("OpenService() Faild %d ! \n", dwRtn);
            bRet = FALSE;
            goto BeforeLeave;
        }
    }

    //开启此项服务
    bRet = StartService(hServiceDDK, NULL, NULL);
    if (!bRet)
    {
        DWORD dwRtn = GetLastError();
        if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING)
        {
            //printf("StartService() Faild %d ! \n", dwRtn);
            showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");
            bRet = FALSE;
            goto BeforeLeave;
        }
        else
        {
            if (dwRtn == ERROR_IO_PENDING)
            {
                //设备被挂住
                //printf("StartService() Faild ERROR_IO_PENDING ! \n");
                showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");
                bRet = FALSE;
                goto BeforeLeave;
            }
            else
            {
                //服务已经开启
                //printf("StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
                showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");
                bRet = TRUE;
                goto BeforeLeave;
            }
        }
    }
    bRet = TRUE;
    //离开前关闭句柄
BeforeLeave:
    if (hServiceDDK) {
        CloseServiceHandle(hServiceDDK);
    }
    if (hServiceMgr) {
        CloseServiceHandle(hServiceMgr);
    }

    return bRet;

有没有大神解答下

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 198
活跃值: (81)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
2020-1-28 19:25
0
雪    币: 7104
活跃值: (3166)
能力值: ( LV4,RANK:52 )
在线值:
发帖
回帖
粉丝
3
你用管理员权限试试,有可能你的驱动不是你目标平台的
最后于 2020-1-28 20:50 被不对编辑 ,原因:
2020-1-28 20:48
1
雪    币: 198
活跃值: (81)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
不对 你用管理员权限试试,有可能你的驱动不是你目标平台的
谢谢了,我大概找到原因了
2020-1-28 21:28
0
游客
登录 | 注册 方可回帖
返回
//