2008-08-22 17 views
7

Ich habe eine Bibliothek, die liest/schreibt auf ein USB-Gerät mit CreateFile() API. Das Gerät implementiert das HID-Geräteprofil so, dass es mit dem HID-Klassentreiber von Microsoft kompatibel ist.Finden Sie heraus, welcher Prozess eine exklusive Sperre auf einem USB-Gerät hat Handle

Einige andere auf dem System installierte Anwendungen öffnen das Gerät im Lese-/Schreibmodus ohne Freigabe-Modus. Was verhindert, dass meine Bibliothek (und alles, was sie verbraucht) mit dem Gerät arbeitet. Ich nehme an, das ist der Haken daran, ein HID-kompatibles Gerät zu sein - andere Treibersoftware (Mäuse, Controller, PHIDGETS usw.) kann unkooperativ sein.

Auf jeden Fall ist das Gerät Dateipfad der Form:

 
1: "\\?\hid#hpqremhiddevice&col01#5&21ff20e7&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}". 

2: "\\?\hid#vid_045e&pid_0023#7&34aa9ece&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}". 

3: "\?\hid#vid_056a&pid_00b0&col01#6&5b05f29&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}". 

Und ich versuche, es zu öffnen Code verwenden, wie:

// First, open it with minimum permissions, this device may not be ours. 
// we'll re-open it later in read/write 
hid_device_ref = CreateFile(
    device_path, GENERIC_READ, 
    0, NULL, OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, NULL); 

Ich habe ein Tool wie FileMon betrachtet oder Prozessmonitor von SysInternals. Aber ich kann es nicht bekommen, um die Verwendung auf Geräte-Dateihandles wie dem oben aufgeführten zu melden.

Antwort

1

Dies ist, was ich von einem Magtek Kartenleser zum Lesen verwenden:

//Open file on the device 
deviceHandle = 
    CreateFile (deviceDetail->DevicePath, 
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING, 0, NULL); 

diese Optionen versuchen und sehen, wenn Sie zumindest aus dem Gerät lesen können.

Ich verstehe Ihren Schmerz hier ... Ich fand die USB-HID-Dokumentation an mehreren Stellen grundsätzlich falsch.

[Bearbeiten] Es gibt nicht viel da draußen zu diesem Problem. Hier ist eine codeproject link, die das Thema in einem Thread an der Unterseite leicht berührt. Klingt vielleicht, wenn es sich um ein Tastatur- oder Mausfenster handelt, das es exklusiv aufnimmt.

0

Cool - Ich werde diese Optionen versuchen, wie sie wahrscheinlich bessere Standardwerte sind angesichts meiner Absichten. Leider weiß ich, dass mein Gerät da ist und ich später eventuell Lese-/Schreibzugriff brauche (sobald ich die Deskriptoren inspiziere und verifiziert habe, dass es tatsächlich mein Gerät ist).

Das bedeutet, dass mein wirkliches Ziel IST, zu wissen, was es verwendet, damit ich den Kunden/Benutzer informieren kann: "Hey Mann, 'iexplore.exe' verwendet derzeit dein SuperWidget Gerät. Du musst es schließen um die SuperWidget-Anwendung zu verwenden. " (., Wenn nicht auf der Anwendungsebene, dann zumindest am Telefon Support-Level)

Ich vergaß zu erwähnen, dass der Windows-Fehler von GetLastError berichtet() ist:

0x20. Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.

(Ihre Freigabealternativen werden wahrscheinlich die Datei öffnen, vorausgesetzt, dass keine Datei_SHARE_NONE im Namen des anderen Prozesses vorhanden ist).

[Bearbeiten]

Ja, es ist schmerzhaft in Ordnung. Ich habe gesehen, dass Mäuse und Tastaturen von Windows gesperrt wurden, um von ihnen zu lesen. Ich habe auch gesehen, dass viele Leute Probleme in einer VM wie Parallells auf OS X haben, wo der HID-Klassentreiber das Gerät geöffnet hat, das exklusiv verhindert, dass die VM Standard-USB-Anfragen verwendet.

Ich habe einige Code gesehen, der was ProcessMonitor erstellt. Vielleicht kann SysInternals ist die Wahl nur Gerätegriffe zu ignorieren, aber die gleiche Methode (oder eine leichte Variation) hier eingesetzt werden, um die PID zu bestimmen.

Mike

+0

Das, was, was man benötigt: [Überprüfen Sie Informationen über den Windows NT System Level Primitives] (http://www.codeguru.com/cpp/wp/system/processesmodules/article.php/c2827/Examine-Information-on- Windows-NT-System-Level-Primitivs.htm) –

4

Haben Sie das Tool versucht handle von Sysinternals genannt?

In keinem der beiden Fenster wird dies angezeigt (zeigt den Namen der Anwendung an, die das Gerät gesperrt hat): Wenn Sie versuchen, ein USB-Gerät auszuwerfen, sagt Windows nur, dass das Gerät gerade verwendet wird und nicht entfernt werden kann.

1

Es gibt einen Trick, den Sie tun können, wo Sie das Gerät Griff öffnen anfordernden weder Erlaubnis lesen noch schreiben und mit ihm interagieren nur Feature Berichte verwenden. Jan Axelson erwähnt diesen Trick in ihren Büchern über USB-HID-Geräte. Ich glaube, dass dies mit der exklusiven Sperre, um das Problem bekommt, die Sie sich (zum Beispiel) stoßen bei dem Versuch, einen Punkt zu einem Gerät zu öffnen, auf dem Windows ein System Tastatur oder Maus hält. Auch wenn Sie nicht den Griff lesen oder schreiben, können Sie immer noch ein Feature Bericht an das Gerät senden HidD_SetFeature verwenden und einen Bericht aus dem Gerät gelesen HidD_GetFeature verwenden. Ich weiß es nicht ohne Weiteres von einer Art und Weise Eingang Berichte zu lesen oder Ausgabeberichte unter diesen Umständen senden, und vielleicht ist es unmöglich, dies zu tun, aber Sie könnten auch nicht von denen brauchen, vor allem, wenn das Gerät „Ihr“ Gerät in dem Sinne ist, dass du die Firmware kontrollierst. Streng genommen führt dies nicht dazu, Ihre Frage zu beantworten, wie es gestellt wurde, aber es schien potentiell relevant zu sein, so dass ich dachte, ich würde es dort rauswerfen.