我有一个在Windows Embedded Compact 2013的内核中运行的驱动程序。驱动程序加载了“Drivers \ BuiltIn”注册表项。它访问一组与MmMapIoSpace
映射的HW寄存器。
访问硬件存在一些问题。这就是我想在用户模式程序中开发硬件访问并调试问题的原因。为此,我用VS2013创建了一个程序。这就是我们过去使用Windows CE 5.0的方式。
驱动程序将物理地址与MmMapIoSpace
映射到进程地址空间。我的程序应该做同样或类似的事情。不幸的是,这在我的程序中不起作用。 MmMapIoSpace返回NULL,LastError = 87(无效参数)。偶数CreateStaticMapping
返回NULL。
如何在不为每次迭代构建新平台的情况下访问WEC2013中的内存映射寄存器?
答案 0 :(得分:1)
自WinCE6以来,MmMapIoSpace不再适用于应用程序。 您可以创建一个将hw-register映射到用户进程的驱动程序。然后,您的用户进程将通过对此驱动程序的ioctl调用获取此指针。 我们使用此方法将一些外部内存映射到应用程序。 VirtualAllocCopyEx()可以创建指向进程的映射。 希望这可以帮助。问候。
答案 1 :(得分: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);
此摘录显示了我遇到的陷阱的一些解决方案。所以我展示了如何获得所有参数。