mapViewOfFileExNuma 函式 (winbase.h)
將檔案對應的檢視對應至呼叫進程的位址空間,並指定物理記憶體的 NUMA 節點。
語法
LPVOID MapViewOfFileExNuma(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap,
[in, optional] LPVOID lpBaseAddress,
[in] DWORD nndPreferred
);
參數
[in] hFileMappingObject
檔案對應物件的句柄。 CreateFileMappingNuma 和 OpenFileMapping 函式會傳回此句柄。
[in] dwDesiredAccess
檔案對應物件的存取類型,可決定頁面的頁面保護。 此參數可以是下列其中一個值,或適當時為多個值的位元組 OR 組合。
使用位 OR,您可以將上述值與這些值結合。
值 | 意義 |
---|---|
|
檔案的複製寫入檢視已對應。 檔案對應對象必須使用PAGE_READONLY、PAGE_READ_EXECUTE、PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY、PAGE_READWRITE或PAGE_EXECUTE_READWRITE保護來建立。
當行程寫入寫入時,系統會將原始頁面複製到私用至進程的新頁面。 新頁面是由分頁檔案所支援。 新頁面的保護會從寫入複製變更為讀取/寫入。 指定寫入時複製存取權時,系統與進程認可費用會用於整個檢視,因為呼叫進程可能會寫入檢視中的每個頁面,讓所有頁面都成為私用。 新頁面的內容永遠不會寫回源檔,並在取消對應檢視時遺失。 |
|
檔案的可執行文件檢視會對應 (對應的記憶體可以當做程式代碼執行) 。 檔案對應對象必須使用 PAGE_EXECUTE_READ、 PAGE_EXECUTE_WRITECOPY或 PAGE_EXECUTE_READWRITE 保護來建立。 |
|
從 1703 版 Windows 10 開始,此旗標會指定應該使用大型頁面支援來對應檢視。 檢視的大小必須是 GetLargePageMinimum 函式所報告大型頁面大小的倍數,而且必須使用 SEC_LARGE_PAGES 選項建立檔案對應物件。 如果您為 lpBaseAddress 提供非 Null 值,則此值必須是 GetLargePageMinimum 的倍數。 |
|
將對應檔案中的所有位置設定為控制流程防護 (CFG) 無效的目標。 此旗標類似於 PAGE_TARGETS_INVALID。 將此旗標與執行 存取權FILE_MAP_EXECUTE搭配使用。 對這些頁面中位置的任何間接呼叫都會失敗 CFG 檢查,且程式將會終止。 配置之可執行文件頁面的預設行為是標示 CFG 的有效呼叫目標。 |
對於使用 SEC_IMAGE 屬性建立的檔案對應物件, dwDesiredAccess 參數沒有任何作用,而且應該設定為任何有效的值,例如 FILE_MAP_READ。
如需檔案對應物件存取權的詳細資訊,請參閱 檔案對應安全性和訪問許可權。
[in] dwFileOffsetHigh
要開始檢視之檔案位移的高序 DWORD 。
[in] dwFileOffsetLow
要開始檢視之檔案位移的低序 DWORD 。 高位移和低位移的組合必須指定檔案對應內的位移。 它們也必須符合系統的記憶體配置粒度。 也就是說,位移必須是配置粒度的倍數。 若要取得系統的記憶體配置粒度,請使用 GetSystemInfo 函式,以填入 SYSTEM_INFO 結構的成員。
[in] dwNumberOfBytesToMap
對應至檢視的檔案對應位元組數目。 所有位元組必須位於 CreateFileMapping 所指定的大小上限內。 如果此參數為 0 (零) ,則對應會從指定的位移延伸至檔案對應的結尾。
[in, optional] lpBaseAddress
呼叫行程位址空間中記憶體位址的指標,其對應開始位置。 這必須是系統記憶體配置粒度的倍數,否則函式會失敗。 若要判斷系統的記憶體配置粒度,請使用 GetSystemInfo 函式。 如果指定位址的位址空間不足,函式會失敗。
如果 lpBaseAddress 參數為 NULL,操作系統會選擇對應位址。
雖然可以指定現在安全位址, (操作系統) 未使用,但無法保證該位址會隨著時間保持安全。 因此,最好讓操作系統選擇位址。 在此情況下,您不會將指標儲存在記憶體對應檔案中;您會儲存檔案對應基底的位移,以便在任何位址使用對應。
[in] nndPreferred
實體記憶體應該所在的 NUMA 節點。
值 | 意義 |
---|---|
|
不偏好 NUMA 節點。 這與呼叫 MapViewOfFileEx 函 式相同。 |
傳回值
如果函式成功,則傳回值是對應檢視的起始位址。
如果函式失敗,傳回值為 NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError 函 式。
備註
對應檔案會使指定的檔案部分顯示在呼叫進程的位址空間中。
對於大於位址空間的檔案,您一次只能對應一小部分的檔案數據。 當第一個檢視完成時,您會取消對應並對應新的檢視。
若要取得檢視的大小,請使用 VirtualQueryEx 函 式。
頁面對應對象中頁面的初始內容是由頁面檔案支援的 0 (零) 。
如果提供建議的對應位址,則檔案會對應到指定的位址, (捨入到最接近的 64 KB 界限,) 如果指定位址有足夠的地址空間。 如果位址空間不足,函式會失敗。
一般而言,建議的位址是用來指定檔案應該在多個進程中的相同地址對應。 這需要位址空間的區域可供所有相關進程使用。 無法在用於對應的區域中進行其他記憶體配置,包括使用 VirtualAllocExNuma 函式來保留記憶體。
如果 lpBaseAddress 參數指定基底位移,如果呼叫進程尚未使用指定的記憶體區域,函式就會成功。 系統不會確保其他32位進程中的記憶體對應檔案可以使用相同的記憶體區域。
如果檔案在指定時間包含相同的數據,檔案 (或檔案對應物件及其對應的檔案) 多個檢視都是 一致的 。 如果檔案檢視衍生自相同的檔案對應物件,就會發生這種情況。 進程可以使用 DuplicateHandle 函式將檔案對應物件句柄複製到另一個進程,或者另一個進程可以使用 OpenFileMapping 函式,依名稱開啟檔案對應物件。
有一個重要的例外狀況,衍生自相同檔案所支援之任何檔案對應對象的檔案檢視在特定時間是一致或相同的。 對於進程內的檢視,以及由不同進程對應的檢視,保證一致性。
例外狀況與遠端檔案有關。 雖然 MapViewOfFileExNuma 適用於遠端檔案,但不會讓它們保持一致。 例如,如果兩部計算機都將檔案對應為可寫入,而且兩者都變更相同的頁面,每部計算機只會看到自己的寫入頁面。 當數據在磁碟上更新時,它不會合併。
檔案的對應檢視不保證與 ReadFile 或 WriteFile 函式所存取的檔案一致。
若要防範 EXCEPTION_IN_PAGE_ERROR 例外狀況,請使用結構化例外狀況處理來保護寫入或讀取頁面檔案以外檔案記憶體對應檢視的任何程序代碼。 如需詳細資訊,請參閱 從檔案檢視讀取和寫入。
透過對應檢視修改檔案時,可能不會自動更新上次修改時間戳。 如有必要,呼叫端應該使用 SetFileTime 來設定時間戳。
若要擁有具有可執行檔許可權的檔案,應用程式必須使用 PAGE_EXECUTE_READWRITE 或 PAGE_EXECUTE_READ 呼叫 CreateFileMappingNuma 函式,然後使用 FILE_MAP_EXECUTE | FILE_MAP_WRITE 或 FILE_MAP_EXECUTE FILE_MAP_READ | 呼叫 MapViewOfFileExNuma 函式。
在 Windows Server 2012 中,下列技術支援此函式。
技術 | 支援 |
---|---|
伺服器消息塊 (SMB) 3.0 通訊協定 | Yes |
SMB 3.0 透明故障轉移 (TFO) | Yes |
具有向外延展檔案共用的SMB 3.0 (SO) | Yes |
叢集共用磁碟區文件系統 (CsvFS) | Yes |
彈性檔案系統 (ReFS) | Yes |
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows Vista [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2008 [僅限傳統型應用程式] |
目標平台 | Windows |
標頭 | winbase.h (包含 Windows.h) |
程式庫 | Kernel32.lib |
DLL | Kernel32.dll |