Как имея user-mode адрес определить для чего предназначена память (стек/куча/код итд) и какой модуль ее выделил?
делал нечто подобное так: MEMORY_BASIC_INFORMATION m; VirtualQuery(addr,&m,sizeof(m)); addr=(char*)m.BaseAddress-0x1000; VirtualQuery(addr,&m,sizeof(m)); if (m.Protect&PAGE_GUARD) { // addr - указатель на стек }; GetProcessHeaps - см msdn HANDLE h; MODULEENTRY32 m; h=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid); if (h==INVALID_HANDLE_VALUE) return NULL; m.dwSize=sizeof(MODULEENTRY32); if (Module32First(h,&m)==FALSE) {CloseHandle(h);return NULL;}; do { if ((addr>=m.modBaseAddr)&& (addr<(m.modBaseAddr+m. modBaseSize))) { // addr - принадлежит dll }; } while (Module32Next(h,&m)!=FALSE); CloseHandle(h);
Принадлежность адреса стеку текущего треда, ИМХО проще и надежнее проверять через TIB.StackBase и TIB.StackLimit Код (Text): mov ecx,MemAddr xor eax,eax mov edx,fs:[18h] cmp ecx,[edx+4] ;TIB.StackBase jbe @F cmp ecx,[edx+8] ;TIB.StackLimit ja @F inc eax ;адрес в стеке текущего треда @@: