2014-08-28 2 views
1

У меня есть драйвер, который запускается в ядре Windows Embedded Compact 2013. Драйвер загружен с помощью раздела реестра «Драйверы \ Встроенный». Он обращается к набору HW-регистров, которые сопоставляются с MmMapIoSpace.Доступ к оборудованию из пользовательского процесса

Доступ к оборудованию имеет некоторые проблемы. Вот почему я хотел бы разработать аппаратный доступ в программе пользовательского режима и отладить проблемы. Для этой цели я создал программу VS2013. Так мы привыкли работать с Windows CE 5.0.

Драйвер отображает физический адрес с адресом MmMapIoSpace в адресное пространство процесса. Моя программа должна делать то же самое или что-то подобное. К сожалению, это не работает в моей программе. MmMapIoSpace возвращает NULL, LastError = 87 (недопустимые параметры). Даже CreateStaticMapping возвращает NULL.

Как я могу получить доступ к картографическому регистру памяти в WEC2013 без создания новой платформы для каждой итерации?

ответ

1

MmMapIoSpace больше не работает в приложениях с WinCE6. Возможно, вы можете создать драйвер, который отобразит ваш hw-регистр в пользовательском процессе. Тогда ваш пользовательский процесс получит этот указатель с помощью ioctl-вызова этого драйвера. Мы сопоставили некоторую внешнюю память с приложением с помощью этого метода. VirtualAllocCopyEx() может создавать сопоставление с заданным процессом. Надеюсь, это поможет. Приветствую.

0

В соответствии с timmfs ответа я реализовал этот код в функции XXX_IOControl водителя:

PHYSICAL_ADDRESS PhysAddress = { 0 }; 
PhysAddress.LowPart = phys_address; 
PVOID pRegister = MmMapIoSpace(PhysAddress, phys_size, FALSE); 

HANDLE hCallerProcess = (HANDLE)GetCallerVMProcessId(); 
HANDLE hCurrentProcess = (HANDLE)GetCurrentProcessId(); 
PVOID UserSpaceAddress = VirtualAllocCopyEx(hCurrentProcess, hCallerProcess, pRegister, shys_size, PAGE_NOCACHE); 

Этот отрывок показывает некоторые решения для подводных камней, которых я встретил. Поэтому я показываю, как я получаю все параметры.