.NET - Diving into System Programming - Part 2[转贴]
Posted on 2004-06-11 15:13 kongxx 阅读(920) 评论(0) 编辑 收藏 举报
using System;
using System.Text;
using System.Runtime.InteropServices;
namespace DevInfo
{
class DeviceInfo
{
public const int DIGCF_PRESENT = (0x00000002);
public const int MAX_DEV_LEN = 1000;
public const int SPDRP_FRIENDLYNAME = (0x0000000C);
// FriendlyName (R/W)
public const int SPDRP_DEVICEDESC = (0x00000000);
// DeviceDesc (R/W)
[StructLayout(LayoutKind.Sequential)]
public class SP_DEVINFO_DATA
{
public int cbSize;
public Guid ClassGuid;
public int DevInst; // DEVINST handle
public ulong Reserved;
};
[DllImport("setupapi.dll")]//
public static extern Boolean
SetupDiClassGuidsFromNameA(string ClassN, ref Guid guids,
UInt32 ClassNameSize, ref UInt32 ReqSize);
[DllImport("setupapi.dll")]
public static extern IntPtr //result HDEVINFO
SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator,
IntPtr hwndParent, UInt32 Flags);
[DllImport("setupapi.dll")]
public static extern Boolean
SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex,
SP_DEVINFO_DATA DeviceInfoData);
[DllImport("setupapi.dll")]
public static extern Boolean
SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);
[DllImport("setupapi.dll")]
public static extern Boolean
SetupDiGetDeviceRegistryPropertyA(IntPtr DeviceInfoSet,
SP_DEVINFO_DATA DeviceInfoData, UInt32 Property,
UInt32 PropertyRegDataType, StringBuilder PropertyBuffer,
UInt32 PropertyBufferSize, IntPtr RequiredSize);
public static int EnumerateDevices(UInt32 DeviceIndex,
string ClassName,
StringBuilder DeviceName)
{
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)
{
//incorrect class name:
DeviceName=new StringBuilder("");
return -2;
}
if(!res)
{
guids=new Guid[RequiredSize];
res=SetupDiClassGuidsFromNameA(ClassName,ref guids[0],RequiredSize,
ref RequiredSize);
if(!res || RequiredSize==0)
{
//incorrect class name:
DeviceName=new StringBuilder("");
return -2;
}
}
//get device info set for our device class
NewDeviceInfoSet=SetupDiGetClassDevsA(ref guids[0],0,IntPtr.Zero,
DIGCF_PRESENT);
if( NewDeviceInfoSet.ToInt32() == -1 )
if(!res)
{
//device information is unavailable:
DeviceName=new StringBuilder("");
return -3;
}
DeviceInfoData.cbSize = 28;
//is devices exist for class
DeviceInfoData.DevInst=0;
DeviceInfoData.ClassGuid=System.Guid.Empty;
DeviceInfoData.Reserved=0;
res=SetupDiEnumDeviceInfo(NewDeviceInfoSet,
DeviceIndex,DeviceInfoData);
if(!res) {
//no such device:
SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
DeviceName=new StringBuilder("");
return -1;
}
DeviceName.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){
//incorrect device name:
SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
DeviceName=new StringBuilder("");
return -4;
}
}
return 0;
}
[STAThread]
static void Main(string[] args)
{
StringBuilder devices=new StringBuilder("");
UInt32 Index=0;
int result=0;
if(args.Length != 1)
{
Console.WriteLine("command line format:");
Console.WriteLine("DevInfo <CLASSNAME>");
return;
}
while(true)
{
result=EnumerateDevices(Index, args[0], devices);
Index++;
if(result == -2)
{
Console.WriteLine("Incorrect name of Class = {0}",
args[0]);
break;
}
if(result == -1)break;
if(result == 0)Console.WriteLine("Device{0} is {1}",
Index, devices);
}
}
}
}
using System.Text;
using System.Runtime.InteropServices;
namespace DevInfo
{
class DeviceInfo
{
public const int DIGCF_PRESENT = (0x00000002);
public const int MAX_DEV_LEN = 1000;
public const int SPDRP_FRIENDLYNAME = (0x0000000C);
// FriendlyName (R/W)
public const int SPDRP_DEVICEDESC = (0x00000000);
// DeviceDesc (R/W)
[StructLayout(LayoutKind.Sequential)]
public class SP_DEVINFO_DATA
{
public int cbSize;
public Guid ClassGuid;
public int DevInst; // DEVINST handle
public ulong Reserved;
};
[DllImport("setupapi.dll")]//
public static extern Boolean
SetupDiClassGuidsFromNameA(string ClassN, ref Guid guids,
UInt32 ClassNameSize, ref UInt32 ReqSize);
[DllImport("setupapi.dll")]
public static extern IntPtr //result HDEVINFO
SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator,
IntPtr hwndParent, UInt32 Flags);
[DllImport("setupapi.dll")]
public static extern Boolean
SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex,
SP_DEVINFO_DATA DeviceInfoData);
[DllImport("setupapi.dll")]
public static extern Boolean
SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);
[DllImport("setupapi.dll")]
public static extern Boolean
SetupDiGetDeviceRegistryPropertyA(IntPtr DeviceInfoSet,
SP_DEVINFO_DATA DeviceInfoData, UInt32 Property,
UInt32 PropertyRegDataType, StringBuilder PropertyBuffer,
UInt32 PropertyBufferSize, IntPtr RequiredSize);
public static int EnumerateDevices(UInt32 DeviceIndex,
string ClassName,
StringBuilder DeviceName)
{
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)
{
//incorrect class name:
DeviceName=new StringBuilder("");
return -2;
}
if(!res)
{
guids=new Guid[RequiredSize];
res=SetupDiClassGuidsFromNameA(ClassName,ref guids[0],RequiredSize,
ref RequiredSize);
if(!res || RequiredSize==0)
{
//incorrect class name:
DeviceName=new StringBuilder("");
return -2;
}
}
//get device info set for our device class
NewDeviceInfoSet=SetupDiGetClassDevsA(ref guids[0],0,IntPtr.Zero,
DIGCF_PRESENT);
if( NewDeviceInfoSet.ToInt32() == -1 )
if(!res)
{
//device information is unavailable:
DeviceName=new StringBuilder("");
return -3;
}
DeviceInfoData.cbSize = 28;
//is devices exist for class
DeviceInfoData.DevInst=0;
DeviceInfoData.ClassGuid=System.Guid.Empty;
DeviceInfoData.Reserved=0;
res=SetupDiEnumDeviceInfo(NewDeviceInfoSet,
DeviceIndex,DeviceInfoData);
if(!res) {
//no such device:
SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
DeviceName=new StringBuilder("");
return -1;
}
DeviceName.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){
//incorrect device name:
SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
DeviceName=new StringBuilder("");
return -4;
}
}
return 0;
}
[STAThread]
static void Main(string[] args)
{
StringBuilder devices=new StringBuilder("");
UInt32 Index=0;
int result=0;
if(args.Length != 1)
{
Console.WriteLine("command line format:");
Console.WriteLine("DevInfo <CLASSNAME>");
return;
}
while(true)
{
result=EnumerateDevices(Index, args[0], devices);
Index++;
if(result == -2)
{
Console.WriteLine("Incorrect name of Class = {0}",
args[0]);
break;
}
if(result == -1)break;
if(result == 0)Console.WriteLine("Device{0} is {1}",
Index, devices);
}
}
}
}