能力值:
( LV2,RANK:10 )
2 楼
补充说明:如果不指定地址是可以申请100M空间的,我的问题是要指定一个地址并申请100M空间.
能力值:
( LV2,RANK:10 )
3 楼
MSDN:
Reserves or commits a region of memory within the virtual address space of a specified process.
函数是在一个进程的虚拟空间中申请空间,系统为每个进程分配4GB虚拟空间(包括2GB系统控制的空间)
所以理论上VirtualAllocEx最多可以申请到4GB空间
但由于程序本身要占用内存所以程序本身占用的空间和申请的空间不能大于4GB
至于内存中的空隙由于系统采用了虚拟内存,所以不用考虑
总结:能分配到的最大内存与目标程序占用内存的大小有关
以上只是本人的理解,而且也只是理论上的,本人还没有实际证实过m如有
错误,大家可以指出来讨论下
能力值:
( LV2,RANK:10 )
4 楼
LPVOID WINAPI VirtualAllocEx(
__in HANDLE hProcess,
__in_opt LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flAllocationType,
__in DWORD flProtect
);
lpAddress指定了分配内存的起始地址。当然必须保证从指定的地址开始有足够的空闲区域。
能力值:
( LV12,RANK:210 )
5 楼
这个你得看内存的分区结构,用户态的虚拟地址空间是2GB(WIN32平台且boot.ini中没有/3G参数的时候),而用户态可用的虚拟地址空间只有不到2GB,因为这里面的还包括NULL空指针区和64KB缓冲禁区,所以说大小是不可能分配超过2GB的, 分配虚拟内存就是分配的虚拟地址空间,如果遇到大于2GB的文件,通过内存映射,一部分一部分的映射到内存的,也不用担心虚拟内存不够用!另外,对于保留和提交这两种虚拟内存操作也是不一样的,保留2GB不会出错,但是提交2GB就会异常了!
能力值:
( LV2,RANK:10 )
6 楼
invoke GetCurrentProcessId
invoke OpenProcess,PROCESS_ALL_ACCESS,TRUE,eax
invoke VirtualAllocEx,eax,10000000h,1024*1024*100,MEM_RESERVE,PAGE_EXECUTE_READWRITE
invoke VirtualAlloc,10000000h,1024*1024*100,MEM_COMMIT,PAGE_EXECUTE_READWRITE
先调用VirtualAllocEx保留空间,再用VirtualAlloc申请内存。
能力值:
( LV2,RANK:10 )
7 楼
VirtualAllocEx和VirtualAlloc都可以完成保留和提交的操作,是保留还是提交是由MEM_RESERVE或MEM_COMMIT这两个参数决定的。
这两个函数的区别在于VirtualAllocEx可以指定在哪个进程的地址空间中分配虚拟内存。
LPVOID WINAPI VirtualAllocEx(
__in HANDLE hProcess,
__in_opt LPVOID lpAddress,
__in SIZE_T dwSize,
__in DWORD flAllocationType,
__in DWORD flProtect
);
hProcess [in]
The handle to a process. The function allocates memory within the virtual address space of this process.
The handle must have the PROCESS_VM_OPERATION access right. For more information, see Process Security and Access Rights.
能力值:
( LV2,RANK:10 )
8 楼
you can use that api for making offset patches