You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
8.4 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* ----------------------------------------------------------
* 文件名称SetupApi.cs
*
* 作者:秦建辉
*
* QQ36748897
*
* 博客http://www.firstsolver.com/wordpress/
*
* 开发环境:
* Visual Studio V2010
* .NET Framework 4 Client Profile
*
* 版本历史:
* V1.0 2011年09月05日
* 实现对setupapi.dll接口的PInvoke
*
* 参考资料:
* http://www.pinvoke.net/
------------------------------------------------------------ */
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace JwKdsV.Core.HWiNFO
{
/// <summary>
/// SetupApi.dll的PInvoke
/// </summary>
internal class SetupApi
{
#region ENUM
[Flags]
public enum DIGCF
{
DIGCF_DEFAULT = 0x00000001,
DIGCF_PRESENT = 0x00000002,
DIGCF_ALLCLASSES = 0x00000004, // 设备安装类
DIGCF_PROFILE = 0x00000008,
DIGCF_INTERFACEDEVICE = 0x00000010, // 设备接口类
}
#endregion
#region STRUCT
[StructLayout(LayoutKind.Sequential)]
public struct SP_DEVINFO_DATA
{
public static readonly SP_DEVINFO_DATA Empty = new SP_DEVINFO_DATA(Marshal.SizeOf(typeof(SP_DEVINFO_DATA)));
public uint cbSize;
public Guid ClassGuid;
public uint DevInst;
public IntPtr Reserved;
private SP_DEVINFO_DATA(int size)
{
cbSize = (uint)size;
ClassGuid = Guid.Empty;
DevInst = 0;
Reserved = IntPtr.Zero;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct SP_DEVICE_INTERFACE_DATA
{
public static readonly SP_DEVICE_INTERFACE_DATA Empty = new SP_DEVICE_INTERFACE_DATA(Marshal.SizeOf(typeof(SP_DEVICE_INTERFACE_DATA)));
public uint cbSize;
public Guid InterfaceClassGuid;
public uint Flags;
public UIntPtr Reserved;
private SP_DEVICE_INTERFACE_DATA(int size)
{
cbSize = (uint)size;
InterfaceClassGuid = Guid.Empty;
Flags = 0;
Reserved = UIntPtr.Zero;
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SP_DEVICE_INTERFACE_DETAIL_DATA
{
public int cbSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string DevicePath;
}
#endregion
#region API
#region SetupDiGetClassDevs
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetupDiGetClassDevs(
ref Guid ClassGuid,
[MarshalAs(UnmanagedType.LPTStr)] string Enumerator,
IntPtr hwndParent,
DIGCF Flags
);
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetupDiGetClassDevs(
IntPtr ClassGuid, // null
string Enumerator,
IntPtr hwndParent,
DIGCF Flags
);
#endregion
#region SetupDiGetClassDevsEx
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetupDiGetClassDevsEx(
ref Guid ClassGuid,
[MarshalAs(UnmanagedType.LPTStr)] string Enumerator,
IntPtr hwndParent,
DIGCF Flags,
IntPtr DeviceInfoSet,
[MarshalAs(UnmanagedType.LPTStr)] string MachineName,
IntPtr Reserved
);
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetupDiGetClassDevsEx(
IntPtr ClassGuid,
[MarshalAs(UnmanagedType.LPTStr)] string Enumerator,
IntPtr hwndParent,
DIGCF Flags,
IntPtr DeviceInfoSet,
[MarshalAs(UnmanagedType.LPTStr)] string MachineName,
IntPtr Reserved
);
#endregion
#region SetupDiEnumDeviceInterfaces
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetupDiEnumDeviceInterfaces(
IntPtr hDevInfo,
ref SP_DEVINFO_DATA devInfo,
ref Guid interfaceClassGuid,
uint memberIndex,
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData
);
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetupDiEnumDeviceInterfaces(
IntPtr hDevInfo,
[MarshalAs(UnmanagedType.AsAny)] Object devInfo,
ref Guid interfaceClassGuid,
uint memberIndex,
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData
);
#endregion
#region SetupDiGetDeviceInterfaceDetail
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetupDiGetDeviceInterfaceDetail(
IntPtr hDevInfo,
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
int deviceInterfaceDetailDataSize,
out int requiredSize,
ref SP_DEVINFO_DATA deviceInfoData
);
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetupDiGetDeviceInterfaceDetail(
IntPtr hDevInfo,
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
int deviceInterfaceDetailDataSize,
out int requiredSize,
[MarshalAs(UnmanagedType.AsAny)] object deviceInfoData // null
);
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetupDiGetDeviceInterfaceDetail(
IntPtr hDevInfo,
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
int deviceInterfaceDetailDataSize,
IntPtr requiredSize, // null
[MarshalAs(UnmanagedType.AsAny)] object deviceInfoData // null
);
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetupDiGetDeviceInterfaceDetail(
IntPtr hDevInfo,
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData,
ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData,
int deviceInterfaceDetailDataSize,
IntPtr requiredSize, // null
IntPtr deviceInfoData
);
#endregion
#region SetupDiCreateDeviceInfoList
[DllImport("setupapi.dll", SetLastError = true)]
public static extern IntPtr SetupDiCreateDeviceInfoList(ref Guid ClassGuid, IntPtr hwndParent);
[DllImport("setupapi.dll", SetLastError = true)]
public static extern IntPtr SetupDiCreateDeviceInfoList(IntPtr ClassGuid, IntPtr hwndParent);
#endregion
[DllImport("setupapi.dll", SetLastError = true)]
public static extern bool SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);
[DllImport("setupapi.dll", SetLastError = true)]
public static extern bool SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, uint MemberIndex, ref SP_DEVINFO_DATA DeviceInfoData);
#region SetupDiGetDeviceInstanceId
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetupDiGetDeviceInstanceId(
IntPtr DeviceInfoSet,
ref SP_DEVINFO_DATA DeviceInfoData,
StringBuilder DeviceInstanceId,
int DeviceInstanceIdSize,
out int RequiredSize
);
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetupDiGetDeviceInstanceId(
IntPtr DeviceInfoSet,
ref SP_DEVINFO_DATA DeviceInfoData,
StringBuilder DeviceInstanceId,
int DeviceInstanceIdSize,
IntPtr RequiredSize
);
#endregion
#endregion
}
}