簡體   English   中英

Windows 7驅動程序服務啟動

[英]Windows 7 driver service start

我試圖在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:\\Windows\\System32\\drivers\\KMDFDriver2.sys文件,它將獲得C:\\Windows\\SysWOW64\\drivers\\KMDFDriver2.sys路徑。 為了避免這種情況,請嘗試使用Wow64DisableWow64FsRedirection()函數。

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

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

如果沒有幫助,請檢查您的UNICODE_UNICODE定義。由於您使用的是使用LPCSTR DBG_TRACE ,因此可能未定義。 Unicode字符串將是有效的ANSI字符串,但將被截斷為第一個零字節-並且只有1個字符。 因此,Windows無法使用名為"C"二進制路徑訪問名為"K"驅動程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM