共享内存对象方法(MapViewOfFile)
2007-06-22 11:07
337 查看
共享内存对象方法通常,将页面文件支持的内存映射文件作为在用户进程之间共享内存的技术。但是,可以使用相同的技术在用户进程与设备驱动程序之间共享内存。使用这种技术有两种方法。
第一种方法中,通过使用 OpenFileMapping,然后调用 MapViewOfFile 函数以获取指向某个区域或所有共享内存的指针,驱动程序可以创建命名内存对象(称为“区域对象”),并且一个或多个用户应用程序可以打开相同的对象。通过向区域对象指定保护属性,可以定义进程操纵内存的方式。
第二种方法中,应用程序可以用 CreateFileMapping 在用户模式下创建命名内存对象。驱动程序通过使用 ZwOpenSection 并调用 ZwMapViewOfSection 获取指向它的指针,可以打开相同的内存对象。始终用异常处理程序在内核模式下访问此内存地址。
由于该对象始终映射在进程的用户地址空间(小于 0x80000000,无论对象是在内核模式还是在用户模式中创建的)中,因此只在进程上下文中访问地址时,地址才有效。每次在相同内存对象上调用 MapViewOfFile 或 ZwMapViewOfSection 时,都将返回不同的内存地址(即使是相同的进程,也是如此)。建议不要使用这种方法(尤其是低级设备驱动程序),正如前面所述,这是因为地址范围限定于进行对象映射的进程,并且不能在 DPC 或 ISR 中对地址进行访问。另外,在 DDK 中没有记载在内核模式下创建内存对象的 API。
但是,要在提高的 IRQL(如 DPC 或 ISR 中)上使用该地址,必须查明并锁定缓冲区页面,并获取系统虚拟地址 MmGetSystemAddressForMdl(正如本文前面 IOCTL 方法中所述)。
仅当要在两个(或更多)用户进程与一个(或多个)设备驱动程序之间共享内存的情况下,这种方法才比较简便。否则,使用 IOCTL 技术在用户进程与设备驱动程序之间共享内存更加简单高效。
第一种方法中,通过使用 OpenFileMapping,然后调用 MapViewOfFile 函数以获取指向某个区域或所有共享内存的指针,驱动程序可以创建命名内存对象(称为“区域对象”),并且一个或多个用户应用程序可以打开相同的对象。通过向区域对象指定保护属性,可以定义进程操纵内存的方式。
第二种方法中,应用程序可以用 CreateFileMapping 在用户模式下创建命名内存对象。驱动程序通过使用 ZwOpenSection 并调用 ZwMapViewOfSection 获取指向它的指针,可以打开相同的内存对象。始终用异常处理程序在内核模式下访问此内存地址。
由于该对象始终映射在进程的用户地址空间(小于 0x80000000,无论对象是在内核模式还是在用户模式中创建的)中,因此只在进程上下文中访问地址时,地址才有效。每次在相同内存对象上调用 MapViewOfFile 或 ZwMapViewOfSection 时,都将返回不同的内存地址(即使是相同的进程,也是如此)。建议不要使用这种方法(尤其是低级设备驱动程序),正如前面所述,这是因为地址范围限定于进行对象映射的进程,并且不能在 DPC 或 ISR 中对地址进行访问。另外,在 DDK 中没有记载在内核模式下创建内存对象的 API。
但是,要在提高的 IRQL(如 DPC 或 ISR 中)上使用该地址,必须查明并锁定缓冲区页面,并获取系统虚拟地址 MmGetSystemAddressForMdl(正如本文前面 IOCTL 方法中所述)。
仅当要在两个(或更多)用户进程与一个(或多个)设备驱动程序之间共享内存的情况下,这种方法才比较简便。否则,使用 IOCTL 技术在用户进程与设备驱动程序之间共享内存更加简单高效。
相关文章推荐
- Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- c++中共享内存操作函数MapViewOfFile解析(二)
- Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- [转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
- 使用文件映射的方式进行共享数据中CreateFileMapping、MapViewOfFile函数参数说明
- CreateFileMapping, MapViewOfFile 实现文件共享 (.net4.0 built-in)
- 内存映射文件,UnmapViewOfFile/MapViewOfFile(转载)
- CreateFileMapping, MapViewOfFile 实现文件共享
- (转)mapViewOfFile内存文件读写
- [zz]内存映射文件,UnmapViewOfFile/MapViewOfFile(转载)
- CreateFileMapping, MapViewOfFile 实现文件共享
- 用MapViewOfFile处理大文件-内存不足
- 用MapViewOfFile处理大文件-内存不足(转帖学习)
- 分析调用mapviewoffile 时得到拒绝访问的错误信息的原因
- MapViewOfFile
- CreateFileMapping ,MapViewOfFile和OpenFileMapping的用法
- MapViewOfFile
- MapViewOfFile 内存泄露
- CreateFileMapping/OpenFileMapping/MapViewOfFile