我正在尋找一種可能性,在Windows平臺上創建共享內存塊,對除創建共享內存塊的進程之外的所有進程進行寫保護。窗口 - 受保護的共享內存
詳細我需要:
方法(1)具有創建共享存儲器塊和應能夠修改緩衝區。 進程(2)應該能夠打開並讀取創建的共享內存塊,但不能修改內容。由於安全/安全原因,這很重要。
目前我有一個解決方案創建使用的CreateFileMapping(共享存儲器塊)連同MapViewOfFile(),然後已經讀取和寫入過程的許可(1)和(2),如:
HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, highSize, lowSize, L"uniquename");
void* sharedMemory = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// now we can modify sharedMemory...
這兩個可以在兩個進程中應用代碼行,因爲第一個進程創建共享內存塊,第二個進程只是打開共享內存。 但是,由於在創建內存塊期間提供的訪問值(PAGE_READWRITE和FILE_MAP_ALL_ACCESS),顯然第二個進程將具有寫權限。
我需要通過使用訪問值PAGE_READONLY和FILE_MAP_READ來創建進程(1)中的共享內存塊,但顯然比我不允許在進程(1)中初始化/設置/修改內存塊比一個無用的內存緩衝區。
據我所知,安全屬性的定義不能解決問題,因爲我的問題不依賴於用戶或組。 (1)依靠在創建共享內存塊之前已知的內存內容(並且在進程(1)中將不會修改該共享內存塊),我甚至會對創建共享內存塊的靈感感到滿意。之後)。
非常感謝您的任何提示或意見。
以上基於SetSecurityInfo()的解決方案並未完全解決問題 - 此調用和部分/映射創建之間存在爭用條件 – Bukes
@Bukes:SetSecurityInfo()解決方案無法解決問題* at所有*,作爲進程#2可以使用'WriteProcessMemory(PROCESS1_HANDLE,...)'來訪問共享部分。這些方法只能防止事故。對於強制性安全性,必須使用操作系統支持的主體(用戶和組成員資格)。 –
@Ben我也想過使用磁盤文件的可能性,但我想找到一個避免訪問磁盤的解決方案... – user3208346