/// <summary> /// 通过设备类型枚举设备信息 /// </summary> /// <param name="DeviceIndex"></param> /// <param name="ClassName"></param> /// <param name="DeviceName"></param> /// <returns></returns> public static int EnumerateDevices(UInt32 DeviceIndex, string ClassName, StringBuilder DeviceName, StringBuilder DeviceID, StringBuilder Mfg, StringBuilder IsInstallDrivers) { UInt32 RequiredSize = 0; Guid guid = Guid.Empty; Guid[] guids = new Guid[1]; IntPtr NewDeviceInfoSet; SP_DEVINFO_DATA DeviceInfoData = new SP_DEVINFO_DATA(); bool res = SetupDiClassGuidsFromNameA(ClassName, ref guids[0], RequiredSize, ref RequiredSize); if (RequiredSize == 0) { //类型不正确 DeviceName = new StringBuilder(""); return(-2); } if (res == false) { guids = new Guid[RequiredSize]; res = SetupDiClassGuidsFromNameA(ClassName, ref guids[0], RequiredSize, ref RequiredSize); if (!res || RequiredSize == 0) { //类型不正确 DeviceName = new StringBuilder(""); return(-2); } } //通过类型获取设备信息 NewDeviceInfoSet = SetupDiGetClassDevsA(ref guids[0], 0, IntPtr.Zero, DIGCF_PRESENT); if (NewDeviceInfoSet.ToInt32() == -1) { //设备不可用 DeviceName = new StringBuilder(""); return(-3); } DeviceInfoData.cbSize = 28; //正常状态 DeviceInfoData.DevInst = 0; DeviceInfoData.ClassGuid = System.Guid.Empty; DeviceInfoData.Reserved = 0; res = SetupDiEnumDeviceInfo(NewDeviceInfoSet, DeviceIndex, DeviceInfoData); if (!res) { //没有设备 SetupDiDestroyDeviceInfoList(NewDeviceInfoSet); DeviceName = new StringBuilder(""); return(-1); } DeviceName.Capacity = MAX_DEV_LEN; DeviceID.Capacity = MAX_DEV_LEN; Mfg.Capacity = MAX_DEV_LEN; IsInstallDrivers.Capacity = MAX_DEV_LEN; if (!SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, DeviceInfoData, SPDRP_FRIENDLYNAME, 0, DeviceName, MAX_DEV_LEN, IntPtr.Zero)) { res = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, DeviceInfoData, SPDRP_DEVICEDESC, 0, DeviceName, MAX_DEV_LEN, IntPtr.Zero); if (!res) { //类型不正确 SetupDiDestroyDeviceInfoList(NewDeviceInfoSet); DeviceName = new StringBuilder(""); return(-4); } } //设备ID bool resHardwareID = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, DeviceInfoData, SPDRP_HARDWAREID, 0, DeviceID, MAX_DEV_LEN, IntPtr.Zero); if (!resHardwareID) { //设备ID未知 DeviceID = new StringBuilder(""); DeviceID.Append("未知"); } //设备供应商 bool resMfg = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, DeviceInfoData, SPDRP_MFG, 0, Mfg, MAX_DEV_LEN, IntPtr.Zero); if (!resMfg) { //设备供应商未知 Mfg = new StringBuilder(""); Mfg.Append("未知"); } //设备是否安装驱动 bool resIsInstallDrivers = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, DeviceInfoData, SPDRP_DRIVER, 0, IsInstallDrivers, MAX_DEV_LEN, IntPtr.Zero); if (!resIsInstallDrivers) { //设备是否安装驱动 IsInstallDrivers = new StringBuilder(""); } //释放当前设备占用内存 SetupDiDestroyDeviceInfoList(NewDeviceInfoSet); return(0); }
/// <summary> /// 枚举设备类型 /// </summary> /// <param name="ClassIndex"></param> /// <param name="ClassName">设备类型名称</param> /// <param name="ClassDescription">设备类型说明</param> /// <param name="DevicePresent"></param> /// <returns></returns> public static int EnumerateClasses(UInt32 ClassIndex, StringBuilder ClassName, StringBuilder ClassDescription, ref bool DevicePresent) { Guid ClassGuid = Guid.Empty; IntPtr NewDeviceInfoSet; UInt32 result; SP_DEVINFO_DATA DeviceInfoData = new SP_DEVINFO_DATA(); bool resNam = false; UInt32 RequiredSize = 0; result = CM_Enumerate_Classes(ClassIndex, ref ClassGuid, 0); DevicePresent = false; SP_CLASSIMAGELIST_DATA imagelist = new SP_CLASSIMAGELIST_DATA(); if (result != CR_SUCCESS) { return((int)result); } resNam = SetupDiClassNameFromGuidA(ref ClassGuid, ClassName, RequiredSize, ref RequiredSize); if (RequiredSize > 0) { ClassName.Capacity = (int)RequiredSize; resNam = SetupDiClassNameFromGuidA(ref ClassGuid, ClassName, RequiredSize, ref RequiredSize); } NewDeviceInfoSet = SetupDiGetClassDevsA(ref ClassGuid, 0, IntPtr.Zero, DIGCF_PRESENT); if (NewDeviceInfoSet.ToInt32() == -1) { DevicePresent = false; return(0); } UInt32 numD = 0; DeviceInfoData.cbSize = 28; DeviceInfoData.DevInst = 0; DeviceInfoData.ClassGuid = System.Guid.Empty; DeviceInfoData.Reserved = 0; Boolean res1 = SetupDiEnumDeviceInfo( NewDeviceInfoSet, numD, DeviceInfoData); if (!res1) { DevicePresent = false; return(0); } SetupDiDestroyDeviceInfoList(NewDeviceInfoSet); IntPtr KeyClass = SetupDiOpenClassRegKeyExA( ref ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER, IntPtr.Zero, 0); if (KeyClass.ToInt32() == -1) { DevicePresent = false; return(0); } UInt32 sizeB = MAX_SIZE_DEVICE_DESCRIPTION; ClassDescription.Capacity = MAX_SIZE_DEVICE_DESCRIPTION; UInt32 res = RegQueryValueA(KeyClass, 0, ClassDescription, ref sizeB); if (res != 0) { ClassDescription = new StringBuilder(""); //No device description } DevicePresent = true; ClassesGuid = DeviceInfoData.ClassGuid; return(0); }
public static int EnumerateClasses(UInt32 ClassIndex, ref StringBuilder ClassName, StringBuilder ClassDescription, ref bool DevicePresent) { Guid ClassGuid = Guid.Empty; IntPtr NewDeviceInfoSet; SP_DEVINFO_DATA DeviceInfoData; UInt32 result; StringBuilder name = new StringBuilder(""); bool resNam = false; UInt32 RequiredSize = 0; IntPtr ptr; result = CM_Enumerate_Classes(ClassIndex, ref ClassGuid, 0); ClassName = new StringBuilder(""); DevicePresent = false; //incorrect device class: if (result == CR_INVALID_DATA) { return(-2); } //device class is absent if (result == CR_NO_SUCH_VALUE) { return(-1); } //bad param. - fatal error if (result != CR_SUCCESS) { return(-3); } name.Capacity = 0; resNam = SetupDiClassNameFromGuidA(ref ClassGuid, name, RequiredSize, ref RequiredSize); if (RequiredSize > 0) { name.Capacity = (int)RequiredSize; resNam = SetupDiClassNameFromGuidA(ref ClassGuid, name, RequiredSize, ref RequiredSize); } NewDeviceInfoSet = SetupDiGetClassDevsA( ref ClassGuid, 0, IntPtr.Zero, DIGCF_PRESENT); if (NewDeviceInfoSet.ToInt32() == -1) { DevicePresent = false; ClassName = name; return(0); } IntPtr KeyClass = SetupDiOpenClassRegKeyExA( ref ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER, IntPtr.Zero, 0); if (KeyClass.ToInt32() == -1) { DevicePresent = false; ClassName = name; return(0); } UInt32 sizeB = 1000; String abcd = ""; StringBuilder CD = new StringBuilder(""); ClassDescription.Capacity = 1000; UInt32 res = RegQueryValueA(KeyClass, 0, ClassDescription, ref sizeB); if (res != 0) { ClassDescription = new StringBuilder(""); } SetupDiDestroyDeviceInfoList(NewDeviceInfoSet); ClassName = name; DevicePresent = true; return(0); }