tbdriver
驱动牛犊
驱动牛犊
  • 注册日期2008-07-17
  • 最后登录2008-11-03
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望28点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1781回复:1

请教:MmMapIoSpace映射后在用户程序中如何访问

楼主#
更多 发布于:2008-09-25 19:00
我现在的做法是这样的:
驱动程序分配了一段连续的内存空间,然后用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);



想问下是什么问题的,是访问方式不对,还是没办法实现用户层直接访问内核内存空间的?

谢谢
tbdriver
驱动牛犊
驱动牛犊
  • 注册日期2008-07-17
  • 最后登录2008-11-03
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望28点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-10-04 21:16
MmMapIoSpace用法不对
游客

返回顶部