跨进程
跨进程分配内存
概览
-
malloc 在本进程分配内存(堆栈)
-
VirtualAlloc 可在当前进程分配内存
-
VirtualFree 释放内存
-
VirtualAllocEx 可在当前进程或者目标进程分配内存
-
VirtualFreeEx 释放内存
VirtualAlloc
|
|
VirtualFree
|
|
VirtualAllocEx
|
|
flAllocationType 可取下列值:
- MEM_COMMIT:为特定的页面区域分配内存中或磁盘的页面文件中的物理存储
- MEM_PHYSICAL :分配物理内存(仅用于地址窗口扩展内存)
- MEM_RESERVE:保留进程的虚拟地址空间,而不分配任何物理存储。保留页面可通过继续调用VirtualAlloc()而被占用
- MEM_RESET :指明在内存中由参数lpAddress和dwSize指定的数据无效
- MEM_TOP_DOWN:在尽可能高的地址上分配内存(Windows 98忽略此标志)
- MEM_WRITE_WATCH:必须与MEM_RESERVE一起指定,使系统跟踪那些被写入分配区域的页面(仅针对Windows 98)
flProtect 可取下列值
-
PAGE_READONLY: 该区域为只读。如果应用程序试图访问区域中的页的时候,将会被拒绝访
-
PAGE_READWRITE 区域可被应用程序读写
-
PAGE_EXECUTE: 区域包含可被系统执行的代码。试图读写该区域的操作将被拒绝。
-
PAGE_EXECUTE_READ :区域包含可执行代码,应用程序可以读该区域。
-
PAGE_EXECUTE_READWRITE: 区域包含可执行代码,应用程序可以读写该区域。
-
PAGE_GUARD: 区域第一次被访问时进入一个STATUS_GUARD_PAGE异常,这个标志要和其他保护标志合并使用,表明区域被第一次访问的权限
-
PAGE_NOACCESS: 任何访问该区域的操作将被拒绝
-
PAGE_NOCACHE: RAM中的页映射到该区域时将不会被微处理器缓存(cached)
注:PAGE_GUARD和PAGE_NOCHACHE标志可以和其他标志合并使用以进一步指定页的特征。PAGE_GUARD标志指定了一个防护页(guard page),即当一个页被提交时会因第一次被访问而产生一个one-shot异常,接着取得指定的访问权限。PAGE_NOCACHE防止当它映射到虚拟页的时候被微处理器缓存。这个标志方便设备驱动使用直接内存访问方式(DMA)来共享内存块。
VirtualFreeEx
|
|
lpAddress
如果 dwFreeType 为 MEM_RELEASE, 则该参数必须为VirtualAllocEx的返回值.
dwSize
虚拟内存空间的字节数
如果 dwFreeType 为 MEM_RELEASE,则 dwSize 必须为0 . 按 VirtualAllocEx申请时的大小全部释放。
如果dwFreeType 为 MEM_DECOMMIT, 则释放从lpAddress 开始的一个或多个字节 ,即 lpAddress +dwSize。
dwFreeType
释放类型,取值见下表:
值 | 释义 |
---|---|
MEM_DECOMMIT 0x400016384D | 这种试 仅标示 内存空间不可用,内存页还将存在。 |
MEM_RELEASE 0x800032768D | 这种方式 很彻底,完全回收。 |
跨进程读写
[WriteProcessMemory](句柄 进程 模块 读写.md)
[ReadProcessMemory](句柄 进程 模块 读写.md)
跨进程调用代码
- CreateRemoteThread 创建远线程 跨进程调用代码
- 我的实例代码
|
|
线程的创建标志.
值 | 含义 |
---|---|
0 | 线程创建后立即运行 |
CREATE_SUSPENDED 0x00000004 |
线程创建后先将线程挂起,直到 ResumeThread 被调用. |
STACK_SIZE_PARAM_IS_A_RE SERVATION 0x00010000 |
dwStackSize 参数指定为线程栈预订大小,如果STACK_SIZE_PARAM_IS_A_RESERVATION没有被指定,dwStackSize 参数指定为线程栈分配大小. |
|
|