Может ли DevCon уведомить о завершении установки драйвера после повторного сканирования?

Я пытаюсь установить драйвер во время проекта установки 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;
    }

person Misha    schedule 06.08.2012    source источник
comment
Спасибо за код! Однако, если установка драйвера ранее не удалась и был установлен фиктивный драйвер, то только при перезагрузке системы будет установлен новый драйвер. Итак, перезагрузка кажется самым безопасным методом. См. stackoverflow.com/questions/14937261/   -  person OneWorld    schedule 19.02.2013


Ответы (1)


Исходный код для devcon доступен в WDK. Он находится в каталоге src \ setup \ devcon. Логика команды повторного сканирования находится в функции cmdRescan в cmds.cpp. Было бы просто скопировать эту логику в свой собственный код и убедиться, что она не возвращается немедленно.

person Carey Gregory    schedule 12.08.2012
comment
Devcon не решает эту проблему: он использует асинхронное повторное сканирование. - person Colin Jensen; 27.02.2019
comment
@ColinJensen Ты не прочитал мой ответ после первого предложения, не так ли? Я сказал, что исходный код доступен, и его можно легко изменить для синхронизации. - person Carey Gregory; 01.03.2019