Documente Academic
Documente Profesional
Documente Cultură
dri"er a un dispositi"o concreto. .s con este ?ltimo con el que interactuamos. De hecho el cdigo del dri"er no hay que implementarlo. .n este sentido, un programa para $% sobre =indo>s puede tener 1 modos, que se refieren al ni"el de pri"ilegio en el acceso a la memoria, recursos,... 7os dos modos son@ usuario, que es el modo en el que corren las aplicaciones, y kernel, que es el modo al que tienen acceso los dri"ers $% . .n la figura 4.( podemos obser"arlo de forma mAs clara.
Aplicaciones
APIs de Windows
USER MODE
Subsistema Win 32
Aunque no es un aspecto importante en este trabajo, cuando se escribe el cdigo para un controdor para dispositi"os $% , se usa el compilador + incluido en la DDD de =indo>s, y as generar el cdigo que finalmente se aloja en el Windows Driver Model, =DC, que contiene todos los dri"ers para =indo>s. Eeamos con mAs detalle la figura anterior, para as comprender mejor el concepto de dri"ers por capas. .l detalle se representa en la figura 4.1. +omo "emos cada capa se encarga de comunicacin, mejorando as la eficiencia. un subproceso de la
Vendor Specific Client Driver defines a user interface for a custom hardware
Hardware
00.n primer lugar, antes de que una aplicacin pueda comunicarse con un dispositi"o, al conectarlo, =indo>s reconoce el dispositi"o y el dri"er a usar. A continuacin la aplicacin obtiene un manejador que identifica al dispositi"o y habilita la comunicacin. 007o siguiente es iniciar la transferencia de datos. &uede inicarse cuando la transferencia sea requerida por la aplicacin o bien al arrancar directamente. 00A partir de este momento, una aplicacin, por ejemplo escrita en lenguaje +F, necesita comunicarse con los driver client. &ara ello se usan A&Is, que incluyen funciones para abrir la comunicacin, intercambio de datos,... con el dri"er de cliente. 7os datos que son ledos o se escriben, se almacenan en un buffer que se especifica en la llamada a la A&I. De esta forma, una llamada a la funcin /eadBile no siempre recupera datos del dispositi"o sino que lo que realmente leemos son datos almacenados 3
en el buffer. 7os sistemas finales :aplicaciones; pueden usar distintos tipos de transferencias de datos@ transferencias controladas, transferencia masi"a, por interrupcin o sncronas. 7as transferencias masi"as y sncronas se usan en dispositi"os que transfieren gran cantidad de datos a rAfagas, como cAmaras o impresoras. 7os otros tipos se usan para comunicaciones rApidas de notificaciones y respuestas. +omo "emos hay muchas clasificaciones para los dispositi"os $% , cada una con su protocolo. &ero de entre ellos hay una que es el que nos interesa en nuestro caso@ dispositi"os de interfa5 humana.
5.3. GUIDS
7os G$IDs, Globally Unique Identifier, son "alores de (13 bits que identifican un"ocamente una clase o entidad. =indo>s posee 1 tipos de clases de dispositi"os, cada uno de ellos identificados por sus G$IDs un"ocas@ 0+lases de configuracin del dispositi"o, Device Setu GUID@ abarca una serie de dispositi"os que =indo>s instala de la misma forma. .n =indo>s tenemos la dev!uid." que define el G$ID para muchos dispositi"os. 0+lases de interfa5 de dispositi"o, GUID Device Interface #lasses@ &roporcionan a las aplicaciones la forma de comunicarse con un dri"er asignado a un dispositi"o de la clase. .sta G$ID puede usarla la aplicacin, incluso para requerir el a"iso del estado de la cone9in de un dispositi"o.
&odemos decir que si, por ejemplo, trabajamos con la plataforma .N.!, con la que hemos trabajado en este proyecto, ya estamos en este ni"el superior ya que da soporte a partes comunes, a tra"#s de componentes y clases, y a tra"#s de un lenguaje intermedio portable. Hay un problema, y es que .N.! hasta ahora no es capa5 de dar soporte a todas las tareas, por ejemplo para el manejo de dispositi"os $% . Nos "emos obligados al uso de A&Is :$ lication Pro!ra%%in! Interface& que nos brindan una serie de funciones y m#todos que se encuentran en libreras, para ser usadas por otro soft>are como una capa de abstraccin. No obstante, a largo pla5o el objeti"o de .N.! es eliminar la necesidad de uso de A&Is. &ongamos un ejemplo para aclarar estos conceptos. %upongamos que queremos controlar el mo"imiento del cursor del ratn en un &+. %upongamos que trabajamos en Visual Studio .'(), un lenguaje disponible para .N.!. /Apidamente pensamos en buscar una clase de la biblioteca .N.! que permita esto, de la misma forma que encontramos el componente Serial Port para manejar el puerto serie como un ni"el de abstraccin. <bser"amos que no e9iste tal librera en .N.!. &ues bien, si buscamos en la biblioteca =in)1, que almacena todas las A&Is, encontramos user)1.dll, una A&I que contiene funciones para control de dispositi"os. $no de ellos es el ratn. +omo "emos, tanto A&Is como .N.! nos proporcionan m#todos y clases para acceder a los dispositi"os, trabajando nosotros en un ni"el de abstraccin superior. &odemos preguntarnos ahora, si los dos hacen lo mismo, 6cuAl es la diferencia entre uno y otro8 Aqu entra en juego el concepto de Mana!ed y Un%ana!ed code, cdigo administrado y no administrado@ 07as A&Is de =indo>s se componen de archi"os ."* donde se almacena la declaracin de la funcin, por un lado, y por otro archi"os .dll donde estA el cdigo de la funcin. .stas usan cdigo no administrado, de forma que las dll usan cdigo mAquina ya compilado. Al hacer uso de ellas se ejecutan directamente en la +&$, de forma que no tenemos control sobre las mismas. 0.N.! usa cdigo administrado que se compila en un lenguaje intermedio, MSI+, que despu#s es ejecutado a tra"#s del #o%%on +an!ua!e ,unti%e. 7a HgestinI de nuestro cdigo tiene "entajas, ya que nuestro cdigo es portable entre mAquinas y entre lenguajes de distinto tipo. !ambi#n e9iste gestin de la memoria, de forma 5
que se libera la memoria usada y otras tareas de forma automAtica. .sta ?ltima puede "erse como un incon"eniente, ya que el programador no tiene control directo sobre la memoria. +omo la plataforma .N.! no da soporte a todas las tasks, en el desarrollo de la misma se ha dado libertad al programador de usar cdigo no administrado en sus aplicaciones, as tambi#n promo"er la difusin de esta plataforma. %i usamos cdigo no administrado en nuestro cdigo administrado, hay que asegurar un cambio correcto. As por ejemplo para usar los datos de"ueltos por una A&I, los datos deben ordenarse :%ars"allin!;. As se hace lo necesario para que estos datos est#n disponibles al cdigo administrado@ copiar datos a memoria administrada y-o con"ertir tipos de datos. &or ?ltimo hay que decir que cuando decidimos usar A&Is =in)1 nos puede lle"ar mucho tiempo decidir cuAl es la funcin que se ajusta a nuestras necesidades y la dll necesaria. .n '(1* tenemos un gran recurso donde estAn todas las A&Is documentadas. Algunas A&Is muy usadas son@ 0setu a i.dll@ %e encarga de la deteccin de dispositi"os. 0kernell-..dll@ /elacionado con la apertura de comunicaciones con los dispositi"os. 0user-..dll@ dispositi"os. Bunciones relati"as a comunicacin con los
.n HID, el intercambio de datos se hace a tra"#s de ,e orts* de los que ya hemos hablados. No son mAs que estructuras con un cierto formato fle9ible, y que pueden manejar muchos tipos de datos. +ada report tiene un tama,o fijo. AdemAs se conoce como responder a los datos de un cierto report, as, saber que report usar para la respuesta. .n general hay ) tipos de reports@ de entrada, salida y de caractersticas. +omo mencionamos antes, en $% hay distintos tipos de transferencias. .n el caso de HID slo se usan las tranferencias de control y por interrupcin. &or otro lado, en HID se usan descriptores que contienen el tama,o de los datos que "an contenidos en los reports, as como informacin adicional. =indo>s tiene acceso e9clusi"o a los reports de entrada de los dispositi"os, ratones, teclados,..., de modo y forma que las aplicaciones no pueden leer directamente los reports asociados a ellos, pulsaciones de ratn, mo"imientos, pulsaciones de teclado,... .n su lugar, el %istema <perati"o controla todos estos detalles de bajo ni"el, y la aplicacin interactua con el dri"er del %.<. a tra"#s de un manejador proporcionado.
++#iberar toda la memoria consumida. !ras estas operaciones, debemos liberar el espacio de memoria que hemos ocupado con las estructuras anteriores :recordar que estamos usando cdigo y memoria no administradas, de forma que .N.! no "a a liberarla por nosotros;. .sto se hace mediante una llamada a Setu DiDestroyDevice0Info+ist.
&ara eso usamos la A&I de 1ernell-..dll* #reate2ile. .sta funcin de"uel"e un manejador que habilita la comunicacin con el dispositi"o, con #l podemos intercambiar por ejemplo, reports de la clase HID. +uando el manejador es obtenido, se puede pasar a un objeto de flujo de fichero :2ileStrea%; para hacer lecturas y escrituras como si de un fichero se tratase. 7a "erdadera usamos operaciones de entrada-salida proceso principal, potencialidad de esto se obtiene si ademAs de lectura y escritura asncronas@ el proceso se lle"a a cabo en un hilo independiente al y que no lo bloquea.
&odemos programar el a"iso de que ha tenido lugar alg?n e"ento. De esta forma nos llega la notificacin del e"ento, y definir un m#todo que se ejecute cuano ourra. !odo ocurre en un hilo distinto. CAs adelante "eremos como se han resuelto estas cuestiones de forma mAs concreta, en el entorno de programacin con el que hemos trabajado.