Perguntas sobre carregamento de DLL em um espaço de endereço do processo

Bem, li vários artigos de Matt Pietrek sobre arquivos Portable Executable (PE), como:

Uma análise aprofundada do formato de arquivo executável portátil do Win32,Parte 1 eParte 2Artigo do MSJ sobre vinculadoresArtigo do MSJ no formato COFF

Além disso, li algumas outras fontes sobre o assunto. Sou eu que negligencio algumas partes ou as perguntas não são respondidas lá.

Então, aqui estão as perguntas:

Sabe-se que, ao carregar um EXE, o Windows Loader lê a lista de DLLs importadas da IAT (Importa Address Table) e as carrega no espaço de endereço do processo.

O espaço de endereço do processo é um espaço virtual. A DLL já pode ter sido carregada em algum espaço físico. Isso acontece para DLLs comoKERNEL32.dll ouUSER32.dll. Qual é a relação entre o endereço físico e o virtual? O carregador apenas aloca páginas e copia a DLL ou faz referências?

Se uma DLL não estiver carregada, o Loader carrega toda a DLL ou apenas as funções necessárias? Por exemplo, se você usou a funçãofoo() debar.dll, o carregador carrega todo obar.dll no espaço de endereço do processo? Ou apenas carrega ofoocódigo no espaço de endereço do processo?

Suponha que seu arquivo EXE use a funçãoMessageBox() deUSER32.DLL, que reside em%WINDIR%\system32\user32.dll. Você pode desenvolver um personalizadoUSER32.DLL, coloque-o no mesmo diretório que o arquivo EXE e espere que o seu arquivo personalizadoMessageBox é chamado pelo seu aplicativo em vez do padrão do sistemaMessageBox?

questionAnswers(2)

yourAnswerToTheQuestion