9 августа 2011 г.

Создание и использование Shim DLL для получения логов общения через COM-порт.

Продолжаю решать задачу получения лога общения ПО RoadRover со своим оборудованием по последовательным (COM) портам. Описанный ранее способ Spy не работает под WinCE 6.0. Какие есть ещё способы снять лог работы с COM портом? Можно сделать виртуальный COM-порт, этакий прокси, но это довольно хлопотно. Есть более простой способ — воспользоваться Application Verifier.

Application Verifier — это средство для отладки приложений. Оно входит в состав Windows Embedded CE 6.0 Test Kit, которое устанавливается вместе с Platform Builder или может быть установленно отдельно с сайта Microsoft.

Работает Application Verifier посредством так называемых Shim DLL. Эти DLL интегрируются в исследуемое приложение. Код этих DLL выполняется между точкой вызова конкретной функции API и непосредственным входом в соответствующую функцию API. Другими словами, это стандартный способ перехвата вызовов API.

Создав свою Shim DLL, перехватывающую обращение к последовательным портам, можно получить лог общения программного обеспечения RoadRover со своей аппаратной частью.

Далее описан процесс создания Shim DLL, а ниже описано где взять уже готовую Shim DLL и как её использовать на устройстве.


Создание Shim DLL

В Platform Builder имеется инструментарий для создания своих Shim DLL, в том числе и с графическим интерфейсом — ShimGenUI. Для работы этого инструмента требуются файлы dumpbin.exe и link.exe, поэтому путь до них должен быть прописан в окружении. Для этого можно запустить «Visual Studio 2005 Command Prompt» из меню «Пуск», а далее в появившемся консольном окне перейти в директорию "%ProgramFiles%\Microsoft Platform Builder\6.00\cepb\wcetk\ddtk\desktop\” и запустить shimgenui.exe.
В окне приложения вводим в поле Original DLL путь до coredll.dll. Если Вы прежде собирали образ WinCE (см. "Строительство Windows CE 6 под эмулятор для запуска ПО ГУ RoadRover"), то файл coredll.dll можно найти в результате сборки: “RelDir\DeviceEmulator_ARMV4I_Release\coredll.dll”. Далее выбираем из появившегося списка функции CreateFileW, ReadFile и WriteFile. Для поиска функций в списке поможет поле API Filter. В поле Output file необходимо внести путь и имя файла с расширением .c или .cpp, в котором будут сгенерированы заготовки перехватчиков выбранных функций. Назовем файл ShimCom.cpp. Нажимаем кнопку Generate Code. В процессе генерации будут созданы несколько файлов в директории, указанной в поле Output file.

Далее для удобства я создаю в MSVS проект Win32 Smart Device Project. Называю его ShimCom. В качестве SDK выбираю ранее созданный и установленный RREmul_SDK. В Application Settings выбираю DLL и Empty project. В созданный проект добавляю все файлы .h, .c, .cpp, .rc, .def. В настройках проекта необходимо указать файл описывающий экспортируемые функции, поэтому открываем Propierties -> Linker -> Input и в поле Module Definition File прописываем shim_ShimCom.def.

Теперь можно открыть в редакторе MSVS файл ShimCom.cpp и написать реализацию функций-перехватчиков: APIHook_CreateFileW, APIHook_ReadFile и APIHook_WriteFile. В данном случае реализуем логирование вызова функций в файл. Детали реализации можно посмотреть в репозитории моего проекта.

В результате сборки проекта получаем ShimCom.dll.

Использование Application Verifier и ShimCom.dll

Для использования полученной ранее Shim DLL на устройстве копируем на SD три файла:
  • appverif.exe
  • verifhlp.dll   
  • ShimCom.dll
Все эти файлы есть в сборке, которую можно скачать здесь.
Самостоятельно первые два файла можно взять из директории "%ProgramFiles%\Microsoft Platform Builder\6.00\CEPB\wcetk\ddtk\armv4i\", если у Вас установлен Platform Builder или отдельно поставлен Windows Embedded CE 6.0 Test Kit.

Запускаем на устройстве appverif.exe. В появившемся окне Application Verifier с помощью кнопки ”Add...” добавляем в список Applications exe-файл приложения, процесс которого хотим мониторить, в нашем случае это Telephone.exe или Manager.exe, либо сразу оба эти приложения. Далее с помощью кнопки ”Add Shim...” добавляем ShimCom.dll и в списке Test settings ставим галку в появившемся элементе ”COM Logger” для добавленных ранее приложений.
Теперь не закрывая Application Verifier запускаем исследуемое приложение. Это можно сделать кнопкой “Run”, либо непосредственным запуском через Explorer. Обратите внимание, что в запускать надо Manager.exe, а он уже сам запустит Telephone.exe.
В корневой директории должен появиться файл com_log.txt, куда и логируются обращения к COM-портам.

В следующий раз я опишу анализ полученного таким способом лога.

9 комментариев:

  1. Очень интересно с точки зрения пользователя RR,
    из-за его (RR) косячности. Что с анализом лога обращений к СОМ-порту. На разных версиях оболочки D2280 под разными прошивками ОС и MCU различные глюки- у одних не работает блютуз, у других RDS, ... компас, спидометр

    ОтветитьУдалить
    Ответы
    1. Спасибо за проявленный интерес и прошу прощения, что совсем запустил блог.
      Причина банальная - нехватка времени. Но это не оправдание лени :)
      Время, которое удается уделить этому проекту, уделяю не блого-писательству, а кодо-писательству.
      Логи проанализированы. За подробностями по некоторым деталям я обратился непосредственно к разработчикам RR и получил ответ (!) с документами по старым протоколам. Поэтому опубликовывать описание протоколов теперь морально как-то неправильно. Я применил эти знания и постепенно рождается продукт, с которым я Вас познакомлю в ближайшее время. Пока он ещё очень сырой и внешне неприглядный. Кстати, по поводу неприглядности... Я бы был очень рад помощи дизайнера и юзабелиста, т.к. сам я специалист исключительно по программерской части.

      Удалить
    2. Этот комментарий был удален администратором блога.

      Удалить
  2. Документы по протоколам можете выложить или подписывали NDA ?

    ОтветитьУдалить
    Ответы
    1. NDA не подписывал, но выкладывать в свободный доступ не стану. Могу предоставить почтой.

      Удалить
  3. Очень интересный блог, жаль что забросили. Не могли бы вы поделиться о том, каким образом устройство общается с модулем bluetooth? Есть магнитола штатная в Лада гранта, пишем свою оболочку. Модуль ВТ фирмы nFore с соответствующей библиотекой dll в комплекте с штатной оболочкой, но как ее использовать, вообще как работать с ВТ - темный лес.

    ОтветитьУдалить
    Ответы
    1. Я не занимался вопросами BT, но где-то проскакивало, что его врядли можно использовать для чего-то кроме как подключения к телефону, как гарнитуры. Для прочих подключений (интернет, датчики, CAN и т.п.) используют внешний BT-модуль.

      Удалить
  4. Здравствуйте.Почитал ваш блог интересно...У меня соренто 2013 ГУ с родной оболочкой UVO (WinCE 6.0 MIPII) и задача такая приладить нашу навигацию и русифицировать. Хочу для начала снять лог через перехват АПИ функций CreateFileW, ReadFile и WriteFile а потом динамечски делать нужные преобразования.Подскажите если знаете как сделать? Наброски уже есть.urban81@yandex.ru

    ОтветитьУдалить
    Ответы
    1. Снять лог можно через Application Verifier и соотв. Shim DLL. Я описывал этот способ в этом посте: http://progandhack.blogspot.ru/2011/08/shim-dll-com.html

      Удалить