Проблемы, получающие драйвер устройства для загрузки при запуске - WM6.1

StackOverflow https://stackoverflow.com/questions/3585333

Вопрос

Наши программисты встроенные системы разработали оболочку драйвера виртуального последовательного порта для нашего мобильного оборудования, и я заполняю методы, чтобы получить его на работу. Водитель выполняет работу, как ожидалось, он имитирует COM-порт для USB-устройства, который известен строки NMEA (данные GPS).

Я введите WM6 для короткой, но ОС WM6.1, если это имеет значение.

Проблема, имеющая, что водитель не загружается при запуске устройства только на WM6. Водитель был разработан как для CE5, так и WM6, но на CE5 драйвере «делает» нагрузку при загрузке, который указывает на проблему конфигурации WM6. Это, может быть, стоит отметить на данный момент, что водитель будет загружаться в WM6 и CE5, используя метод Activeatedevice (), это то, что я использовал до сих пор для WM6, небольшого приложения для тестирования для запуска драйвера, чтобы я мог хотя бы проверить драйвер работает над WM6.

Реестр уже заполнен необходимыми ключами для запуска драйвера. Таким образом, водитель должен загружаться при запуске без каких-либо проблем. HKEY_LOCAL_MACHINE Драйверы Встроенные содержит SUB KEY A36D_GPS_COM и в этой клавише содержится.

DeviceArrayindex: 0.

DeviceType: 0.

Dll: a36d.dll.

Флаги: 0.

Дружеское имя: A36D GPS COM-порт

Индекс: 8.

Заказ: 3.

Префикс: ком

Приоритет: 0.

Приоритет: 256.

Из того, что я могу сказать, как правило, 2 общих ответа на этот вопрос, который я уже исследовал. Эти идеи были переданы мне встроенным программистом, но я исследовал, как сделать их сам.

1) COM-порт уже используется, когда драйвер пытается загрузить, даже если этот COM-порт в конечном итоге не содержит, как только устройство загружено. Я изменил значение индекса в реестре от 1 до 20 и перезагрузил устройство, а драйвер не загружается на указанный COM-порт. Так что для того, чтобы попробовать тестировать это более тщательно, я переместил другое устройство от COM9 в COM8 и переместил свой драйвер в COM9 (используя вышеуказанные настройки реестра). Другой драйвер устройства нагрузки при запуске на COM8 довольно радостно, но мой драйвер устройства не загружается на COM9. Я даже попробовал настроить другие настройки, но все же он не загружает при загрузке.

2) Еще одним возможными вопросами и разницей между CE5 и WM6 является безопасность. Так что используя статью MSDN http://msdn.microsoft.com/en-us/library/bb737570.aspx. Я работал над подписанием и предоставлением XML. Использование привилегированного ключа (не имеет истек), A36D.dll подписан в Visual Studio и созданный файл CAB CAB также подписан с одним и тем же ключом. Файл _setup.xml создается и добавляется в файл CAB, чтобы подписанный ключ добавлен в магазин сертификата. Файл CAB снова подписан с той же клавишей, чтобы убедиться, что он все еще действителен. Кроме того, _setup.xml упакован в свой собственный файл .cpf. Как файлы CAB и CPF добавляют ключ к хранимам сертификата «HKEY_LOCAL_MACHINE Comm Security SystemCertificates», так что знайте это работает. В случае осторожности я установил его к привилегированным, безвибальным, корневым и SPC-сертификатам. Но драйвер устройства по-прежнему не загружается в Diverse.exe, когда мобильное устройство сапоги.

Кроме обдумывания приложения запуска, которое вызывает ActivateviceVice () на водителе, я озадачен тем, как заставить этот драйвер загрузить при запуске.

Я считаю это очень странным, он работает в CE5, но не в WM6, я просто ничего не знаю ни о чем, что могло бы причинить проблемы.

У кого-нибудь есть какие-то дополнительные предложения, которые можно попробовать.

Все помогают оценить.

Это было полезно?

Решение

Я более знаком с Windows CE, но вот несколько вещей:

  • Вы добавили отладочную печать в функции DLLMain, чтобы увидеть, называется ли она?
  • Вы проверили на перерыв на зависимостью. Может быть, как-то у вас есть DLL, доступна под CE 5, которая там не там под WM6?

Другие советы

Это ответ, но не «правый» один. Это просто работа вокруг проблемы погрузки. Я полагал это в течение недели назад, но не хотел использовать его как решение. Так что это, надеюсь, просто исправить Temp.

Следующий код используется для загрузки драйвера вручную, его написанный в C # с использованием вызовов C ++, я используется для C #, поэтому я сделал проект C #, а не C ++. Те, кто используют C ++, несомненно, создают это в приложении 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);
            }
        }
    }
}

Теперь, чтобы это было работать, он должен быть запущен при запуске, поэтому я добавил в нужные ключи реестра.

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

«32 00» - обеспечить его нагрузки после Shell32.exe

Теперь стартап устройства драйвер активируется в устройстве .exe.

Что касается выпуска подписания / реестра, это все еще выглядит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top