Проблемы с загрузкой драйвера устройства при запуске - WM6.1 - PullRequest
1 голос
/ 27 августа 2010

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

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

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

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

DeviceArrayIndex: 0

DeviceType: 0

Dll: A36D.dll

Флаги: 0

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

Индекс: 8

Заказ: 3

Префикс: COM

Приоритет: 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-файл также подписывается тем же ключом. Файл _setup.xml создается и добавляется в файл cab, чтобы подписанный ключ был добавлен в хранилище сертификатов. CAB-файл снова подписывается тем же ключом, чтобы гарантировать его действительность. Кроме того, _setup.xml упакован в свой собственный файл .CPF. И файлы CAB, и файлы CPF добавляют ключ в хранилища сертификатов "HKEY_LOCAL_MACHINE \ Comm \ Security \ SystemCertificates", так что знайте, что это работает. В целях предосторожности я установил его в хранилища сертификатов Privileged, Unprivileged, ROOT и SPC. Но драйвер устройства по-прежнему не загружается в device.exe при загрузке мобильного устройства.

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

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

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

Вся помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 29 августа 2010

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

  • Вы добавили отладочную печать в функцию DllMain, чтобы увидеть, вызывается ли она?
  • Вы проверяли разрыв зависимости. Может ли быть так, что у вас есть Dll под CE 5, которого нет под WM6?
0 голосов
/ 01 сентября 2010

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

Следующий код используется для загрузки драйвера вручную. Он написан на 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

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

Что касаетсяпроблема подписи / реестра, это все еще рассматривается.

...