【我的】Window驱动开发——内存映射的基本使用
作者:zcr214 时间:2016/5/18
内存映射文件可以用于3个不同的目的。
•系统使用内存映射文件,以便加载和执行. exe和DLL文件。这可以大大节省页文件空间和应用程序启动运行所需的时间。
•可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。
•可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据。Windows确实提供了其他一些方法,以便在进程之间进行数据通信,但是这些方法都是使用内存映射文件来实现的,这使得内存映射文件成为单个计算机上的多个进程互相进行通信的最有效的方法。
下面就来使用一下内存映射读取文件。
1. 创建或打开文件对象
首先当然要有文件对象,先要创建或者打开文件,使用ZwCreateFile这个函数是比较方便的,也可以使用ZwOpenFile,但是它只是打开,而ZwCreateFile函数可以通过设定CreateDisposition参数来达到不同的创建行为,如设为FILE_OPEN_IF是打开文件,如果已存在,则新建文件。下面是这个函数原型。
NTSTATUS
NTAPI
ZwCreateFile(
_Out_PHANDLE FileHandle,
_In_ACCESS_MASK DesiredAccess,
_In_POBJECT_ATTRIBUTES ObjectAttributes,
_Out_PIO_STATUS_BLOCK IoStatusBlock,
_In_opt_PLARGE_INTEGER AllocationSize,
_In_ULONG FileAttributes,
_In_ULONG ShareAccess,
_In_ULONG CreateDisposition,
_In_ULONG CreateOptions,
_In_reads_bytes_opt_(EaLength)PVOID EaBuffer,
_In_ULONG EaLength
);
参数说明:
FileHandle即是文件句柄,创建文件对象之后会返回文件句柄。
DesireAccess表示希望获取的权限,可以有以下四种,从字面意思即可理解。
GENERIC_READ
GENERIC_WRITE
GENERIC_EXECUTE
GENERIC_ALL
ObjectAttributes和以前在其他函数中使用的对象属性一样,需要初始化一些属性值。包括对象名称,长度,安全描述符等内容。我们这里如下初始化:
OBJECT_ATTRIBUTESobj_attr={ 0};
UNICODE_STRINGfilename_Uni