MapViewOfFile 函式 (memoryapi.h)
將檔案對應的檢視對應對應至呼叫進程的位址空間。
若要指定檢視的建議基底位址,請使用 MapViewOfFileEx 函式。 不過,不建議這麼做。
語法
LPVOID MapViewOfFile(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap
);
參數
[in] hFileMappingObject
檔案對應物件的控制碼。 CreateFileMapping和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 保護來建立。
Windows Server 2003 和 Windows XP: 此值從 WINDOWS XP SP2 和 Windows Server 2003 SP1 開始可用。 |
|
從 Windows 10 1703 版開始,此旗標會指定檢視應該使用大型頁面支援進行對應。 檢視的大小必須是 GetLargePageMinimum 函式所報告之大型頁面大小的倍數,而且必須使用 [SEC_LARGE_PAGES] 選項建立檔案對應物件。 如果您為 lpBaseAddress提供非 Null 值,則此值必須是 GetLargePageMinimum的倍數。 注意:在Windows 10版本 1703 之前的作業系統版本上,FILE_MAP_LARGE_PAGES旗標沒有任何作用。 在這些版本中,如果區段是以 SEC_LARGE_PAGES 旗標集建立,則檢視會自動使用大型頁面進行對應。 |
|
將對應檔案中的所有位置設定為控制流程防護 (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 (零) ,則對應會從指定的位移延伸至檔案對應的結尾。
傳回值
如果函式成功,傳回值就是對應檢視的起始位址。
如果函式失敗,則傳回值為 Null。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
備註
對應檔案可讓呼叫進程的位址空間中可見檔案的指定部分。
對於大於位址空間的檔案,您一次只能對應一小部分的檔案資料。 第一個檢視完成時,您可以取消對應並對應新的檢視。
若要取得檢視的大小,請使用 VirtualQuery 函式。
檔案 (或檔案對應物件及其對應檔案的多個檢視,如果檔案在指定時間包含相同的資料,則其對應檔案) 是一致的 。 如果檔案檢視衍生自相同檔案所支援的任何檔案對應物件,就會發生這種情況。 進程可以使用 DuplicateHandle 函式將檔案對應物件控制碼複製到另一個進程,或者另一個進程可以使用 OpenFileMapping 函式 依名稱開啟檔案對應物件。
有一個重要例外狀況,衍生自相同檔案所支援之任何檔案對應物件的檔案檢視在特定時間是一致或相同的。 對於進程內的檢視,以及由不同進程對應的檢視,保證一致性。
例外狀況與遠端檔案相關。 雖然 MapViewOfFile 可與遠端檔案搭配使用,但不會讓它們保持一致。 例如,如果兩部電腦將檔案對應為可寫入,而且兩部電腦都會變更相同的頁面,則每部電腦只會看到自己的頁面寫入。 當資料在磁片上更新時,它不會合並。
檔案的對應檢視不保證與 ReadFile 或 WriteFile 函式所存取的檔案一致。
請勿將指標儲存在記憶體對應檔案中;儲存檔案對應基底的位移,以便在任何位址使用對應。
若要防範 EXCEPTION_IN_PAGE_ERROR 例外狀況,請使用結構化例外狀況處理來保護寫入或讀取頁面檔案以外的檔案記憶體對應檢視的任何程式碼。 如需詳細資訊,請參閱 從檔案檢視讀取和寫入。
透過對應檢視修改檔案時,可能不會自動更新上次修改時間戳記。 如有需要,呼叫端應該使用 SetFileTime 來設定時間戳記。
如果檔案對應物件是由 CreateFileMapping (CreateFileMapping 所支援,且 hFile 參數設定為 INVALID_HANDLE_VALUE) ,則分頁檔案必須夠大,才能保存整個對應。 如果不是, MapViewOfFile 就會失敗。 分頁檔案所支援之檔案對應物件中頁面的初始內容為 0 (零) 。
建立由分頁檔案支援的檔案對應物件時,呼叫者可以指定MapViewOfFile是否應該同時保留和認可頁面, (SEC_COMMIT) ,或只保留頁面 (SEC_RESERVE) 。 對應檔案可讓整個對應的虛擬位址範圍無法用於程式中的其他配置。 認可保留範圍中的頁面之後,無法透過呼叫 VirtualFree來釋出或取消認可。 當檢視未對應且檔案對應物件關閉時,會釋放保留和認可的頁面。 如需詳細資訊,請參閱 UnmapViewOfFile 和 CloseHandle 函式 。
若要擁有具有可執行檔許可權的檔案,應用程式必須使用PAGE_EXECUTE_READWRITE或PAGE_EXECUTE_READ呼叫CreateFileMapping,然後使用 FILE_MAP_EXECUTEFILE_MAP_WRITE 或FILE_MAP_EXECUTE | FILE_MAP_READ 呼叫MapViewOfFile。 |
在 Windows Server 2012 中,下列技術支援此函式。
技術 | 支援 |
---|---|
伺服器訊息區 (SMB) 3.0 通訊協定 | 是 |
SMB 3.0 透明容錯移轉 (TFO) | 是 |
具有向外延展檔案共用的 SMB 3.0 (SO) | 是 |
叢集共用磁片區檔案系統 (CsvFS) | 是 |
彈性檔案系統 (ReFS) | 是 |
當 CSVF 暫停時,此呼叫可能會失敗,並出現錯誤,指出發生鎖定衝突。
範例
如需範例,請參閱 建立具名共用記憶體。
需求
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
目標平台 | Windows |
標頭 | memoryapi.h (包括 Windows.h、Memoryapi.h) |
程式庫 | onecore.lib |
DLL | Kernel32.dll |