Tengo una biblioteca en la que se lee/escribe en un dispositivo USB utilizando CreateFile() de la API. El dispositivo pasa a aplicar el HID-perfil del dispositivo, de tal manera que es compatible con Microsoft HID driver.

Alguna otra aplicación instalada en el sistema es la de abrir el dispositivo en modo de lectura/escritura con ningún modo de recurso compartido. Que impide que mi biblioteca (y de cualquier cosa que la consume) de trabajar con el dispositivo. Supongo que el problema con ser un HID compatible con el dispositivo: otros software de controlador (ratones, los controladores, los PHIDGETS, etc) puede ser que no coopera.

De todos modos, el dispositivo ruta de acceso del archivo es de la forma:

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}". 

Y estoy tratando de abrirlo con el código, como:

// 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);

Me he considerado una herramienta como FileMon o Process Monitor de SysInternals. Pero me parece que no puede conseguir que se informe de uso en el archivo de dispositivo se maneja como la que aparece arriba.

OriginalEl autor Mike Haboustak | 2008-08-22

4 Comentarios

  1. 4

    ¿Has probado la herramienta llamada manejar de sysinternals?

    De todos modos, ni en windows hace esto (mostrar el nombre de la aplicación que bloquea el dispositivo): cuando se intenta extraer un dispositivo USB, Windows dice que el dispositivo está en uso y no se puede quitar ahora.

    OriginalEl autor botismarius

  2. 1

    Esto es lo que yo uso para leer de un Magtek lector de tarjetas:

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

    Pruebe las opciones y ver si al menos puedes leer desde el dispositivo.

    Comprendo tu dolor aquí… he encontrado el USB HID documentación a ser básicamente equivocado en varios lugares.

    [Editar] no Hay mucho por ahí sobre este problema. He aquí un codeproject enlace que toque ligeramente sobre el tema en un hilo en la parte inferior. Suena como si tal vez es un teclado o un ratón de windows agarra exclusivamente.

    OriginalEl autor Eric Z Beard

  3. 1

    Hay un truco que usted puede hacer cuando usted abra el identificador de dispositivo que solicita ni leer ni escribir y de permiso de interactuar con ella utilizando sólo la característica de informes. Jan Axelson menciona este truco en sus libros acerca de USB dispositivos HID. Creo que este consigue solucionar el problema con el bloqueo exclusivo, que se puede encontrar (por ejemplo) cuando se intenta abrir un identificador de un dispositivo que Windows considera que un sistema de teclado o de ratón. Aunque usted no puede leer o escribir de la manija, usted todavía puede enviar una característica de informe para el dispositivo utilizando HidD_SetFeature y leer un informe desde el dispositivo a través HidD_GetFeature. No sé de improviso de una forma de leer la entrada de los informes o enviar informes de salida bajo estas circunstancias, y tal vez sea imposible hacerlo, pero puede que no necesite ninguno de ellos, especialmente si el dispositivo es «su» dispositivo en el sentido de que puede controlar el firmware. Estrictamente hablando, esto no hace nada para responder a su pregunta como le hacen, pero parecía potencialmente relevantes, de manera que pensé en tirar por ahí.

    OriginalEl autor zaphod

  4. 0

    Cool – voy a tratar de esas opciones, como son probablemente mejores valores predeterminados dado mis intenciones. Por desgracia, sé que mi dispositivo está ahí y que finalmente va a necesitar acceso de lectura/escritura más tarde (una vez me inspeccionar los descriptores y han verifed es de hecho mi dispositivo).

    Lo que significa que mi objetivo real ES saber lo que se usa, de modo que puedo informar al cliente/usuario: «Hey hombre, ‘iexplore.exe es, actualmente, el uso de su SuperWidget dispositivo. Vas a tener que cerrar que con el fin de utilizar SuperWidget aplicación.» (si no en el nivel de la aplicación, a continuación, al menos en el teléfono de soporte de nivel).

    Se me olvidó mencionar que el windows error reportado por GetLastError() es:

    0x20. El proceso no tiene acceso al archivo porque está siendo utilizado por otro proceso.

    (Por lo que su compartir alternativas probable que obtener el archivo abierto, suponiendo que no hay FILE_SHARE_NONE en nombre de otro proceso).

    [editar]

    Sí, es doloroso bien. He visto ratones y teclados quedar bloqueado por lo que Windows utiliza para leer de ellos. También he visto que mucha gente tiene problemas dentro de una VM como Paralells en OS X, donde la ESCONDIÓ controlador de clase tiene el dispositivo abierto exclusivamente a la prevención de la máquina virtual utilizando el estándar USB solicitudes.

    He visto algún código que recrea lo que ProcessMonitor. Tal vez SysInternals es sólo la elección de ignorar los controladores de dispositivo, pero el mismo método (o una variación leve) puede ser empleado para determinar el PID.

    Mike

    OriginalEl autor Mike Haboustak

Dejar respuesta

Please enter your comment!
Please enter your name here