SetupApi函数
+ -

SETUPAPI函数脉络梳理

2023-10-12 42 0

SETUPAPI函数集是一个大大的集合,里面包括的函数巨多。其功能强大,但终因无法梳理出有效有脉络需让人望而生畏。
微软对此也只是一个简单的图示:SETUPAI

今天我们写一段代码,来概括上面的图示:

#include <windows.h>
#include <setupapi.h>
#include <initguid.h>
#include <stdio.h>
#include <string.h>
#include <winioctl.h>
#include <locale.h>
#include <tchar.h>


#pragma comment(lib,"Setupapi.lib ")

/* f18a0e88-c30c-11d0-8815-00a0c906bed8 */
DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, 0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, \
    0xa0, 0xc9, 0x06, 0xbe, 0xd8);

/* A5DCBF10-6530-11D2-901F-00C04FB951ED */
DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, \
    0xC0, 0x4F, 0xB9, 0x51, 0xED);
void CUsb::TestSetup()
{
    const GUID* pGuid = &(GUID_DEVINTERFACE_USB_DEVICE);

    HDEVINFO dev = SetupDiGetClassDevs((GUID*)pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
    if (dev == INVALID_HANDLE_VALUE)
    {
        printf("No HDEVINFO available for this GUID\n");
        return ;
    }
    SP_DEVINFO_DATA    dev_info_data;
    dev_info_data.cbSize = sizeof(SP_DEVINFO_DATA);
    for (int i = 0; i < 255; i++)
    {
        if (!SetupDiEnumDeviceInfo(dev, i, &dev_info_data))
        {
            break;
        }

        TCHAR id_inst[MAX_PATH] = { 0 };
        if (!SetupDiGetDeviceInstanceId(dev, &dev_info_data, id_inst, MAX_PATH, NULL))
        {
            break;
        }
        printf("%d\t %ws\n", i, id_inst);

        {
            TCHAR HardwareId[MAX_PATH] = { 0 };
            ULONG length = 0;
            SetupDiGetDeviceRegistryProperty(dev, &dev_info_data, SPDRP_HARDWAREID,NULL, (PBYTE)HardwareId, MAX_PATH, &length);
            for (TCHAR* p = HardwareId; *p ;p += _tcslen(p) + 1)
            {
                printf("\t %ws\n",  p);
            }

        }

        for (int index = 0;; index++)
        {
            SP_DEVICE_INTERFACE_DATA    dev_interface_data;
            dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
            if (!SetupDiEnumDeviceInterfaces(dev, &dev_info_data, pGuid, index, &dev_interface_data))
            {
                break;
            }

            ULONG len = 0;
            if (!SetupDiGetDeviceInterfaceDetail(dev, &dev_interface_data, NULL, 0, &len, NULL))
            {
                if (0x7a != GetLastError())
                {
                    break;
                }
            }

            PSP_DEVICE_INTERFACE_DETAIL_DATA pdev_interface_detail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(len);
            if (pdev_interface_detail)
            {
                pdev_interface_detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
                SetupDiGetDeviceInterfaceDetail(dev, &dev_interface_data, pdev_interface_detail, len, &len, NULL);
                printf("%d.%d\t %ws\n", i,index, pdev_interface_detail->DevicePath);
                free(pdev_interface_detail);
            }
        }
    }

    SetupDiDestroyDeviceInfoList(dev);

}

在本人电脑上执行的结果如下:

0.0      \\?\usb#vid_0bda&pid_8153#000001#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
0        USB\VID_0BDA&PID_8153\000001
         USB\VID_0BDA&PID_8153&REV_3000
         USB\VID_0BDA&PID_8153
0.0      \\?\usb#vid_0bda&pid_8153#000001#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
1        USB\VID_093A&PID_2510\6&26EF342A&0&4
         USB\VID_093A&PID_2510&REV_0100
         USB\VID_093A&PID_2510
1.0      \\?\usb#vid_093a&pid_2510#6&26ef342a&0&4#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
2        USB\VID_12D1&PID_3A07\029000
         USB\VID_12D1&PID_3A07&REV_0100
         USB\VID_12D1&PID_3A07
2.0      \\?\usb#vid_12d1&pid_3a07#029000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
3        USB\VID_1058&PID_2655\MSFT30323331324430343032343533
         USB\VID_1058&PID_2655&REV_6002
         USB\VID_1058&PID_2655
3.0      \\?\usb#vid_1058&pid_2655#msft30323331324430343032343533#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
4        USB\VID_0000&PID_F001&REV_0100\1&79F5D87&35&01
         USB\VID_0000&PID_F001&REV_0100
4.0      \\?\usb#vid_0000&pid_f001&rev_0100#1&79f5d87&35&01#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
5        USB\VID_0CF3&PID_E009\5&2E89C326&0&10
         USB\VID_0CF3&PID_E009&REV_0001
         USB\VID_0CF3&PID_E009
5.0      \\?\usb#vid_0cf3&pid_e009#5&2e89c326&0&10#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
6        USB\VID_0C45&PID_671E\5&2E89C326&0&6
         USB\VID_0C45&PID_671E&REV_8502
         USB\VID_0C45&PID_671E

0 篇笔记 写笔记

SetupApi关于INF文件处理的函数
INF文件处理功能提供安装功能,包括以下内容:打开和关闭INF文件。检索有关INF文件的信息。检索有关复制操作的源文件和目标目录的信息。执行INF文件节中指定的安装操作。FunctionDescriptionInstallHinfSectionExecutes a spec......
SetupApi磁盘提示和错误处理函数大全
可以使用setup函数提示用户插入新介质,或处理复制、重命名或删除文件时出现的错误。下表列出了为请求安装介质和报告错误提供对话框的功能。FunctionDescriptionSetupCopyErrorGenerates a dialog box that informs th......
SetupApi文件队列函数大全
使用setup函数,可以为各种操作对文件进行排队。可以为复制、重命名和删除文件建立文件队列。通常,应用程序将整个安装所需的所有文件操作排队,然后“提交”队列,以便在单个批中执行操作。FunctionDescriptionSetupCloseFileQueueDestroys a......
SetupApi默认队列回调例程函数
如果将回调例程与文件队列相关联,则每次系统执行一个排队的文件操作时都会调用回调例程。通常,您可以使用默认队列回调例程SetupDefaultQueueCallback来处理这些通知。FunctionDescriptionSetupDefaultQueueCallbackHand......
SetupApi CAB文件函数
CAB文件是单个文件,通常扩展名为.CAB,包含多个压缩文件作为文件库。CAB文件用于组织将复制到用户系统的安装文件。压缩文件可以分布在多个CAB文件上。FunctionDescription SetupIterateCabinetSends a notification to......
SetupApi 磁盘空间列表函数
磁盘空间列表函数用于创建和修改磁盘空间列表。这些列表可用于计算处理将在安装过程中复制或删除的文件所需的总磁盘空间。FunctionDescriptionSetupAddInstallSectionToDiskSpaceListSearches for CopyFile and ......
SetupApi MRB文件列表
Most recently used (MRU) source lists 最近使用的(MRU)源列表驻留在用户的计算机上,包含有关以前安装中使用的源路径的信息。提示用户输入源路径时,可以使用此信息。安装应用程序可以访问特定于用户的源列表,如果应用程序具有管理员权限,还可以访问系统范围的源列表。......
SetupApi 文件日志函数
可以使用日志文件记录安装期间复制到系统的文件的相关信息。日志文件可以是系统日志,也可以是您自己的安装日志文件。FunctionDescriptionSetupInitializeFileLogInitializes a log file for use.SetupLogE......
SetupApi用户接口函数
可以在类安装程序和联合安装程序中使用以下设置函数来确定当前进程是否可以与用户交互。FunctionDescription SetupGetNonInteractiveModeReturns the value of a SetupAPI non-interactive flag......
SetupApi 日志函数
从Windows Vista开始,即插即用(PnP)设备安装应用程序、类安装程序和协同安装程序可以使用以下函数将日志条目写入SetupAPI文本日志。FunctionDescriptionSetupGetThreadLogTokenRetrieves the log token......
Windows设备树及设备信息管理接口
Windows下的所有设备都会挂接在其设备树上,设备树由PNP管理器来维护。如一个设备树如下图所示:设备树上每个节点代表一个设备,凡是有子节点的节点是一个总线设备,其负责枚举下子节点设备,这样进行层层枚举,形成一棵设备树。其中根节点由PNP管理器创建,其用于挂载ACPI子节点。ACPI是一个抽象的......
使用SetupAPI禁用和开启设备
无论开启或禁用,都需要调用SetupAPI中的两个函数: SetupDiSetClassInstallParams 和 SetupDiCallClassInstaller 前者用于设置类安装参数,后者用于调用类安装程序和任何注册过的协安装程序。BOOL SetupDiSetClassInstall......
SetupAPI根据硬件ID获取驱动INF文件和驱动日期版本信息
SetupAPI根据硬件ID获取驱动INF文件和驱动日期版本信息。注释掉的代码是获取该硬件的所有可用驱动信息。代码是逐渐完善的,没想到可以直接从注册表信息中获取到。SetupDiOpenDevRegKey打开的注册表路径示例为:计算机HKEY_LOCAL_MACHINESYSTEM......
SetupAPI函数实现设备分类GUID和类名之间的转换SetupDiClassNameFromGuidEx和SetupDiClassGuidsFromNameEx
类名与其GUID之间的切换 GUID guid; ULONG rtn = 0; if (SetupDiClassGuidsFromNameEx(TEXT("USB"), &guid, 1, &rtn, NULL, N......
SetupAPI 根据类GUID获取类描述符信息SetupDiGetClassDescriptionEx
Windows设备的一种管理方式就是在安装设备驱动的时候,通过INF文件中的Class和ClassGUID来设置,如Class=USBClassGuid={36FC9E60-C465-11CF-8056-444553540000}当设备驱动安装后,可以通过SetupDiClassNameFro......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!