无法编译

微软有一个Bug,Spectre,现在被缓解了,但是代价是你要在VS2022中安装一大把的环境,否则此例子无法编译……

image

无法安装

devcon.exe,如图执行后得到:

image

但是设备管理器里找得到这个设备……

image

说明是安装了,但安装之后并没有执行起来

无法安装——从devcon.exe定位

devcom.exe的输出没有一点有用的信息。在devcon.exe的源代码(Windows-driver-samples\setup\devcon)中找报错的位置,修改为:

    newdevMod = LoadLibrary(TEXT("newdev.dll"));
    if(!newdevMod) {
        MSG("");
        goto final;
    }
    UpdateFn = (UpdateDriverForPlugAndPlayDevicesProto)GetProcAddress(newdevMod,UPDATEDRIVERFORPLUGANDPLAYDEVICES);
    if(!UpdateFn)
    {
        MSG("");
        goto final;
    }

    FormatToStream(stdout,inf ? MSG_UPDATE_INF : MSG_UPDATE,hwid,inf);
    flags |= INSTALLFLAG_FORCE;
    if(!UpdateFn(NULL,hwid,inf,flags,&reboot)) {
        MSG("");
        DWORD err = GetLastError();
        if (err == ERROR_FILE_NOT_FOUND) {
            puts("针对 FullInfPath 指定的路径不存在。");
        }
        if (err == ERROR_IN_WOW64) {
            puts("呼叫的应用程序是在 64 位环境中尝试执行的 32 位应用程序,不允许此环境。");
        }
        if (err == ERROR_INVALID_FLAGS) {
            puts("为 InstallFlags 指定的值无效。");
        }
        if (err == ERROR_NO_SUCH_DEVINST) {
            puts("针对 HardwareId 指定的值不符合系统上的任何设备。 也就是说,设备未插入。");
        }
        if (err == ERROR_NO_MORE_ITEMS) {
            puts("函式发现HardwareId值的相符项目,但指定的驱动程序与目前的驱动程序不相符,而且呼叫端未指定INSTALLFLAG_FORCE旗标。");
        }

        goto final;
    }

    FormatToStream(stdout,MSG_UPDATE_OK);

里面那些if (err == ERROR_...),是从微软官方文档中找的

无法安装——从日志定位

windows驱动日志输出的路径是:C:\Windows\inf\setupapi.dev.log

找到相关信息:

>>>  [Device Install (UpdateDriverForPlugAndPlayDevices) - Root\SimpleAudioSample]
>>>  Section start 2024/10/25 08:50:47.888
      cmd: "C:\Program Files (x86)\Windows Kits\10\Tools\10.0.26100.0\x64\devcon.exe" install .\SimpleAudioSample.inf Root\SimpleAudioSample
     ndv: INF path: C:\Users\Administrator\Desktop\Windows-driver-samples\audio\simpleaudiosample\x64\Debug\package\SimpleAudioSample.inf
     ndv: Install flags: 0x00000001
     ndv: {Update Device Driver - ROOT\MEDIA\0000}
     ndv:      Search options: 0x00000080
     ndv:      Searching single INF 'C:\Users\Administrator\Desktop\Windows-driver-samples\audio\simpleaudiosample\x64\Debug\package\SimpleAudioSample.inf'
     dvi:      {Build Driver List} 08:50:47.910
     dvi:           Searching for hardware ID(s):
     dvi:                root\simpleaudiosample
     dvi:      {Build Driver List - exit(0x00000000)} 08:50:47.916
!    ndv:      No matching drivers found in single INF
     dvi:      {DIF_SELECTBESTCOMPATDRV} 08:50:47.917
     dvi:           Default installer: Enter 08:50:47.918
     dvi:                {Select Best Driver}
!    dvi:                     Selecting driver failed(0xe0000228)
     dvi:                {Select Best Driver - exit(0xe0000228)}
!    dvi:           Default installer: failed
!    dvi:           Error 0xe0000228: There are no compatible drivers for this device.
     dvi:      {DIF_SELECTBESTCOMPATDRV - exit(0xe0000228)} 08:50:47.922
!    ndv:      Unable to select best compatible driver. Error = 0xe0000228
     ndv:      No drivers found for device.
     ndv: {Update Device Driver - exit(00000103)}
!    ndv: No better matching drivers found for device 'ROOT\MEDIA\0000'.
!    ndv: No devices were updated.
<<<  Section end 2024/10/25 08:50:47.925
<<<  [Exit status: FAILURE(0x00000103)]

No matching drivers found in single INF。缺少驱动?是文件没找到吗?删除驱动的.sys和.cer等文件试试,结果是一样的。

安装成功——修改inf文件

我并没有找到指定.sys等文件的方法,找半天都没有找到,再加上其他inf文件也是相对路径,推测不是这个原因。后面忽然想到devcon.exe输出“函式发现HardwareId值的相符项目,但指定的驱动程序与目前的驱动程序不相符,而且呼叫端未指定INSTALLFLAG_FORCE旗标”,推测可能是版本不对。删掉SIMPLEAUDIOSAMPLE,NTamd64.10.0...22000中的.10.0...22000,居然可以安装成功了……