SetupApi函数
+ -

获取设备管理器中设备状态SetupDiGetDeviceRegistryProperty

2023-06-03 65 0
#include<windows.h>
#include <winioctl.h>
#include <setupapi.h>
#include <initguid.h>
#include <stdio.h>
#include<hidsdi.h>
#include<tchar.h>
#pragma comment(lib,"Setupapi.lib ")
#pragma comment(lib,"hid.lib ")
BOOL USBEnumDevice(OUT PTCHAR pDeviceName, IN LPGUID pGuid, IN int instance)
{
    HDEVINFO info = SetupDiGetClassDevs((GUID*)pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
    if (info == INVALID_HANDLE_VALUE)
    {
        printf("No HDEVINFO available for this GUID\n");
        return FALSE;
    }
    // Get interface data for the requested instance
    SP_INTERFACE_DEVICE_DATA ifdata;
    ifdata.cbSize = sizeof(ifdata);
    if (!SetupDiEnumDeviceInterfaces(info, NULL, (GUID*)pGuid, instance, &ifdata))
    {
        _tprintf(TEXT("No SP_INTERFACE_DEVICE_DATA available for this GUID instance\n"));
        SetupDiDestroyDeviceInfoList(info);
        return FALSE;
    }
    // Get size of symbolic link name
    DWORD ReqLen;
    SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL);
    PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new TCHAR[ReqLen]);
    if (ifDetail == NULL)
    {
        SetupDiDestroyDeviceInfoList(info);
        return FALSE;
    }
    // Get symbolic link name
    ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    if (!SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL))
    {
        SetupDiDestroyDeviceInfoList(info);
        delete[] ifDetail;
        return FALSE;
    }
    //printf("Symbolic link is %s\n", ifDetail->DevicePath);
    memcpy(pDeviceName, ifDetail->DevicePath, _tcslen(ifDetail->DevicePath) * sizeof(TCHAR));
    pDeviceName[_tcslen(ifDetail->DevicePath)] = TEXT('\0');
    delete[] ifDetail;
    SetupDiDestroyDeviceInfoList(info);
    return TRUE;
}
#define TO_SEARCH_DEVICE_UUID L"{A5DCBF10-6530-11D2-901F-00C04FB951ED}"

#include <windows.h>
#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>
#include <setupapi.h>
#include <regstr.h>
#include <infstr.h>
#include <cfgmgr32.h>
#include <string.h>
#include <malloc.h>
#include <newdev.h>
#include <objbase.h>
#include <strsafe.h>
int main()
{
    //GUID hidGuid;
    //::HidD_GetHidGuid((LPGUID)&hidGuid);
    GUID AGuid;
    CLSIDFromString(TO_SEARCH_DEVICE_UUID, &AGuid);
    HDEVINFO hDevInfo = SetupDiGetClassDevs(&AGuid, NULL, NULL, DIGCF_ALLCLASSES |  DIGCF_PRESENT);
    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        return 0;
    }
    SP_DEVINFO_DATA DeviceInfoData;
    for (int iIndex = 0;; iIndex++)
    {
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
        if (!SetupDiEnumDeviceInfo(hDevInfo, iIndex, &DeviceInfoData))
        {
            break;
        }
        char szHardWareID[512] = { 0 };
        if (!SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,
            NULL, (PBYTE)szHardWareID, sizeof(szHardWareID), NULL))
        {
            continue;
        }

        //本人的一个自定义设备
        if (strstr(szHardWareID, "root\\pnpon") == NULL)
        {
            continue;
        }
       // {
            SP_DEVINFO_LIST_DETAIL_DATA devInfoListDetail;
            ULONG status = 0;
            ULONG problem = 0;
            BOOL hasInfo = FALSE;
            BOOL isPhantom = FALSE;
            CONFIGRET cr = 0;
            devInfoListDetail.cbSize = sizeof(devInfoListDetail);
            if ((!SetupDiGetDeviceInfoListDetail(hDevInfo, &devInfoListDetail)) ||
                ((cr = CM_Get_DevNode_Status_Ex(&status, &problem, DeviceInfoData.DevInst, 0, devInfoListDetail.RemoteMachineHandle)) != 0)) 
            {
                cr = cr;

            }
            printf("problem=%d\r\n", problem);
     //   }
        {
            printf("%s\r\n", szHardWareID);

            typedef enum _DEVICE_INSTALL_STATE {
                InstallStateInstalled,
                InstallStateNeedsReinstall,
                InstallStateFailedInstall,
                InstallStateFinishInstall
            } DEVICE_INSTALL_STATE, * PDEVICE_INSTALL_STATE;

            ULONG v = -1;

            //未知状态是2,安装了是0(包括未启动)
            if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_INSTALL_STATE, NULL, (PBYTE)&v, sizeof(v), NULL))\
            {
                printf( ":%d\r\n", v); 
            }

           if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, SPDRP_DEVICE_POWER_DATA, NULL, (PBYTE)&v, sizeof(v), NULL))\
            {
                printf( ":%d\r\n", v); 
            }

        }
#define SHOW_PRO(X) \
        { \
          if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, &DeviceInfoData, X,NULL, (PBYTE)szHardWareID, sizeof(szHardWareID), NULL))\
          {\
              printf(#X ":%s\r\n", szHardWareID);\
          }\
        }
        SHOW_PRO(SPDRP_DEVICEDESC);
        SHOW_PRO(SPDRP_HARDWAREID);
        SHOW_PRO(SPDRP_COMPATIBLEIDS);
        SHOW_PRO(SPDRP_UNUSED0);
        SHOW_PRO(SPDRP_SERVICE);
        SHOW_PRO(SPDRP_UNUSED1);
        SHOW_PRO(SPDRP_UNUSED2);
        SHOW_PRO(SPDRP_CLASS);
        SHOW_PRO(SPDRP_CLASSGUID);
        SHOW_PRO(SPDRP_DRIVER);
        SHOW_PRO(SPDRP_CONFIGFLAGS);
        SHOW_PRO(SPDRP_MFG);
        SHOW_PRO(SPDRP_FRIENDLYNAME);
        SHOW_PRO(SPDRP_LOCATION_INFORMATION);
        SHOW_PRO(SPDRP_PHYSICAL_DEVICE_OBJECT_NAME);
        SHOW_PRO(SPDRP_CAPABILITIES);
        SHOW_PRO(SPDRP_UI_NUMBER);
        SHOW_PRO(SPDRP_UPPERFILTERS);
        SHOW_PRO(SPDRP_LOWERFILTERS);
        SHOW_PRO(SPDRP_BUSTYPEGUID);
        SHOW_PRO(SPDRP_LEGACYBUSTYPE);
        SHOW_PRO(SPDRP_BUSNUMBER);
        SHOW_PRO(SPDRP_ENUMERATOR_NAME);
        SHOW_PRO(SPDRP_SECURITY);
        SHOW_PRO(SPDRP_SECURITY_SDS);
        SHOW_PRO(SPDRP_DEVTYPE);
        SHOW_PRO(SPDRP_EXCLUSIVE);
        SHOW_PRO(SPDRP_CHARACTERISTICS);
        SHOW_PRO(SPDRP_ADDRESS);
        SHOW_PRO(SPDRP_UI_NUMBER_DESC_FORMAT);
        SHOW_PRO(SPDRP_DEVICE_POWER_DATA);
        SHOW_PRO(SPDRP_REMOVAL_POLICY);
        SHOW_PRO(SPDRP_REMOVAL_POLICY_HW_DEFAULT);
        SHOW_PRO(SPDRP_REMOVAL_POLICY_OVERRIDE);
        SHOW_PRO(SPDRP_INSTALL_STATE);
        SHOW_PRO(SPDRP_LOCATION_PATHS);
        SHOW_PRO(SPDRP_BASE_CONTAINERID);
    }
    getchar();
    printf("pk");
    return 0;
}

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......
SetupDi 驱动安装函数
DiInstallDeviceInstalls a specified driver that is preinstalled in the driver store on a PnP device that is present in the system. (WindowsVista a......
SetupDi 设备信息函数
SetupDiCreateDeviceInfoListCreates an empty device information set. This set can be associated with a class GUID.SetupDiCreateDeviceInfoListE......
SetupDi 驱动信息函数
SetupDiBuildDriverInfoListBuilds a list of drivers associated with a specified device instance or with the device information set’s global class d......
SetupDi Driver Setction函数
SetupDiAskForOEMDiskDisplays a dialog that asks the user for the path of an OEM installation disk.SetupDiSelectOEMDrvSelects a driver for a ......
SetupDi 驱动安装处理函数
SetupDiCallClassInstallerCalls the appropriate class installer, and any registered co-installers, with the specified installation request.Set......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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