2

Windows セットアップ プロジェクト中にドライバーをインストールしようとしています。

最初に、INF ファイルをコピーしてドライバーをプレインストールします。

SetupCopyOEMInf(infFile, null, 1, 0, null, 0, 0, null);

これにより、ドライバーが正しくプレインストールされますが、デバイス マネージャーでハードウェアの再スキャンが行われるまで、デバイスを使用する準備ができていません。これも自動化したい。setupapi.dll を使用してハードウェアの再スキャンを実行しようとしましたが、常に成功するとは限りませんでした。devcon.exe rescan を使用すると、常にハードウェアの再スキャンが強制されますが、これは同期コマンドであり、デバイスのインストールが完了する前に戻ります。ハードウェア スキャンが完了し、ドライバーが正常にインストールされた後に結果を取得する方法はありますか?

ありがとう、

ミーシャ

編集

ここに私の作業コードがあります:

    public const UInt32 CR_SUCCESS = 0;
    public const UInt64 CM_REENUMERATE_SYNCHRONOUS = 1;
    public const UInt64 CM_LOCATE_DEVNODE_NORMAL = 0;

    [DllImport("setupapi.dll")]
    public static extern bool SetupCopyOEMInf(
      string SourceInfFileName,
      string OEMSourceMediaLocation,
      int OEMSourceMediaType,
      int CopyStyle,
      string DestinationInfFileName,
      int DestinationInfFileNameSize,
      int RequiredSize,
      string DestinationInfFileNameComponent
      );

    [DllImport("cfgmgr32.dll")]
    public static extern int CM_Locate_DevNode_Ex(ref IntPtr deviceHandle, int deviceId, uint flags, IntPtr machineHandle);

    [DllImport("cfgmgr32.dll")]
    public static extern int CM_Reenumerate_DevNode_Ex(IntPtr devInst, UInt64 flags);

    [DllImport("cfgmgr32.dll")]
    public static extern int CMP_WaitNoPendingInstallEvents(UInt32 timeOut);

    static void Main() {
      bool success = SetupCopyOEMInf(infFile, null, 1, 0, null, 0, 0, null);

      if(!success) {
        throw new Exception("Error installing driver");
      }

      success = RescanAllDevices();

      if (!success) {
        throw new Exception("Error installing driver");
      }
    }

    public static bool RescanAllDevices() {
      int ResultCode = 0;
      IntPtr LocalMachineInstance = IntPtr.Zero;
      IntPtr DeviceInstance = IntPtr.Zero;
      UInt32 PendingTime = 30000;

      ResultCode = CM_Locate_DevNode_Ex(ref DeviceInstance, 0, 0, LocalMachineInstance);
      if (CR_SUCCESS == ResultCode) {
        ResultCode = CM_Reenumerate_DevNode_Ex(DeviceInstance, CM_REENUMERATE_SYNCHRONOUS);
        ResultCode = CMP_WaitNoPendingInstallEvents(PendingTime);
      }
      return ResultCode == CR_SUCCESS;
    }
4

1 に答える 1

0

devcon のソースは、WDK で入手できます。src\setup\devcon ディレクトリにあります。rescan コマンドのロジックは、cmds.cpp の cmdRescan 関数にあります。そのロジックを独自のコードにコピーして、すぐに返されないようにするのは簡単なことです。

于 2012-08-12T18:22:27.533 に答える