私はドライバーをインストールする手段に取り組んでいます。これが機能しなければならない複数のプラットフォームがあるため、必要に応じてドライバーのインストール/更新/削除の作業を行うために、devconとdpinstの両方にシェルアウトしています。テスト中、devconへのシェルアウトに問題があります。分離するために、WinDDKのdevconソースを参照して使用して、更新時にdevconが行うことを実行する小さなアプリを作成しました。Setup API(実際にはNewdev.dllの一部)のUpdateDriverForPlugAndPlayDevices()で問題が発生しています。こちらをご覧ください。ソースコードはここにあります:
#include <iostream>
#include <Windows.h>
#include <newdev.h>
int main(int argc, char** argv) {
// Go through the same steps as does dev con for this update crap
char infFile[MAX_PATH];
if(3 > argc) {
std::cerr << "an INF and HW ID must be specified" << std::endl;
return 1;
}
DWORD result(GetFullPathName(argv[1], MAX_PATH, infFile, NULL));
if((result >= MAX_PATH) || (0 == result)) {
std::cerr << "path is too long for buffer" << std::endl;
return 1;
}
if(GetFileAttributes(infFile) == -1) {
std::cerr << "file doesn't exist" << std::endl;
return 1;
}
BOOL reboot(FALSE);
if(!UpdateDriverForPlugAndPlayDevices(NULL, argv[2], infFile, INSTALLFLAG_FORCE, &reboot)) {
std::cerr << "Failed to install the driver. Code: "
<< GetLastError()
<< std::endl;
return 2;
}
if(reboot) {
std::cout << "A reboot is needed to complete driver install"
<< std::endl;
}
return 0;
}
UpdateDriverForPlugAndPlayDevices()がfalseを返すと、プログラムは失敗します。これにより、GetLastError()によって返されたエラーコードが出力されるため、何が問題だったのかがわかります。返されたエラーコード:259。このリソースによると、これはERROR_NO_MORE_ITEMSであるとのことです。UpdateDriverForPlugAndPlayDevices()のリンクによると、この関数は、「関数がHardwareId値と一致するものを検出したが、指定されたドライバーが現在のドライバーよりも一致せず、呼び出し元がINSTALLFLAG_FORCEフラグを指定しなかった場合に、このエラーコードを返します。 。」私のコードから、このフラグを指定したことがわかります。
ここからどこへ行けばいいのかわからない。誰かがこのコードから私が欠けているものを特定できますか?これは単純なものの「感触」を持っているだけですが、私はそれを完全に見逃しています。
ありがとう、アンディ