HidApiNet / HidApiNet.HidDeviceInfo.cs
Code · 73 lines · 1601 bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73using System;
using System.Runtime.InteropServices;
using System.Text;

namespace HidApiNet
{
	[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
	unsafe struct HidDeviceInfo
	{
		[MarshalAs(UnmanagedType.LPStr)]
		public readonly string path;
		public readonly ushort vendor_id;
		public readonly ushort product_id;
		[MarshalAs(UnmanagedType.LPWStr)]
		private readonly IntPtr _serial_number;
		public readonly ushort release_number;
		[MarshalAs(UnmanagedType.LPWStr)]
		private readonly IntPtr _manufacturer_string;
		[MarshalAs(UnmanagedType.LPWStr)]
		private readonly IntPtr _product_string;
		public readonly ushort usage_page;
		public readonly ushort usage;
		public readonly int interface_number;
		public readonly IntPtr next;

		private int StringLength(IntPtr ptr, int maxlen)
		{
			if (ptr == IntPtr.Zero)
				return 0;
			for (int intLen = 0; intLen < maxlen; intLen++)
			{
				int* endchar = (int*)ptr;
				if (*endchar == 0)
					return intLen;
				ptr = new IntPtr(ptr.ToInt32() + 4);
			}
			return 0;
		}
		private string GetString(IntPtr ptr)
		{
			int intLen = StringLength(ptr, 128);
			if (intLen == 0)
				return null;
			var buf = new byte[intLen * 4];
			Marshal.Copy(ptr, buf, 0, buf.Length);
			return Encoding.Unicode.GetString(buf);
		}

		public string product_string
		{
			get
			{
				return GetString(_product_string);
			}
		}
		public string manufacturer_string
		{
			get
			{
				return GetString(_manufacturer_string);
			}
		}
		public string serial_number
		{
			get
			{
				return GetString(_serial_number);
			}
		}
	}

	
}