内存映射

以下部分代码出自:windows核心编程

主要应用:
主界面只有一个,并可以注入多个窗口,主界面管理和配置各个被注入后进程的所有信息。
当dll注入后,不想用dll的共享段作为进程间的通信。主要是为了避免交叉,即一个dll对应一个进程来使用。为了是卸载方便,不影响其他被注入的进程。

其实并非hook,使用远程注入,所以还要在目标进程的消息循环上做手脚,即修改汇编代码。
JMP到dll里面做处理后,jmp回到进程里去。

创建:
HANDLE s_hFileMap;
PVOID pView1;

    s_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, 
		PAGE_READWRITE, 0, 4 * 1024, TEXT("MMFSharedData"));
    if (s_hFileMap != NULL) {

		if (GetLastError() == ERROR_ALREADY_EXISTS) {
			chMB("Mapping already exists - not created.");
			CloseHandle(s_hFileMap);

		} else {
			pView1 = MapViewOfFile(s_hFileMap,
				FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);

			if (pView1 == NULL) {

				chMB("Can't map view of file.");
			}
		}

    } else {
		chMB("Can't create file mapping.");
    }

//释放:
	CloseHandle(s_hFileMap);
	UnmapViewOfFile(pView1);


另一个进程使用:
HANDLE hFileMapT;
PVOID pView2;

BOOL OnInit(){
	hFileMapT = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,
    FALSE, TEXT("MMFSharedData"));

    if (hFileMapT != NULL) {
		pView2 = MapViewOfFile(hFileMapT, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);

		if (pView2 == NULL) {
			MessageBox(0,L"Can't map view.",0,0);
		}
	} else {
		MessageBox(0,L"Can't open mapping.",0,0);
	}
	return TRUE;
}
void OnClose(){
	CloseHandle(hFileMapT);
	UnmapViewOfFile(pView2);
}

你可能感兴趣的:(编程,C++,c,windows,配置管理)