В общем разобрались с режимами win и пришли к выводу, что драйвер необходим. Теперь вернемся к драйверу.
Итак, драйвер должен просто писать и читать данные по физическому адресам: 0xdeadf000...0xdeadface. Сначала сгенерим двайвер с помощью
https://cedriverwiz.codeplex.com/.
Создаем стрим двайвер в kernel режиме, realtime сообщения и IOControl. Префикс - DDA. Путь выбирите сами.
Для этого нам надо в драйвере сказать винде, что мы хотим это сделать. Для этого в методе Init драйвера (DDA_Init(), где DDA это префикс драйвера) вызываем ф-ю MmMapIoSpace()
примерно так:
void* access_addr = MmMapIoSpace(0xdeadf000,.0xdeadface - 0xdeadf000, FALSE);
FALSE означает что нам не нужно кешировать эту память.
ВСЕ!
Теперь нам надо сохранить переменную access_addr как глобальную.
Дальше, в методе DDA_IOControl, реализуем две команды: Read и write.
Read будет: memcpy(pBufOut, access_addr, dwLenOut);
Цкшеу будет: memcpy(access_addr, pBufIn, dwLenIn);
Вот как-то так.
Теперь давайте разберемся, как нам подкомпилировать драйвер, чтобы он был установлен в видах (WinCE в нашем случае)...