Public Declare Function VirtualQueryEx Lib "kernel32" Alias "VirtualQueryEx" (ByVal hProcess As Long, lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long) As Long
其中lpAddress是要查询的地址值,它用了Any类型,而且是引用传参。这样当然有它的道理,但我需要查某个指定地址(例如0x123456)的信息就显得麻烦了,因为这个参数在C语言里是个void型的指针,这是个32位的值,因此我决定把它改为ByVal lpAddress as Long。
Public Function GetTotalCommittedMemory(ByVal ProcessId As Long) As Long
Dim hProcess As Long
Dim mi As MEMORY_BASIC_INFORMATION
Dim pAddr As Long
Dim dwTotalCommit As Long
Dim ret As Long
Dim miLen As Long
miLen = Len(mi)
dwTotalCommit = 0'这是结果
pAddr = 0'这个时查询起始地址,设为0,即进程虚拟地址开始处。
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, ProcessId)'首先打开进程供查询信息
ret = VirtualQueryEx(hProcess, pAddr, mi, miLen)'从起始地址开始查询
Do While (ret = miLen)
If mi.State = MEM_COMMIT Then'如果State是MEM_COMMIT则表明这块内存被占用,RegionSize是这一块内存的大小,这一块内存的State都一样
dwTotalCommit = dwTotalCommit + mi.RegionSize
End If
pAddr = mi.BaseAddress + mi.RegionSize'跳过已经查询过的内存块,到未被查询的内存地址起始处
ret = VirtualQueryEx(hProcess, pAddr, mi, miLen)'再次查询,直到查询失败(所有可查询地址都已经查过了)
Loop
GetTotalCommittedMemory = dwTotalCommit
Public Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
同样,为了使用方便,lpBaseAddress As Any被我改成了ByVal lpBaseAddress As Long,然后讲一下在进程内存里查找数据的技术。