SetupApi函数
+ -

Windows设备树及设备信息管理接口

2021-11-26 453 5

Windows下的所有设备都会挂接在其设备树上,设备树由PNP管理器来维护。如一个设备树如下图所示:
Windows设备树

设备树上每个节点代表一个设备,凡是有子节点的节点是一个总线设备,其负责枚举下子节点设备,这样进行层层枚举,形成一棵设备树。其中根节点由PNP管理器创建,其用于挂载ACPI子节点。ACPI是一个抽象的设备,用于枚举系统中根总线与设备,是距离CPU最近的设备。

ACPI表示高级配置和电源管理接口(Advanced Configuration and Power Management Interface

我们知道,一个物理设备安装完驱动后,其分类有两种方法:

  • 第一种是按设备类型归类,如磁盘存储类,音频类,视频类。如设备管理器就是默认按设备类型显示设备的。
  • 第二种是按接口类型,如USB接口类
    我们可以通过Windows驱动预定义设备GUID来查看一下关于这两类分类的GUID,一类对应的是设备的ClassGuid,另一个是设备的InterfaceGuid。

这里说一下为什么会用接口类型GUID呢?
这里有以下几个原因:

  • 设备名的命名因人喜好不同,也容易冲突,导出也麻烦
  • 使用接口GUID,可以做为一个标准,凡是所有设备同类设备都可以注册该GUID
  • 系统按指定格式方便对设备实例名的统一
  • 可以实现一个驱动对应多个硬件设备的驱动,这样不用考虑命名的问题

在SetupApi函数中,所以根据设备的分类不同,也会出现两大类函数集,分别为 device setup classes 和 device interface classes函数集。

对于使用了分类的设备,其会根据其ClassGuid创建设备信息集合链表,形成如下设备链表:
设备信息集合
设备信息集合使用SetupDiCreateDeviceInfoList函数来创建集合链表,而对应的设备信息的相关函数有SetupDiOpenDeviceInfo。

  • HDEVINFO 集合
    • SP_DEVINFO_DATA
    • SP_DEVINFO_DATA
    • SP_DEVINFO_DATA
    • SP_DEVINFO_DATA

如某一驱动中的INF文件中ClassGuid内容如下:

[Version]
Signature="$WINDOWS NT$"
Class=System
ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318}

可以通通过如下获取设备信息:

DEFINE_GUID(GUID_SYSTEM,
    0x4D36E97D, 0xE325, 0x11CE, 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18);

static BOOL
is_exist_device(drv_info_t *pinfo)
{
    HDEVINFO    hdevinfoset;
    SP_DEVINFO_DATA    devinfo;
    BOOL    exist = FALSE;

    //hdevinfoset = SetupDiCreateDeviceInfoList(&GUID_SYSTEM, NULL);
    hdevinfoset = SetupDiCreateDeviceInfoList(NULL, NULL);
    if (hdevinfoset == INVALID_HANDLE_VALUE) {
        return FALSE;
    }

    memset(&devinfo, 0, sizeof(SP_DEVINFO_DATA));
    devinfo.cbSize = sizeof(SP_DEVINFO_DATA);
    if (SetupDiOpenDeviceInfo(hdevinfoset, pinfo->device_id, NULL, 0, &devinfo))
        exist = TRUE;
    SetupDiDestroyDeviceInfoList(hdevinfoset);
    return exist;
}

而对于以接口的方式的相关函数,可以通过SetupDiEnumDeviceInterfaces获取SP_INTERFACE_DEVICE_DATA。

SetupAPI的定位

SetupAPI是一个被用来执行安装设备的一系列操作的方法的集合,主要用于安装设备驱动(device driver),被用在类安装程序(class installers)、协安装程序(co-installers)和设备安装应用程序(device installation applications)中。

下图描绘了设备安装过程中的组件,也包括SetupAPI在其中所扮演的角色.
SetupAPI

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驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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