Windows 7 驱动程序服务启动

Windows 7 driver service start

本文关键字:启动 服务 驱动程序 Windows      更新时间:2023-10-16

我正在尝试在Windows 7上运行驱动程序服务。首先,我的代码安装服务,然后尝试运行它。我的问题是 StartService 返回错误代码 2 - "系统找不到指定的文件。

驱动程序和代码是在 Windows 10 中开发的,在 32 位 win7 虚拟机上调试。但是,该驱动程序是为Windows 7开发的。

Procmon在StartService - services中表现出非常奇怪的行为.exe只查询了HKLM\System\CurrentControlSet\services\KMDFDriver2\ObjectName键,该键不存在。.sys文件的路径位于 HKLM\System\CurrentControlSet\services\KMDFDriver2\ImagePath 中。我怀疑这可能是原因。

你能帮忙吗?

SC_HANDLE InstallDriver(LPCWSTR driverName, LPCWSTR binaryPath)
{
    SC_HANDLE scmDBHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (scmDBHandle == NULL)
    {
        DBG_TRACE("InstallDriver", "could not open handle to SCM database");
        PrintError();
        return NULL;
    }
    SC_HANDLE svcHandle = CreateService(
        scmDBHandle,
        driverName,
        driverName,
        SERVICE_ALL_ACCESS,
        SERVICE_KERNEL_DRIVER,
        SERVICE_DEMAND_START,
        SERVICE_ERROR_NORMAL,
        binaryPath,
        NULL, NULL, NULL, NULL, NULL
    );
    if (svcHandle == NULL)
    {
        DWORD lastError = GetLastError();
        if (lastError == ERROR_SERVICE_EXISTS)
        {
            DBG_TRACE("InstallDriver", "driver already installed");
            svcHandle = OpenService(scmDBHandle, driverName, SERVICE_ALL_ACCESS);
            if (svcHandle == NULL)
            {
                DBG_TRACE("InstallDriver", "could not open handle to driver");
                PrintError();
                CloseServiceHandle(scmDBHandle);
                return NULL;
            }
            CloseServiceHandle(scmDBHandle);
            return svcHandle;
        }
        DBG_TRACE("InstallDriver", "could not create handle to driver");
        PrintError();
        return NULL;
    }
    DBG_TRACE("InstallDriver", "Function returning succesfuly");
    CloseServiceHandle(scmDBHandle);
    return svcHandle;
}
BOOL LoadDriver(SC_HANDLE svcHandle)
{
    //DebugBreak();
    if (StartService(svcHandle, 0, NULL) == 0)
    {   
        if (GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
        {
            DBG_TRACE("loadDriver", "driver already running");
            return TRUE;
        }
        else
        {
            DBG_TRACE("loadDriver", "driver failed loading");
            PrintError();
            return FALSE;
        }
    }
    DBG_TRACE("loadDriver", "driver loaded succesfuly");
    return TRUE;
}

int main() {
    SC_HANDLE driver = InstallDriver(L"KMDFDriver2", L"C:\Windows\System32\drivers\KMDFDriver2.sys");
    LoadDriver(driver);
    CloseServiceHandle(driver);
}

如果您的驱动程序安装程序编译为 x86 并在 x64 Windows 上运行,则 Windows 文件系统和注册表重定向可能存在此问题。简而言之 - %WINDIR%SysWoW64中放置了 x86 环境的不同目录,%WINDIR%System32 中放置了本机 x64 环境。如果您的 x86 安装程序尝试打开C:WindowsSystem32driversKMDFDriver2.sys文件,它将获取C:WindowsSysWOW64driversKMDFDriver2.sys路径。为避免这种情况,请尝试使用Wow64DisableWow64FsRedirection()函数。

https://en.wikipedia.org/wiki/WoW64#Registry_and_file_system

https://technet.microsoft.com/ru-ru/aa384187

如果它没有帮助,请检查您的UNICODE_UNICODE定义,因为您使用DBG_TRACE使用LPCSTR,因此可能未定义。Unicode 字符串将是有效的 ANSI 字符串,但它将被截断为第一个零字节 - 并且只有 1 个字符。因此,Windows 无法访问名为 "K" 的二进制路径名为 "C" 的驱动程序