Pregunta

Nuestro programador de sistemas ha desarrollado la cáscara de un controlador de puerto serie virtual para nuestro hardware móvil incrustado, y he sido llenado en los métodos para conseguir que funcione. El controlador funciona como se espera, se simula un puerto COM para un dispositivo USB que está expulsando NMEA cuerdas (GPS datos).

I tipo WM6 para abreviar, pero el sistema operativo es WM6.1 si hace alguna diferencia.

El problema que estoy teniendo es que el controlador no se carga en el arranque del dispositivo en un solo WM6. El conductor fue desarrollado para tanto CE5 y WM6, pero en CE5 el controlador "hace" la carga en el arranque, lo que me está apuntando a un problema de configuración WM6. Es tal vez vale la pena destacar en este punto que el controlador se cargará en WM6 y CE5 utilizando el método ActivateDevice (), esto es lo que he estado usando hasta ahora para WM6, una pequeña aplicación de prueba para poner en marcha el conductor por lo que puede por lo menos prueba de que el conductor está trabajando en WM6.

El registro ya contiene las claves necesarias para la puesta en marcha del conductor. Por lo que el conductor debe cargar durante el inicio sin ningún problema. HKEY_LOCAL_MACHINE \ Drivers \ BuiltIn contiene una clave sub A36D_GPS_COM, y en esa clave está contenido.

DeviceArrayIndex: 0

DeviceType: 0

DLL: A36D.dll

Banderas: 0

Nombre descriptivo: A36D GPS puerto COM

Índice: 8

Orden: 3

Prefijo: COM

Prioridad: 0

Prioridad: 256

Por lo que puedo decir en general hay 2 respuestas comunes a este problema que ya he investigado. Estas ideas me fueron dadas por el programador incorporado, pero yo investigamos cómo hacerlo yo mismo.

1) El puerto COM ya está en uso cuando los intentos de controladores a la carga, incluso si ese puerto COM es finalmente libre una vez que se carga el dispositivo. He cambiado el valor del índice en el registro de entre 1 a 20 y reiniciado el dispositivo y el controlador no se carga en un puerto COM especificado. Así que para tratar de probar esto más a fondo, que se han trasladado a otro dispositivo de COM9 a COM8 y se trasladó a mi conductor COM9 (usando la configuración del registro anteriores). Las otras cargas de controladores de dispositivos en el arranque en COM8 absolutamente feliz pero mi controlador de dispositivo no se iniciará en COM9. Incluso he intentado ajustar los otros ajustes, pero todavía no se carga el en el arranque.

2) Otros posibles problemas y las diferencias entre CE5 y WM6 es la seguridad. Así, utilizando el artículo de MSDN http://msdn.microsoft.com/en-us /library/bb737570.aspx he trabajado en la firma y XML de aprovisionamiento. Usando una llave privilegiada (no expirado), La A36D.dll se firmó en el estudio visual y el archivo CAB instalación creada también se firmó con la misma clave. Un archivo _setup.xml se crea y se añade al archivo de la cabina de manera que se añade la clave firmada al almacén de certificados. El archivo CAB se firmó de nuevo con la misma clave para asegurarse de que sigue siendo válida. Además, el _setup.xml está empaquetado en su propio archivo .CPF. Tanto la ACB archivos CAB y no se añade la clave de los almacenes de certificados "HKEY_LOCAL_MACHINE \ Comm \ Security \ SystemCertificates" por lo que saben que esto esté funcionando. Como cuestión de precaución He instalado a los privilegiados, sin privilegios, raíz y almacenes de certificados SPC. Sin embargo, el controlador de dispositivo no se carga en Device.exe cuando se inicia el dispositivo móvil.

Aparte de una solución de una solicitud de puesta en marcha que llama ActivateDevice () en el controlador, estoy perplejo sobre cómo llegar a este controlador de carga en el arranque.

Me parece muy extraño que trabaja en CE5 pero no en WM6, yo no sé de cualquier otra cosa que podría estar causando problemas.

¿alguien tiene alguna otra sugerencia que se pueden probar.

Toda la ayuda apreciada.

¿Fue útil?

Solución

Estoy más familiarizado con Windows CE, pero aquí hay un par de cosas:

  • ¿Ha agregado una impresión de depuración en la función DllMain para ver si se le llama?
  • ¿verificó si había un salto de dependencia. Podría ser que de alguna manera tiene una DLL disponible bajo los términos de la CE 5 que no está allí bajo WM6?

Otros consejos

Esta es una respuesta, pero no el 'derecho'. Se trata simplemente de una obra en torno al tema de carga. Me di cuenta de esto hace más de una semana, pero no quería usarlo como la solución. Así que esto es de esperar que sólo una solución temporal.

El siguiente código se utiliza para cargar el controlador manualmente, Su escrito en C # utilizando llamadas de C ++, estoy acostumbrado a C # y por eso no lo hice un proyecto de C # a C ++ uno. Aquellos que usan C ++, sin duda, va a crear esto en una aplicación C ++.

public class LoadDriver
{
    [DllImport("coredll.dll", SetLastError = true)]
    public extern static IntPtr ActivateDevice(string lpszDevKey, int dwClientInfo);
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern void SignalStarted( uint dw);

    public static void Main(string[] args)
    {
        Cursor.Current = Cursors.Default;
        IntPtr handle = ActivateDevice("Drivers\\BuiltIn\\A36D_GPS_COM", 0);
        if(handle != IntPtr.Zero)
        {
            Console.Write("Success");
        }

        if (args.Length > 0)
        {
            try
            {
                SignalStarted(uint.Parse(args[0]));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

Ahora bien, para que esto funcione es necesario que se ejecute en el arranque, por lo que añade en las claves del registro.

"HKEY_LOCAL_MACHINE/init"
Launch62 = A36D_loaddriver.exe
Depend62 = "32 00"

"32 00" es para asegurar que las cargas después de la Shell32.exe

Ahora el la puesta en marcha del dispositivo, el controlador se activa en Device.exe.

En cuanto a la cuestión de la firma / registro, este todavía está siendo examinado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top