HID Enumeration

16/02/2011 - 10:27 von Wolfgang Badura | Report spam
Hallo Spezialisten.

Ich verwende aus dem VS2008 deutsch Sprache BASIC.

Mit Hilfe von WMI und Registry ist es mir gelungen die VID und PID der
angeschlossenen USB-Festplatten zu ermitteln.

Aber nun klemmt es gewaltig.

Zum ersten habe ich entdeckt, daß die HID.DLL diese Möglichkeiten auch
anbietet und ich überlege, diese auch zu nutzen. Aber über
HidD_GetHidGuid(guid) bin ich nicht hinausgekommen.

Zum zweiten suche ich darin eine Möglichkeit, die (meiste?) USB-Devices
auszulesen.
Nur wirklich funktionierende Hinweise für BASIC habe ich nicht gefunden.

Es müßte auch mit den API's gehen, doch auch dafür habe ich keine
funktionierenden Beispiele für die Suche nach angeschlossenen USB-Devices
gefunden. Auch weiß ich nicht, was in die Struktur Guid einzutragen ist,
damit man zB mit HidD_GetHidGuid ein bestimmtes USB-Device findet.
Aber eigentlich weiß ich zu wenig über diese Materie.

Microsofts MSDN bietet eine Dokumentation an, diese enthàlt aber keine
weiterführenden Beispiele.
Es gibt eine große Anzahl von Firmen, die Libraries (auch gratis) anbieten,
mit denen man sich durch die USB-Devices hanteln kann. Allerdings sind die
meisten davon für C, C++, C#. Und ich kann nicht erwarten, daß diese auf
anderen Rechnern installiert sind. Es müßte ja mit Bordmitteln von VS gehen.

Kann mir jemand Dokumentationen und/oder funktionierende Beispiele benennen,
die mir weiterhelfen?
Irgendwie habe ich den Eindruck, daß die Ratgeber mehr herumreden als mit
Wissen glànzen.
Auf die Frage nach dem Finden der VID und PID wird zB. gemeint "Das
**müßte** eigentlich mit WMI gehen". No comment.

Mit bestem Dank im Voraus

Wolfgang
 

Lesen sie die antworten

#1 Armin Zingler
16/02/2011 - 22:01 | Warnen spam
Am 16.02.2011 10:27, schrieb Wolfgang Badura:
Hallo Spezialisten.

Ich verwende aus dem VS2008 deutsch Sprache BASIC.

Mit Hilfe von WMI und Registry ist es mir gelungen die VID und PID der
angeschlossenen USB-Festplatten zu ermitteln.

Aber nun klemmt es gewaltig.

Zum ersten habe ich entdeckt, daß die HID.DLL diese Möglichkeiten auch
anbietet und ich überlege, diese auch zu nutzen. Aber über
HidD_GetHidGuid(guid) bin ich nicht hinausgekommen.

Zum zweiten suche ich darin eine Möglichkeit, die (meiste?) USB-Devices
auszulesen.
Nur wirklich funktionierende Hinweise für BASIC habe ich nicht gefunden.

Es müßte auch mit den API's gehen, doch auch dafür habe ich keine
funktionierenden Beispiele für die Suche nach angeschlossenen USB-Devices
gefunden. Auch weiß ich nicht, was in die Struktur Guid einzutragen ist,
damit man zB mit HidD_GetHidGuid ein bestimmtes USB-Device findet.
Aber eigentlich weiß ich zu wenig über diese Materie.

Microsofts MSDN bietet eine Dokumentation an, diese enthàlt aber keine
weiterführenden Beispiele.
Es gibt eine große Anzahl von Firmen, die Libraries (auch gratis) anbieten,
mit denen man sich durch die USB-Devices hanteln kann. Allerdings sind die
meisten davon für C, C++, C#. Und ich kann nicht erwarten, daß diese auf
anderen Rechnern installiert sind. Es müßte ja mit Bordmitteln von VS gehen.

Kann mir jemand Dokumentationen und/oder funktionierende Beispiele benennen,
die mir weiterhelfen?
Irgendwie habe ich den Eindruck, daß die Ratgeber mehr herumreden als mit
Wissen glànzen.
Auf die Frage nach dem Finden der VID und PID wird zB. gemeint "Das
**müßte** eigentlich mit WMI gehen". No comment.

Mit bestem Dank im Voraus

Wolfgang



Aufrund deiner Frage habe ich heute selbst mal den halben Tag mit der
Angelegenheit beschàftigt da ich diesbezüglich auch noch völlig
"blank war".

Es kommt jetzt natürlich darauf an, was du genau wissen willst.
Unten zunàchst einmal der Code zum Auflisten der HID-Geràte.
Für die USB-Geràte - das sind i.d.R. die USB-Controller - musst
du GUID_DEVCLASS_USB verwenden (s. auskommentierte Zeile).
Die GUIDs weiterer "Setup Classes" findest du hier:

http://msdn.microsoft.com/en-us/library/ff553428(VS.85).aspx


Imports System.Runtime.InteropServices
Imports System.Diagnostics

Friend Class Main

Const ERROR_NO_MORE_ITEMS As Integer = 259

Const DIGCF_DEFAULT As UInt32 = 1
Const DIGCF_PRESENT As UInt32 = 2
Const DIGCF_ALLCLASSES As UInt32 = 4
Const DIGCF_PROFILE As UInt32 = 8
Const DIGCF_DEVICEINTERFACE As UInt32 = &H10


<StructLayout(LayoutKind.Sequential)> _
Structure SP_DEVINFO_DATA
Public Size As Int32
Public guid As Guid
Public devInst As UInt32
Public Reserved As UIntPtr
End Structure

Shared ReadOnly INVALID_HANDLE_VALUE As IntPtr = New IntPtr(-1)

Shared ReadOnly GUID_DEVCLASS_USB As Guid = New Guid("36fc9e60-c465-11cf-8056-444553540000")
Shared ReadOnly GUID_DEVCLASS_HID As Guid = New Guid("745a17a0-74d3-11d0-b6fe-00a0c90f57da")

Declare Auto Function SetupDiGetClassDevs Lib "setupapi.dll" ( _
<[In]()> ByVal Classguid As IntPtr, _
<[In](), MarshalAs(UnmanagedType.LPTStr)> ByVal Enumerator As String, _
<[In]()> ByVal hWndParent As IntPtr, _
<[In]()> ByVal Flags As UInt32) _
As IntPtr

Declare Auto Function SetupDiGetClassDevs Lib "setupapi.dll" ( _
<[In]()> ByRef Classguid As Guid, _
<[In](), MarshalAs(UnmanagedType.LPTStr)> ByVal Enumerator As String, _
<[In]()> ByVal hWndParent As IntPtr, _
<[In]()> ByVal Flags As UInt32) _
As IntPtr

Declare Auto Function SetupDiDestroyDeviceInfoList Lib "setupapi.dll" ( _
<[In]()> ByVal DeviceInfoSet As IntPtr) _
As Boolean

Declare Auto Function SetupDiEnumDeviceInfo Lib "setupapi.dll" ( _
<[In]()> ByVal DeviceInfoSet As IntPtr, _
<[In]()> ByVal MemberIndex As UInt32, _
<Out()> ByRef DeviceInfoData As SP_DEVINFO_DATA) _
As Boolean

Declare Auto Function SetupDiGetDeviceInstanceId Lib "setupapi.dll" ( _
<[In]()> ByVal DeviceInfoSet As IntPtr, _
<[In]()> ByRef DeviceInfoData As SP_DEVINFO_DATA, _
<[Out]()> ByVal DeviceInstanceId As Text.StringBuilder, _
<[In]()> ByVal DeviceInstanceIdSize As UInt32, _
<[Out]()> ByRef RequiredSize As UInt32 _
) As Boolean


Shared Sub Main()

Dim hDevInfo = SetupDiGetClassDevs(GUID_DEVCLASS_USB, "USB", IntPtr.Zero, DIGCF_PRESENT)
'Dim hDevInfo = SetupDiGetClassDevs(GUID_DEVCLASS_HID, Nothing, IntPtr.Zero, DIGCF_PRESENT)

If hDevInfo = INVALID_HANDLE_VALUE Then
ThrowWin32Exception("SetupDiGetClassDevs")
Else
Try
Do
Dim MemberIndex As UInt32
Dim DeviceInfo As SP_DEVINFO_DATA

DeviceInfo.Size = Marshal.SizeOf(GetType(SP_DEVINFO_DATA))

If SetupDiEnumDeviceInfo(hDevInfo, MemberIndex, DeviceInfo) Then
Dim RequiredSize As UInt32
Dim DeviceInstanceID As New Text.StringBuilder

DeviceInstanceID.Length = 500

If SetupDiGetDeviceInstanceId(hDevInfo, DeviceInfo, DeviceInstanceID, CUInt(DeviceInstanceID.Capacity), RequiredSize) Then
Debug.WriteLine("Device instance id: " & DeviceInstanceID.ToString)
Else
ThrowWin32Exception("SetupDiGetDeviceInstanceId")
End If
Else
Dim Win32Error = Marshal.GetLastWin32Error

If Win32Error = ERROR_NO_MORE_ITEMS Then
Exit Do
Else
ThrowWin32Exception(Win32Error, "SetupDiEnumDeviceInfo")
End If
End If

MemberIndex += 1UI
Loop
Finally
If Not SetupDiDestroyDeviceInfoList(hDevInfo) Then
ThrowWin32Exception("SetupDiDestroyDeviceInfoList")
End If
End Try
End If

End Sub
Shared Sub ThrowWin32Exception(ByVal Location As String)

ThrowWin32Exception(Marshal.GetLastWin32Error, Location)

End Sub
Shared Sub ThrowWin32Exception(ByVal [error] As Integer, ByVal Location As String)

Throw New ComponentModel.Win32Exception([error], "Error at " & Location)

End Sub

End Class


Armin

Ähnliche fragen