阅读:1781回复:1
请教:MmMapIoSpace映射后在用户程序中如何访问
我现在的做法是这样的:
驱动程序分配了一段连续的内存空间,然后用MmMapIoSpace映射得到一个UserSpaceAdd,将地址值返回给用户程序。 在用户程序中就用指针操作(UserSpaceAdd为起始地址)进行访问,访问时出现错误access violation 用户层和内核交互是用ioctl实现的,对应的代码如下: 驱动 case IOCTL_MapM1: { ULONG UserSpaceAdd; PULONG Ptemp=&UserSpaceAdd; UserSpaceAdd=(ULONG)MmMapIoSpace(pdx->DmaM1StartAddP,pdx->DmaM1Length,MmNonCached); KdPrint(("User Space Address:%x\n",UserSpaceAdd)); RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Ptemp, 4); info=4; break; } 用户程序函数 PVOID MapM1ToUserSpace(HANDLE handle) { ULONG nReadNumber; DWORD M1UserAddress; PDWORD PM1UserAddress=&M1UserAddress; DeviceIoControl(handle, IOCTL_MapM1, NULL, 0, PM1UserAddress, 4, &nReadNumber, NULL); return (PVOID)M1UserAddress; } main调用 PVOID M1Adr; M1Adr=MapM1ToUserSpace(hDevice); printf("M1Adr:%x\n",M1Adr); memcpy(M1Adr,InputToM1,10); 想问下是什么问题的,是访问方式不对,还是没办法实现用户层直接访问内核内存空间的? 谢谢 |
|
沙发#
发布于:2008-10-04 21:16
MmMapIoSpace用法不对
|
|