操作步骤:
1.创建或者打开一个文件内核对象。
HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _In_ DWORD dwCreationDisposition, _In_ DWORD dwFlagsAndAttributes, _In_opt_ HANDLE hTemplateFile );
dwDesiredAccess 用于设定如何访问该文件的内容。
dwShareMode 告诉系统你打算你想如何共享这个文件,也就是你打算让后续打开该文件的程序可以拥有那些操作
lpSecurityAttributes 安全属性,通常设置为默认(NULL)
dwCreatetionDisposition 当文件存在或者不存在的时候将如何处置,对于设备而不是文件来说通常设置为OPEN_EXISTING。一般的提供了几个选项:
CREATE_ALWAYS 总是创建新的文件,如果文件时存在的那么该程序将会重写这个文件,并且将错误码置为ERROR_ALREADY_EXISTS
CREATE_NEW 仅当文件不存在的时候创建,如果文件已经存在那么函数调用失败并且错误码被置为ERROR_FILE_EXISTS
OPEN_ALWAYS 总是打开一个文件,当文件不存在的时候函数将会创建一个文件。
OPEN_EXISTING 当且仅当文件存在时被打开,文件不存在则函数调用失败、,错误码置为ERROR_FILE_NOT_FOUND
TRUNCATE_EXISTING 仅当存在时打开这个文件并且把他的长度清零。
dwFlagsAndAttributes
文件的属性和标志,通常设置为FILE_ATTRIBUTE_NORMAL
hTemplateFile
一个模板文件的有效句柄,该句柄拥有GENERIC_READ权限,这个模板文件为将要创建的文件提供文件的属性和扩展属性,参数可以是NULL,当打开一个已经存在的文件的时候,这个参数将会被忽略。当打开一个新的被加密了的文件,这个文件将从他的父目录继承任意的权限控制列表。
eg:CreateFile(_T("recv.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
2.创建一个文件映射内核对象。
HANDLE WINAPI CreateFileMapping( _In_ HANDLE hFile, _In_opt_ LPSECURITY_ATTRIBUTES lpAttributes, _In_ DWORD flProtect, _In_ DWORD dwMaximumSizeHigh, _In_ DWORD dwMaximumSizeLow, _In_opt_ LPCTSTR lpName );
flProtect
将什么保护属性赋予物理存储器的页面,可用的参数
PAGE_READONLY(当文件映射对象被映射时,可以读取文件的数据) 、
PAGE_READWROTE(可以读取或者写入文件的数据但是必须已经将GENERIC_READ|GENERIC_WRITE属性传递给CreateFile)、
PAGE_WRITECOPY(当文件映射对象被映射时可以读取或者写入数据。如果写入数据,会导致页面的私有拷贝得到创建。但是必须将GENERIC_READ或者GENERIC_WRITE传递给CreateFile)
dwMaximumSizeHigh、dwMaximumSizeLow这两个参数最为重要。CreateFileMapping函数的只要作用就是保证文件映射对象能够得到足够的物理存储器。这两个参数将告诉文件的最大字节数如果想要创建一个文件映射对象使他能够反映文件当前的大小,那么可以为上面两个参数传递0,如果只打算读取文件或者访问文件而不是改变他的大小,那么这两个参数传递为0。如果打算将数据附加给该文件那么可以选择最大的文件大小,以便留出一些富裕的空间。
3.将文件数据映射到进程的地址空间。