您的位置:首页 > 其它

共享内存对象方法(MapViewOfFile)

2007-06-22 11:07 337 查看
共享内存对象方法通常,将页面文件支持的内存映射文件作为在用户进程之间共享内存的技术。但是,可以使用相同的技术在用户进程与设备驱动程序之间共享内存。使用这种技术有两种方法。

第一种方法中,通过使用 OpenFileMapping,然后调用 MapViewOfFile 函数以获取指向某个区域或所有共享内存的指针,驱动程序可以创建命名内存对象(称为“区域对象”),并且一个或多个用户应用程序可以打开相同的对象。通过向区域对象指定保护属性,可以定义进程操纵内存的方式。

第二种方法中,应用程序可以用 CreateFileMapping 在用户模式下创建命名内存对象。驱动程序通过使用 ZwOpenSection 并调用 ZwMapViewOfSection 获取指向它的指针,可以打开相同的内存对象。始终用异常处理程序在内核模式下访问此内存地址。

由于该对象始终映射在进程的用户地址空间(小于 0x80000000,无论对象是在内核模式还是在用户模式中创建的)中,因此只在进程上下文中访问地址时,地址才有效。每次在相同内存对象上调用 MapViewOfFileZwMapViewOfSection 时,都将返回不同的内存地址(即使是相同的进程,也是如此)。建议不要使用这种方法(尤其是低级设备驱动程序),正如前面所述,这是因为地址范围限定于进行对象映射的进程,并且不能在 DPC 或 ISR 中对地址进行访问。另外,在 DDK 中没有记载在内核模式下创建内存对象的 API。

但是,要在提高的 IRQL(如 DPC 或 ISR 中)上使用该地址,必须查明并锁定缓冲区页面,并获取系统虚拟地址 MmGetSystemAddressForMdl(正如本文前面 IOCTL 方法中所述)。

仅当要在两个(或更多)用户进程与一个(或多个)设备驱动程序之间共享内存的情况下,这种方法才比较简便。否则,使用 IOCTL 技术在用户进程与设备驱动程序之间共享内存更加简单高效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ddk api