CreateFileMappingNumaA 函数 (winbase.h)

为指定文件创建或打开命名或未命名的文件映射对象,并为物理内存指定 NUMA 节点。

语法

HANDLE CreateFileMappingNumaA(
  [in]           HANDLE                hFile,
  [in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  [in]           DWORD                 flProtect,
  [in]           DWORD                 dwMaximumSizeHigh,
  [in]           DWORD                 dwMaximumSizeLow,
  [in, optional] LPCSTR                lpName,
  [in]           DWORD                 nndPreferred
);

参数

[in] hFile

要从中创建文件映射对象的文件的句柄。

必须使用与 flProtect 参数指定的保护标志兼容的访问权限打开文件。 这不是必需的,但建议打开要映射的文件进行独占访问。 有关详细信息,请参阅 文件安全和访问权限

如果 hFileINVALID_HANDLE_VALUE,则调用进程还必须在 dwMaximumSizeHighdwMaximumSizeLow 参数中指定文件映射对象的大小。 在此方案中, CreateFileMappingNuma 创建一个指定大小的文件映射对象,该对象由系统分页文件而不是文件系统中的文件提供支持。

[in, optional] lpFileMappingAttributes

指向 SECURITY_ATTRIBUTES 结构的指针,该结构确定返回的句柄是否可以由子进程继承。 的 lpSecurityDescriptor 成员
SECURITY_ATTRIBUTES 结构指定新文件映射对象的安全描述符。

如果 lpFileMappingAttributesNULL,则不能继承句柄,并且文件映射对象将获取默认的安全描述符。 访问控制在文件映射对象来自创建者的主令牌或模拟令牌的默认安全描述符中列出 (ACL) 。 有关详细信息,请参阅 文件映射安全性和访问权限

[in] flProtect

指定文件映射对象的页保护。 对象的所有映射视图都必须与此保护兼容。

此参数的取值可为下列值之一:

含义
PAGE_EXECUTE_READ
0x20
允许映射视图,以便进行只读、写入时复制或执行访问。

必须使用 GENERIC_READ 创建 hFile 参数指定的文件句柄GENERIC_EXECUTE访问权限。

PAGE_EXECUTE_READWRITE
0x40
允许映射视图,以便进行只读、写入时复制、读/写或执行访问。

必须使用GENERIC_READGENERIC_WRITEGENERIC_EXECUTE访问权限创建 hFile 参数指定的文件句柄。

PAGE_EXECUTE_WRITECOPY
0x80
允许映射视图,以便进行只读、写入时复制或执行访问。 此值等效于 PAGE_EXECUTE_READ

必须使用 GENERIC_READ 创建 hFile 参数指定的文件句柄GENERIC_EXECUTE访问权限。

Windows Vista: 此值在 Windows Vista SP1 之前不可用。

PAGE_READONLY
0x02
允许映射视图以便进行只读或写入时复制访问。 尝试写入特定区域会导致访问冲突。

必须使用GENERIC_READ访问权限创建 hFile 参数指定的文件句柄。

PAGE_READWRITE
0x04
允许映射视图,以便进行只读、写入时复制或读/写访问。

必须使用GENERIC_READ创建 hFile 参数指定的文件句柄,GENERIC_WRITE访问权限。

PAGE_WRITECOPY
0x08
允许映射视图以便进行只读或写入时复制访问。 此值等效于 PAGE_READONLY

必须使用GENERIC_READ访问权限创建 hFile 参数指定的文件句柄。

 

应用程序可以通过将以下属性与前面的页面保护值之一组合,为文件映射对象指定以下一个或多个属性。

含义
SEC_COMMIT
0x8000000
为所有页面分配内存中的物理存储或分页文件。

这是默认设置。

SEC_IMAGE
0x1000000
将指定为可执行映像文件的文件。

SEC_IMAGE 属性必须与页面保护值(如 PAGE_READONLY)结合使用。 但是,此页面保护值对可执行文件的视图没有影响。 可执行文件的视图的页面保护由可执行文件本身决定。

SEC_IMAGE中没有其他属性有效。

SEC_IMAGE_NO_EXECUTE
0x11000000
指定 hFile 参数指定的文件是不会执行的可执行映像文件,并且加载的映像文件不会运行强制完整性检查。 此外,映射使用 SEC_IMAGE_NO_EXECUTE 属性创建的文件映射对象的视图不会调用使用 PsSetLoadImageNotifyRoutine 内核 API 注册的驱动程序回调。

SEC_IMAGE_NO_EXECUTE 属性必须与PAGE_READONLY页保护值结合使用。 SEC_IMAGE_NO_EXECUTE中没有其他属性有效。

Windows Server 2008 R2、Windows 7、Windows Server 2008 和 Windows Vista: 在 Windows Server 2012 和 Windows 8 之前不支持此值。

SEC_LARGE_PAGES
0x80000000
允许在映射图像或从页面文件进行支持时使用大页面,但在映射常规文件的数据时不使用。 请务必将文件映射对象的最大大小指定为 GetLargePageMinimum 函数报告的大型页面的最小大小,并启用 SeLockMemoryPrivilege 特权。
SEC_NOCACHE
0x10000000
将所有页面设置为不可访问。

除非设备明确需要,否则应用程序不应使用此标志。 将互锁函数与 SEC_NOCACHE 映射的内存配合使用可能会导致 EXCEPTION_ILLEGAL_INSTRUCTION 异常。

SEC_NOCACHE 需要设置 SEC_RESERVESEC_COMMIT

SEC_RESERVE
0x4000000
保留所有页而不分配物理存储。

在释放页范围之前,任何其他分配操作都无法使用保留的页范围。

可以在后续调用 VirtualAllocExNuma 函数时标识保留页。 仅当 hFile 参数 INVALID_HANDLE_VALUE (即) 系统分页文件支持的文件映射对象时,此属性才有效。

SEC_WRITECOMBINE
0x40000000
将所有页面设置为写合并。

除非设备明确需要,否则应用程序不应使用此属性。 将互锁函数 与SEC_WRITECOMBINE映射 的内存结合使用可能会导致 EXCEPTION_ILLEGAL_INSTRUCTION 异常。

SEC_WRITECOMBINE 要求设置 SEC_RESERVESEC_COMMIT 属性。

[in] dwMaximumSizeHigh

文件映射对象最大大小的高序 DWORD

[in] dwMaximumSizeLow

文件映射对象最大大小的低序 DWORD

如果此参数和 dwMaximumSizeHigh 参数为 0 (零) ,则文件映射对象的最大大小等于 hFile 参数标识的文件的当前大小。

尝试映射长度为 0 (零的文件) 失败,错误代码 为 ERROR_FILE_INVALID。 应用程序应测试长度为 0 (零) 的文件,并拒绝这些文件。

[in, optional] lpName

文件映射对象的名称。

如果此参数与现有文件映射对象的名称匹配,则函数请求访问具有 flProtect 参数指定的保护的对象。

如果此参数为 NULL,则创建不带名称的文件映射对象。

如果 lpName 参数与现有事件、信号灯、互斥体、可等待计时器或作业对象的名称匹配,则函数将失败, GetLastError 函数返回 ERROR_INVALID_HANDLE。 发生这种情况的原因是这些对象共享相同的命名空间。

名称可以具有“Global”或“Local”前缀,以在全局命名空间或会话命名空间中显式创建对象。 名称的其余部分可以包含除反斜杠字符 (\) 以外的任何字符。 在全局命名空间中创建文件映射对象需要 SeCreateGlobalPrivilege 特权。 有关详细信息,请参阅 内核对象命名空间

使用终端服务会话实现快速用户切换。 第一个登录用户使用会话 0 (零) ,下一个登录用户使用会话 1 (一个) ,依此依此。 内核对象名称必须遵循准则,以便应用程序可以支持多个用户。

[in] nndPreferred

物理内存应驻留的 NUMA 节点。

含义
NUMA_NO_PREFERRED_NODE
0xffffffff
不首选 NUMA 节点。 这与调用 CreateFileMapping 函数相同。

返回值

如果函数成功,则返回值是文件映射对象的句柄。

如果对象在函数调用之前存在,则函数返回具有当前大小的现有对象的句柄 (,而不是指定大小) , GetLastError 函数返回 ERROR_ALREADY_EXISTS

如果函数失败,则返回值为 NULL。 若要获得更多的错误信息,请调用 GetLastError 函数。

注解

创建文件映射对象后,文件大小不得超过文件映射对象的大小;如果存在,并非所有文件内容都可用于共享。

文件映射对象可以按重复、继承或按名称共享。 由页面文件支持的文件映射对象中页面的初始内容为 0 (零) 。

如果应用程序为文件映射对象指定的大小大于磁盘上实际命名文件的大小,并且页面保护允许写入访问 (即 flProtect 参数指定 PAGE_READWRITEPAGE_EXECUTE_READWRITE) ,则磁盘上的文件将增加以匹配文件映射对象的指定大小。 如果扩展了文件,则文件旧端与新文件端之间的文件内容不保证为零;行为由文件系统定义。

如果无法增加文件,则结果是创建文件映射对象失败, GetLastError 函数将返回 ERROR_DISK_FULL

CreateFileMappingNuma 函数返回的句柄对新的文件映射对象具有完全访问权限,并且可以与需要文件映射对象的句柄的任何函数一起使用。 可以通过进程创建、处理重复或按名称共享文件映射对象。 有关详细信息,请参阅 DuplicateHandleOpenFileMapping 函数。

创建文件映射对象会创建映射文件视图的可能性,但不映射视图。 MapViewOfFileExNuma 函数将文件视图映射到进程地址空间。

有一个重要例外,派生自单个文件映射对象的文件视图在特定时间是一致的或相同的。 如果多个进程具有同一个文件映射对象的句柄,则它们会在映射文件的视图时看到一致的数据视图。

异常与远程文件相关。 尽管 CreateFileMappingNuma 函数适用于远程文件,但它不能使它们保持一致。 例如,如果两台计算机将一个文件映射为可写文件,并且都更改了同一页,则每台计算机只看到自己对页面的写入。 在磁盘上更新数据时,页面不会合并。

映射文件和使用输入和输出访问的文件 (I/O) 函数 (ReadFileWriteFile) 不一定一致。

若要完全关闭文件映射对象,应用程序必须通过调用 UnmapViewOfFile 函数取消映射文件映射对象的所有映射视图,然后通过调用 CloseHandle 函数关闭文件映射对象句柄。

可以按任何顺序调用这些函数。 必须调用 UnmapViewOfFile 函数,因为文件映射对象的映射视图保持对象的内部打开句柄,并且文件映射对象在关闭所有打开的句柄之前不会关闭。

通过映射视图修改文件时,上次修改时间戳可能不会自动更新。 如果需要,调用方应使用 SetFileTime 设置时间戳。

从会话 0 以外的会话创建文件映射对象需要 SeCreateGlobalPrivilege 特权。 请注意,此权限检查仅限于创建文件映射对象,不适用于打开现有对象。 例如,如果服务或系统创建文件映射对象,则任何会话中运行的任何进程都可以访问该文件映射对象,前提是调用方具有所需的访问权限。

使用结构化异常处理来保护写入内存映射视图或从内存映射视图读取的任何代码。 有关详细信息,请参阅 从文件视图读取和写入

若要具有具有可执行权限的映射,应用程序必须使用 PAGE_EXECUTE_READWRITEPAGE_EXECUTE_READ 调用 CreateFileMappingNuma 函数,然后使用 或 FILE_MAP_EXECUTE | FILE_MAP_READ调用 MapViewOfFileExNuma 函数FILE_MAP_EXECUTE | FILE_MAP_WRITE

在 Windows Server 2012 中,以下技术支持此功能。

技术 支持
服务器消息块 (SMB) 3.0 协议
SMB 3.0 透明故障转移 (TFO)
具有横向扩展文件共享的 SMB 3.0 (SO)
群集共享卷文件系统 (CSV)
弹性文件系统 (ReFS)

要求

   
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 winbase.h (包括 Windows.h、Memoryapi.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

CloseHandle

CreateFileMapping

DuplicateHandle

文件映射函数

MapViewOfFileExNuma

NUMA 支持

OpenFileMapping

ReadFile

SECURITY_ATTRIBUTES

UnmapViewOfFile

VirtualAllocExNuma

WriteFile