提供对setupapi.dll的简单封装
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace WindowsAPI
{
/// <summary>
/// Flags controlling what is included in the device information set built by SetupDiGetClassDevs
/// </summary>
public enum DIGCF
{
/// <summary>
/// only valid with DIGCF_DEVICEINTERFACE
/// </summary>
DIGCF_DEFAULT = 0x00000001,
DIGCF_PRESENT = 0x00000002,
DIGCF_ALLCLASSES = 0x00000004,
DIGCF_PROFILE = 0x00000008,
DIGCF_DEVICEINTERFACE = 0x00000010
}
/// <summary>
/// SP_DEVICE_INTERFACE_DATA structure defines a device interface in a device information set.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct SP_DEVICE_INTERFACE_DATA
{
public uint cbSize;
public Guid interfaceClassGuid;
public uint flags;
public UIntPtr reserved;
}
/// <summary>
/// SP_DEVICE_INTERFACE_DETAIL_DATA structure contains the path for a device interface.
/// 这个结构体中的char可能是双字节或者单字节,长度应该是176以内
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 0, CharSet = CharSet.Auto)]
public struct SP_DEVICE_INTERFACE_DETAIL_DATA
{
public uint cbSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string devicePath;
}
/// <summary>
/// SP_DEVINFO_DATA structure defines a device instance that is a member of a device information set.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct SP_DEVINFO_DATA
{
public uint cbSize;
public Guid classGuid; // temp
public uint devInst; // dumy
public IntPtr reserved;
}
/// <summary>
/// 提供对setupapi.dll的简单封装
/// </summary>
public class SetupApi
{
/// <summary>
/// The SetupDiGetClassDevs function returns a handle to a device information set that contains requested device information elements for a local machine.
/// </summary>
/// <param name="ClassGuid">GUID for a device setup class or a device interface class. </param>
/// <param name="Enumerator">A pointer to a NULL-terminated string that supplies the name of a PnP enumerator or a PnP device instance identifier. </param>
/// <param name="HwndParent">A handle of the top-level window to be used for a user interface</param>
/// <param name="Flags">A variable that specifies control options that filter the device information elements that are added to the device information set. </param>
/// <returns>a handle to a device information set </returns>
[DllImport("setupapi.dll", SetLastError = true)]
public static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, uint Enumerator, IntPtr HwndParent, DIGCF Flags);
/// <summary>
/// The SetupDiDestroyDeviceInfoList function deletes a device information set and frees all associated memory.
/// </summary>
/// <param name="DeviceInfoSet">A handle to the device information set to delete.</param>
/// <returns>returns TRUE if it is successful. Otherwise, it returns FALSE </returns>
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean SetupDiDestroyDeviceInfoList(IntPtr deviceInfoSet);
/// <summary>
/// The SetupDiEnumDeviceInterfaces function enumerates the device interfaces that are contained in a device information set.
/// </summary>
/// <param name="deviceInfoSet">A pointer to a device information set that contains the device interfaces for which to return information</param>
/// <param name="deviceInfoData">A pointer to an SP_DEVINFO_DATA structure that specifies a device information element in DeviceInfoSet</param>
/// <param name="interfaceClassGuid">a GUID that specifies the device interface class for the requested interface</param>
/// <param name="memberIndex">A zero-based index into the list of interfaces in the device information set</param>
/// <param name="deviceInterfaceData">a caller-allocated buffer that contains a completed SP_DEVICE_INTERFACE_DATA structure that identifies an interface that meets the search parameters</param>
/// <returns></returns>
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean SetupDiEnumDeviceInterfaces(IntPtr deviceInfoSet, IntPtr deviceInfoData, ref Guid interfaceClassGuid, uint memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData);
/// <summary>
/// The SetupDiGetDeviceInterfaceDetail function returns details about a device interface.
/// </summary>
/// <param name="hDevInfo">A pointer to the device information set that contains the interface for which to retrieve details</param>
/// <param name="deviceInterfaceData">A pointer to an SP_DEVICE_INTERFACE_DATA structure that specifies the interface in DeviceInfoSet for which to retrieve details</param>
/// <param name="deviceInterfaceDetailData">A pointer to an SP_DEVICE_INTERFACE_DETAIL_DATA structure to receive information about the specified interface</param>
/// <param name="deviceInterfaceDetailDataSize">The size of the DeviceInterfaceDetailData buffer</param>
/// <param name="requiredSize">A pointer to a variable that receives the required size of the DeviceInterfaceDetailData buffer</param>
/// <param name="deviceInfoData">A pointer buffer to receive information about the device that supports the requested interface</param>
/// <returns></returns>
[DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern Boolean SetupDiGetDeviceInterfaceDetail(IntPtr hDevInfo, [In] ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, [In, Out, Optional] ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData, [In] uint deviceInterfaceDetailDataSize, [In, Out, Optional] ref uint requiredSize, [In, Out, Optional] ref SP_DEVINFO_DATA deviceInfoData);
//public static extern Boolean SetupDiGetDeviceInterfaceDetail(IntPtr hDevInfo, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, IntPtr deviceInterfaceDetailData, UInt32 deviceInterfaceDetailDataSize, out UInt32 requiredSize, IntPtr deviceInfoData);
}
}