4

私はドライバーをインストールする手段に取り組んでいます。これが機能しなければならない複数のプラットフォームがあるため、必要に応じてドライバーのインストール/更新/削除の作業を行うために、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フラグを指定しなかった場合に、このエラーコードを返します。 。」私のコードから、このフラグを指定したことがわかります。

ここからどこへ行けばいいのかわからない。誰かがこのコードから私が欠けているものを特定できますか?これは単純なものの「感触」を持っているだけですが、私はそれを完全に見逃しています。

ありがとう、アンディ

4

1 に答える 1

3

問題はコードではなく、INF ファイルにあるようです。関数のドキュメントには、そのフラグを使用するとインストールが強制されると記載されていましたが、INF ファイルのモデル セクションにデバイス クラスが "リスト" されていない場合は強制的にインストールされませんでした。これで、最終的にインストールできました。INF のモデル セクションに正しいデバイス クラスを追加しました。


EDIT 2020年9月17日 INFからの例を追加するために、今日(編集の)誰かから要求されました。この問題が発生してから 8 年が経ちましたが、私はこのチームで働いていません。ただし、思い出せる限り、 INF モデル セクションINF メーカー セクションのドキュメントを大いに参考にして、これがお役に立てば幸いです。

基本的に、クラスはモデル セクションで指定され、モデルはメーカー セクションで指定されます。

[Manufacturer]
%MfgName%=Standard,NTamd64

[Standard.NTamd64]
%DeviceString%=<class path or GUID>\<device>

[Strings]
MfgName=ACME
DeviceString="Device Type"
于 2012-07-17T15:43:54.840 に答える