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 參數指定的保護旗標相容的存取權限開啟。 這並非必要專案,但建議您開啟您想要對應以取得獨佔存取權的檔案。 如需詳細資訊,請參閱 檔案安全性和存取權限

如果hFile是INVALID_HANDLE_VALUE,呼叫進程也必須指定dwMaximumSizeHigh 和 dwMaximumSizeLow參數中檔案對應物件的大小。 在此案例中, CreateFileMappingNuma 會建立指定大小的檔案對應物件,該物件是由系統分頁檔案所支援,而不是由檔案系統中的檔案所支援。

[in, optional] lpFileMappingAttributes

SECURITY_ATTRIBUTES結構的指標,決定子進程是否可以繼承傳回的控制碼。 的 lpSecurityDescriptor 成員
SECURITY_ATTRIBUTES 結構會指定新檔案對應物件的安全性描述元。

如果 lpFileMappingAttributesNull,則無法繼承控制碼,而且檔案對應物件會取得預設的安全性描述元。 存取控制會在檔案對應物件的預設安全性描述元中列出 (ACL) 來自建立者的主要或模擬權杖。 如需詳細資訊,請參閱 檔案對應安全性和存取權限

[in] flProtect

指定檔案對應物件的頁面保護。 物件的所有對應檢視都必須與這個保護相容。

此參數可以是下列其中一個值。

意義
PAGE_EXECUTE_READ
0x20
允許檢視對應至唯讀、寫入複製或執行存取。

hFile參數指定的檔案控制碼必須使用GENERIC_READGENERIC_EXECUTE存取權限來建立。

PAGE_EXECUTE_READWRITE
0x40
允許檢視對應以進行唯讀、寫入複製、讀取/寫入或執行存取。

hFile參數指定的檔案控制碼必須使用GENERIC_READGENERIC_WRITEGENERIC_EXECUTE存取權限來建立。

PAGE_EXECUTE_WRITECOPY
0x80
允許檢視對應至唯讀、寫入複製或執行存取。 這個值相當於 PAGE_EXECUTE_READ

hFile參數指定的檔案控制碼必須使用GENERIC_READGENERIC_EXECUTE存取權限來建立。

Windows Vista: 在 Windows Vista 搭配 SP1 之前,無法使用此值。

PAGE_READONLY
0x02
允許檢視對應以進行唯讀或寫入複製存取。 嘗試寫入特定區域會導致存取違規。

hFile參數指定的檔案控制碼必須使用GENERIC_READ存取權限來建立。

PAGE_READWRITE
0x04
可讓檢視對應以進行唯讀、寫入複製或讀取/寫入存取。

hFile參數指定的檔案控制碼必須使用GENERIC_READGENERIC_WRITE存取權限來建立。

PAGE_WRITECOPY
0x08
允許檢視對應以進行唯讀或寫入複製存取。 這個值相當於 PAGE_READONLY

hFile參數指定的檔案控制碼必須使用GENERIC_READ存取權限來建立。

 

應用程式可以將檔案對應物件的下列一或多個屬性結合在一起,並結合上述其中一個頁面保護值。

意義
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 參數符合現有事件、號志、mutex、可等候計時器或工作物件的名稱,則函式會失敗,而且 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 來設定時間戳記。

從會話零以外的會話建立檔案對應物件需要 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 通訊協定 Yes
SMB 3.0 透明容錯移轉 (TFO)
具有向外延展檔案共用的 SMB 3.0 (SO) Yes
叢集共用磁片區檔案系統 (CsvFS)
彈性檔案系統 (ReFS)

規格需求

   
最低支援的用戶端 Windows Vista [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2008 [僅限傳統型應用程式]
目標平台 Windows
標頭 winbase.h (包括 Windows.h、Memoryapi.h)
程式庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

CloseHandle

CreateFileMapping

DuplicateHandle

檔案對應函式

MapViewOfFileExNuma

NUMA 支援

OpenFileMapping

ReadFile

SECURITY_ATTRIBUTES

UnmapViewOfFile

VirtualAllocExNuma

WriteFile