共用方式為


CreateFileMappingNumaW 函式 (memoryapi.h)

為指定的檔案建立或開啟具名或未命名的檔案對應物件,並指定物理記憶體的 NUMA 節點。

語法

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

參數

[in] hFile

要從中建立檔案對應物件的檔案句柄。

檔案必須以與 flProtect 參數所指定之保護旗標相容的訪問許可權開啟。 這不是必要專案,但建議您針對獨佔存取開啟您要對應的檔案。 如需詳細資訊,請參閱 檔案安全性和存取權限

如果 hFileINVALID_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:在具有 SP1 的 Windows Vista 之前無法使用此值。

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 許可權。 如需詳細資訊,請參閱 Kernel Object Namespaces

使用終端機服務會話實作快速使用者切換。 第一個登入的使用者會使用會話 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 函式可與遠端檔案搭配運作,但不會讓檔案保持一致。 例如,如果兩部計算機將檔案對應為可寫入,而且兩者都變更相同的頁面,則每部計算機只會看到自己寫入頁面。 當數據在磁碟上更新時,不會合併頁面。

使用輸入和輸出函式存取的對應檔案和檔案(ReadFileWriteFile),不一定一致。

若要完全關閉檔案對應物件,應用程式必須呼叫 unmapViewOfFile 函式 來取消對應檔案對應物件的所有對應檢視,然後藉由呼叫 closeHandle 函式 來關閉檔案對應物件句柄。

您可以依任何順序呼叫這些函式。 需要呼叫 UnmapViewOfFile 函式,因為檔案對應對象的對應檢視會維護對象的內部開啟句柄,而且檔案對應物件在關閉所有開啟句柄之前都不會關閉。

透過對應檢視修改檔案時,可能不會自動更新上次修改時間戳。 如有需要,呼叫端應該使用 SetFileTime 來設定時間戳。

從會話零以外的會話建立檔案對應物件需要 SeCreateGlobalPrivilege 許可權。 請注意,此許可權檢查僅限於建立檔案對應物件,不適用於開啟現有的物件。 例如,如果服務或系統建立檔案對應物件,則任何會話中執行的任何進程都可以存取該檔案對應物件,前提是呼叫者具有必要的訪問許可權。

使用結構化例外狀況處理來保護寫入或讀取記憶體對應檢視的任何程序代碼。 如需詳細資訊,請參閱 從檔案檢視讀取和寫入

若要具有可執行許可權的對應,應用程式必須使用 PAGE_EXECUTE_READWRITEPAGE_EXECUTE_READ 呼叫 CreateFileMappingNuma 函式,然後使用 FILE_MAP_EXECUTE | FILE_MAP_WRITEFILE_MAP_EXECUTE | FILE_MAP_READ呼叫 MapViewOfFileExNuma 函式。

在 Windows Server 2012 中,下列技術支援此功能。

科技 支援
伺服器消息塊 (SMB) 3.0 通訊協定 是的
SMB 3.0 透明故障轉移 (TFO) 是的
具有向外延展檔案共用的SMB 3.0(SO) 是的
叢集共用磁碟區檔案系統 (CsvFS) 是的
復原檔案系統 (ReFS) 是的

要求

要求 價值
最低支援的用戶端 Windows Vista [僅限傳統型應用程式]
支援的最低伺服器 Windows Server 2008 [僅限傳統型應用程式]
目標平臺 窗戶
標頭 memoryapi.h (包括 Windows.h、Memoryapi.h)
連結庫 onecore.lib
DLL Kernel32.dll

另請參閱

CloseHandle

CreateFileMapping

DuplicateHandle

檔案對應函式

MapViewOfFileExNuma

NUMA 支援

OpenFileMapping

ReadFile

SECURITY_ATTRIBUTES

UnmapViewOfFile

VirtualAllocExNuma

WriteFile