从用户进程访问硬件

时间:2014-08-28 08:19:30

标签: windows-embedded-compact

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

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

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

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

2 个答案:

答案 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);

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