C内存扫描器[无限循环]

C内存扫描器[无限循环],c,winapi,C,Winapi,我正在学习如何用C语言制作内存扫描器的简单教程。由于某些原因,我的主循环从未中断过 这是密码 MEMBLOCK* create_scan(unsigned int pid){ MEMBLOCK *mb_list = NULL; MEMORY_BASIC_INFORMATION meminfo; unsigned char *addr = 0; HANDLE hProc = OpenProcess (PROCESS_ALL_ACCESS, FALSE, p

我正在学习如何用C语言制作内存扫描器的简单教程。由于某些原因,我的主循环从未中断过

这是密码

MEMBLOCK* create_scan(unsigned int pid){

    MEMBLOCK *mb_list = NULL;
    MEMORY_BASIC_INFORMATION meminfo;   
    unsigned char *addr = 0;

    HANDLE hProc = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);

    if(hProc){
        while(1){
            // print the address for debug purpose
            printf("%d \r\n", addr);

            // loop should break out when the address overflows (return 0)
            if(VirtualQueryEx (hProc, addr, &meminfo, sizeof(meminfo)) == 0){
                break;
            }

 #define WRITABLE (PAGE_READWRITE | PAGE_WRITECOPY |PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)
            if ((meminfo.State & MEM_COMMIT) && (meminfo.Protect & WRITABLE)){
                MEMBLOCK *mb = create_memblock (hProc, &meminfo);
                if(mb){
                    mb->next = mb_list;
                    mb_list = mb;
                }
            }

            addr = (unsigned char*)meminfo.BaseAddress + meminfo.RegionSize;
        }
    }
    return mb_list;
}
出于某种原因,输出(printf)如下所示


任何想法,我都有点迷路了

VirtualQueryEx()的返回值是它用数据填充的结构的大小。除非有错误,否则它不会返回零

负值只是大于2GB的地址,在printf()中被解释为负数。一旦超过4GB,它就会返回到0。因为0是你的初始值,它第一次起作用,所以它会重新开始

退出循环需要不同的条件


您可能还希望使用%p而不是%d来打印当前地址。

如果地址太高,将产生错误否?非常感谢你解释我的结果至少我理解这个奇怪的结果。。。我一直想知道人们是怎么知道这些的。谢谢,我用SYSTEMINFO LPMaximumApplication地址打破了我的循环。谢谢。
123863040
125943808
... until ...
2147418112
... all on the sudden ...
-1207959552
... 
-243924992
0
65536
loop start again