2011-06-24 15 views
5

Czy ktoś mógłby mi tutaj podać programistycznie instalowanie sterowników urządzeń innych firm, , jeśli dostępne są wszystkie wymagane pliki, tj. Plik inf, .sys itd. Minimalny system operacyjny dla tego rozwiązania, którego POWINIENEś PRACOWAĆ, to Windows 2000.Instalowanie sterownika programowo przy użyciu pliku INF C++

Próbowałem kopiowania pliku .inf do folderu Win Folder \ INF i plik sys do folderu Win \ system32 \ drivers ale każdy korek czasową w urządzeniu, okna wyskakuje Znaleziono nowy interfejs użytkownika Hardware czyli co Próbuję unikać.

Poniżej jest coś, co próbowałem, ale funkcja zwraca 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; 
} 

Dzięki.

+0

prawym przyciskiem myszy na pliku inf, a następnie kliknij przycisk Zainstaluj. – Aristos

+0

@Aristos: Możesz nawet użyć robota Java, aby to zrobić :-) –

+1

Dziękuję za odpowiedź, ale instalacja sterowników jest programowa w C, C++. – newdev1

Odpowiedz

1

Można użyć InstallHinfSection.

+0

Podałem szybki test przy użyciu pliku wsadowego, ale ten interfejs API nie instaluje sterowników w systemie Windows Vista. Po podłączeniu urządzenia pojawia się okno Found New Hardware UI RUNDLL32.EXE SETUPAPI.DLL, InstallHinfSection TI3410.Uni 128 C: \\ Drivers_Test \\ Testusb.inf – newdev1

2

To może być korzystanie z

PBOOL FileWasInUse = false;

. Należy go zmienić w:

BOOL FileWasInUse = FALSE;

i używać go w funkcji-rozmowy z & FileWasInUse (zauważ & dwuznakowego).

+0

+1 MSDN mówi, że ten parametr jest wymagany, przekazując NULL wskaźnik spowoduje błąd 87. –

+0

masz rację, funkcja działa teraz poprawnie, ale po podłączeniu urządzenia pojawi się kreator "Znaleziono nowy sprzęt". Próbowałem nawet ponownie uruchomić komputer i ponownie podłączyć urządzenie, ale ten sam wynik. Czy istnieje inne podejście, które może posłużyć do zainstalowania sterowników? – newdev1

+0

@ newdev1: Naprawdę nie wiem, właśnie zauważyłem błąd programowania. Ale brzmi dla mnie jak dobry materiał do nowego pytania! –

0

Tak. Zaczynasz od wywołania

SC_HANDLE manager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS); if (manager) { wprintf (L "Menedżer otwartych SC \ n"); } else { wprintf (L "Otwarty menedżer SC nie powiodło się \ n"); return; }

Następnie mając plik inf przechowywane w szInfFileName zadzwonić:

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

Następnie zadzwonić

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

SourceFile = nazwę pliku sterownika (Ending z sys) SourcePathRoot = lokalizacja pliku sterownika (byłaby to ścieżka, z której uruchamiany jest program) DestinationName = pełna ścieżka instalowanego sterownika (na przykład:

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

)

Wtedy nie ma rejestru.Trzeba dodać wpis do sterownika pod

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\ 

tego wpisu (key) powinni posiadać: nazwa sterownika, nazwa wyświetlana, opis ErrorControl i Grupy.

Następny krok, po uruchomieniu sterownika za pomocą:

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); 

Kiedy nazwa_klucza jest ścieżka kierowcy pod System32 jak pojawił się wpis rejestru. Na przykład:

system32\drivers\yourdriver.sys 

ostatni krok:

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

i oczyszczania

CloseServiceHandle(manager) 
Powiązane problemy