Não sei onde você aprendeu isso mas você precisa rever seus conceitos.Todo processo tem pelo menos uma Thread que é a função Main(), você pode criar outras Threads no seu projeto e elas estarão no mesmo espaço de memória do seu módulo, exceções são quando você aloca espaço na memória com VirtualAlloc ou na Heap com HeapAlloc e transfere a função para esses espaços alocados e usa CreateThread nesse caso o endereço sera diferente do espaço de memória do seu módulo, malwares utilizam essa técnica para bypassear Anti Virus, Cheats utilizam essa técnica para bypassear Anti Cheats e packers utilizam essa técnica para dificultar a analise estática do código.
Exemplos:
Code:
teste.exe
void hotkey()
{
if(GetAsyncKeyState(VK_F5))
MessageBox(0,"HotKey","teste",0);
Sleep(100);
}
int main()
{
CreateThread(0,0,(LPTHREAD_START_ROUTINE)hotkey,0,0,0); // essa Thread estará no mesmo espaço de memória do módulo teste.exe
CreateThread(0,0,(LPTHREAD_START_ROUTINE)Sleep,100,0,0); // essa Thread estará no mesmo espaço de memória do módulo Kernel32.dll
return 0;
}
Threads compartilham a seção .CODE e a .DATA.
Para saber se Thread faz parte do módulo main.exe é só pegar o entry addr da Thread no botão T e comparar com o endereço do módulo main.exe para saber se está no mesmo espaço de memória, se estiver no mesmo espaço de memória é só usar GetModuleHandle(0); ou o método da PEB e somar a offset.
Para pegar o endereço da Thread é só usar NtQueryInformationThread passando o parâmetro ThreadQuerySetWin32StartAddress.



