2011-06-24 122 views
5

可能有人在這裏請讓我知道如果提供所有必需的文件即inf文件,.SYS等如何安裝第三方設備驅動程序 。該解決方案的最低操作系統 應該工作在Windows2000上。了安裝驅動程序使用INF文件C++

我試圖複製.inf文件入勝的文件夾\ INF文件夾和sys文件 入勝的文件夾\ SYSTEM32 \ DRIVERS但每次插上設備,窗戶 彈出找到新硬件的用戶界面是什麼我試圖避免。

下面是一些我試過,但該函數返回error 87 (The parameter is incorrect)

HINF HInf;     
UINT ErrorLine;    
BOOL bRes = FALSE; 
PBOOL FileWasInUse = FALSE; 

LPCSTR szSourceFileName = _T("C:\\Drivers_HypercomP1320\\hypvcpusb.inf"); 
LPCSTR szInfFileName = _T("hypvcpusb.inf"); 
PVOID Context = NULL; 

HInf = SetupOpenInfFile (szSourceFileName, NULL, INF_STYLE_WIN4, &ErrorLine);   

LPCSTR SourceFile = ("hypvcp.sys"); 
LPCSTR SourcePathRoot = _T("C:\\Drivers_HypercomP1320"); 
LPCSTR DestinationName = _T("C:\\WINDOWS\\system32\\drivers\\hypvcp.sys"); 

bRes = SetupInstallFileEx (HInf, NULL, SourceFile, SourcePathRoot, DestinationName, SP_COPY_FORCE_IN_USE, 
          (PSP_FILE_CALLBACK)CopyMsgHandler, Context, FileWasInUse); 

DWORD dwVal = GetLastError(); 

SetupCloseInfFile(HInf); 


// Callback function 
UINT CopyMsgHandler (UINT Context, UINT Notification,UINT_PTR Param1, UINT_PTR Param2) 
{ 
    UINT rtnValue = NO_ERROR; 
    return rtnValue; 
} 

謝謝。

+0

右鍵單擊INF文件,然後點擊安裝。 – Aristos

+0

@Aristos:你甚至可以使用一個Java機器人爲你做這件事:-) – 2011-06-24 20:04:32

+1

Guyz感謝你的回覆,但驅動程序的安裝是用C,C++編程的。 – newdev1

回答

1

您可以使用InstallHinfSection

+0

我使用批處理文件對其進行了快速測試,但此API未在Windows Vista上安裝驅動程序。當我插入設備的窗口彈出發現新的硬件UI RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection TI3410.Uni 128 C:\\ Drivers_Test \\ Testusb.inf – newdev1

2

這可能是你的

PBOOL FileWasInUse的使用= FALSE;

。你應該改變它

BOOL FileWasInUse = FALSE;

,並在函數調用與& FileWasInUse(注意&個字符數)使用它。

+0

+1 MSDN說這個參數是必需的,傳遞一個NULL指針將導致錯誤87. –

+0

你是對的,該功能現在正確執行,但一旦我插入設備「發現新硬件」嚮導仍然彈出。我甚至嘗試重新啓動電腦並再次插入設備,但結果相同。有沒有另一種方法可以用來安裝驅動程序? – newdev1

+0

@ newdev1:我真的不知道,我只是發現了編程錯誤。但對我而言,這聽起來像是一個新問題的好材料! –

0

是的。你開始通過調用

SC_HANDLE經理= OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); (經理) wprintf(L「Opened SC Manager \ n」); } 別的 { wprintf(L 「打開SC管理器失敗\ n」); return; }

然後具有存儲在szInfFileName調用.inf文件:

HInf = SetupOpenInfFile(szInfFileName.c_str(), NULL, INF_STYLE_WIN4, &ErrorLine); 

然後調用

if (SetupInstallFileEx(HInf, NULL, SourceFile, SourcePathRoot, DestinationName, SP_COPY_NEWER_OR_SAME, NULL, Context, &FileWasInUse) == NULL) 

的SourceFile =驅動程序文件名(含的.sys結尾) SourcePathRoot =驅動程序文件的位置(將你的程序運行,從路徑) DestinationName =要安裝的驅動程序的完整路徑(例如:

c:\windows\system32\drivers\yourdriver.sys 

然後是註冊表。你需要在

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ 

這個條目(鍵)應該添加一個條目爲您的驅動程序: 驅動程序名稱,顯示名稱,描述,ErrorControl和集團。

下一步,您可以使用啓動驅動程序:

SC_HANDLE service = CreateService(manager, 
        DRIVER_NAME, 
        DRIVER_NAME, 
        SERVICE_ALL_ACCESS, 
        SERVICE_KERNEL_DRIVER, 
        SERVICE_AUTO_START, 
        SERVICE_ERROR_NORMAL, 
        KeyName, 
        NULL, NULL, NULL, NULL, NULL); 

當鍵名是System32下根據駕駛員的路徑出現在註冊表項。例如:

system32\drivers\yourdriver.sys 

最後一步:

BOOL result = StartService(service, 0, NULL); 

和清理

CloseServiceHandle(manager) 
相關問題