MapViewOfFileEx 函式 (memoryapi.h)
將檔案對應的檢視對應至呼叫進程的位址空間。 呼叫端可以選擇性地指定檢視的建議基底記憶體位址。
若要指定實體記憶體的 NUMA 節點,請參閱 MapViewOfFileExNuma。
語法
LPVOID MapViewOfFileEx(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap,
[in, optional] LPVOID lpBaseAddress
);
參數
[in] hFileMappingObject
檔案對應物件的句柄。 CreateFileMapping 和 OpenFileMapping 函式會傳回此句柄。
[in] dwDesiredAccess
檔案對應物件的存取類型,決定頁面的頁面保護。 此參數可以是下列其中一個值,或適當時為多個值的位 OR 組合。
使用位 OR,您可以將上述值與這些值結合。
價值 | 意義 |
---|---|
|
檔案的複製寫入檢視已對應。 檔案對應對象必須使用 PAGE_READONLY、PAGE_EXECUTE_READ、PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY、PAGE_READWRITE或 PAGE_EXECUTE_READWRITE 保護來建立。
當行程寫入寫入至寫入複本頁面時,系統會將原始頁面複製到程式私用的新頁面。 新頁面是由分頁檔案所支援。 新頁面的保護會從複製寫入變更為讀取/寫入。 指定寫入時複製存取權時,系統與進程認可會針對整個檢視負責,因為呼叫程式可能會寫入檢視中的每個頁面,使所有頁面都成為私人。 新頁面的內容永遠不會寫回源檔,而且會在取消對應檢視時遺失。 |
|
從 Windows 10 版本 1703 開始,此旗標會指定應該使用 大型頁面支援對應檢視。 檢視的大小必須是 GetLargePageMinimum 函式所報告之大型頁面大小的倍數,而且必須使用 SEC_LARGE_PAGES 選項建立檔案對應物件。 如果您為 lpBaseAddress提供非 Null 值,則此值必須是 getLargePageMinimum 的倍數。 |
|
檔案的可執行文件檢視已對應(對應的記憶體可以以程式代碼的形式執行)。 檔案對應對象必須使用 PAGE_EXECUTE_READ、PAGE_EXECUTE_WRITECOPY或 PAGE_EXECUTE_READWRITE 保護來建立。
Windows Server 2003 和 Windows XP:此值可從 Windows XP 搭配 SP2 和 Windows Server 2003 SP1 開始使用。 |
|
將對應檔案中的所有位置設定為控制流程防護 (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 函式。 如果指定位址的位址空間不足,函式會失敗。
如果 lpBaseAddressNULL,則操作系統會選擇對應位址。 在此案例中,函式相當於 mapViewOfFile 函式
雖然可以指定目前安全的位址(操作系統未使用),但無法保證該位址在一段時間內會保持安全。 因此,最好讓操作系統選擇位址。 在此情況下,您不會將指標儲存在記憶體對應檔案中,您會儲存檔案對應基底的位移,以便在任何位址使用對應。
傳回值
如果函式成功,傳回值就是對應檢視的起始位址。
如果函式失敗,則傳回值 NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
言論
對應檔案會使檔案的指定部分顯示在呼叫進程的位址空間中。
對於大於位址空間的檔案,您一次只能對應一小部分的檔案數據。 當第一個檢視完成時,您會取消對應並對應新的檢視。
若要取得檢視的大小,請使用 VirtualQueryEx 函式。
頁面檔所支援之檔案對應對象中頁面的初始內容為0(零)。
一般而言,建議的位址是用來指定檔案應該在多個進程中的相同地址對應。 這需要位址空間的區域才能在所有相關程式中使用。 沒有其他記憶體配置可以在用於對應的區域中進行,包括使用 VirtualAlloc 或 VirtualAllocEx 函式來保留記憶體。
如果 lpBaseAddress 參數指定基底位移,則呼叫進程尚未使用指定的記憶體區域時,函式會成功。 系統不會確保其他32位進程中的記憶體對應檔案可以使用相同的記憶體區域。
如果檔案在指定時間包含相同的數據,則檔案的多個檢視 一致。 如果檔案檢視衍生自相同的檔案對應物件,就會發生這種情況。 進程可以使用 DuplicateHandle 函式,將檔案對應物件句柄複製到另一個進程,或者另一個進程可以使用 OpenFileMapping 函式,依名稱開啟檔案對應物件。
有一個重要的例外狀況,衍生自相同檔案所支援之任何檔案對應對象的檔案檢視在特定時間是一致或完全相同的。 針對進程內的檢視,以及由不同進程對應的檢視,保證一致性。
例外狀況與遠端檔案相關。 雖然 MapViewOfFileEx 與遠端檔案搭配運作,但不會讓檔案保持一致。 例如,如果兩部計算機將檔案對應為可寫入,而且兩者都變更了相同的頁面,則每部計算機只會看到自己的寫入頁面。 當數據在磁碟上更新時,它不會合併。
檔案的對應檢視不保證與 ReadFile 或 WriteFile 函式所存取的檔案一致。
若要防範 EXCEPTION_IN_PAGE_ERROR 例外狀況,請使用結構化例外狀況處理來保護任何寫入或讀取頁面檔案以外的檔案記憶體對應檢視的程序代碼。 如需詳細資訊,請參閱 從檔案檢視讀取和寫入。
透過對應檢視修改檔案時,可能不會自動更新上次修改時間戳。 如有需要,呼叫端應該使用 SetFileTime 來設定時間戳。
若要具有可執行許可權的檔案,應用程式必須使用
在 Windows Server 2012 中,下列技術支援此功能。
科技 | 支援 |
---|---|
伺服器消息塊 (SMB) 3.0 通訊協定 | 是的 |
SMB 3.0 透明故障轉移 (TFO) | 是的 |
具有向外延展檔案共用的SMB 3.0(SO) | 是的 |
叢集共用磁碟區檔案系統 (CsvFS) | 是的 |
復原檔案系統 (ReFS) | 是的 |
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
支援的最低伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | memoryapi.h (包括 Windows.h、Memoryapi.h) |
連結庫 | onecore.lib |
DLL | Kernel32.dll |