1

我有一个在 Windows Embedded Compact 2013 内核中运行的驱动程序。该驱动程序加载了“Drivers\BuiltIn”注册表项。它访问一组用 映射的硬件寄存器MmMapIoSpace

对硬件的访问存在一些问题。这就是为什么我想在用户模式程序中开发硬件访问并调试问题。为此,我使用 VS2013 创建了一个程序。这就是我们过去使用 Windows CE 5.0 的方式。

驱动程序将物理地址映射MmMapIoSpace到进程地址空间。我的程序应该做同样或类似的事情。不幸的是,这在我的程序中不起作用。MmMapIoSpace 返回 NULL,LastError=87(无效参数)。甚至CreateStaticMapping返回 NULL。

如何在不为每次迭代构建新平台的情况下访问 WEC2013 中的内存映射寄存器?

4

2 回答 2

1

自 WinCE6 以来,MmMapIoSpace 不再适用于应用程序。您也许可以创建一个驱动程序,将您的硬件注册映射到您的用户进程。然后,您的用户进程将通过对此驱动程序的 ioctl 调用来获取此指针。我们使用这种方法将一些外部存储器映射到应用程序。VirtualAllocCopyEx() 可以创建到指定进程的映射。希望这可以帮助。问候。

于 2014-08-28T15:39:33.513 回答
0

对应 timmfs answer 我在驱动程序的 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);

这段摘录显示了我遇到的陷阱的一些解决方案。所以我展示了如何获取所有参数。

于 2014-09-02T05:36:46.047 回答