怎么区分显式加载和隐式加载的DLL

如何区分显式加载和隐式加载的DLL
我想给指定的进程来个Snapshot,获取所有已加载的DLL模块信息。
但在分析的时候希望能够区别哪些是隐式加载(进程启动时自动加载),哪些是进程自己显式加载的(通过调用LoadLibrary函数)。
我想:通过Snapshot可以获得已加载的模块的句柄,能不能通过句柄的数值来区别模块被加载的方式呢?也就是说,Windows对于是否对于隐式还是显式加载的DLL,返回的模块句柄值是否不同的?

------解决方案--------------------
// 读取指定进程的导入表,以notepad.exe为例,VS2005测试通过.
//
#include <windows.h>
#include <Psapi.h>
#pragma comment(lib, "psapi.lib ")
int walkImportTable(LPVOID phInst)
{
BOOL nRet = 0;
// Get headers
PIMAGE_OPTIONAL_HEADER poh;
poh = (PIMAGE_OPTIONAL_HEADER)(&PIMAGE_NT_HEADERS((LPBYTE)phInst \
+ PIMAGE_DOS_HEADER(phInst)-> e_lfanew)-> OptionalHeader);

// - Process import table -----------------------------------------------

if(poh-> DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size!=0) {
PIMAGE_IMPORT_DESCRIPTOR pid;
pid=(IMAGE_IMPORT_DESCRIPTOR *)RVATOVA(phInst,poh-> DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);

// For all imported DLLs
while(pid-> OriginalFirstThunk!=0) {
char *svDllName;
svDllName=(char *)RVATOVA(phInst,pid-> Name);

// 你自己的代码


pid++;
}
}
return nRet;
}

int main(int argc, char* argv[])
{
PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartInfo = {0};
CreateProcess(NULL, "notepad.exe ", NULL, NULL, FALSE, 0, NULL, NULL, &StartInfo, &ProcInfo);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, NULL, ProcInfo.dwProcessId);
if(hProcess)
{
HMODULE hModule;
DWORD cbNeeded;
MODULEINFO modinfo;
LPVOID lpbuf = NULL;
SIZE_T nRead;
if(EnumProcessModules(hProcess, &hModule, sizeof(HMODULE), &cbNeeded))
{
GetModuleInformation( hProcess, hModule, &modinfo, sizeof(MODULEINFO) );
lpbuf = new BYTE[modinfo.SizeOfImage];
memset(lpbuf, 0, modinfo.SizeOfImage);
ReadProcessMemory(hProcess, modinfo.lpBaseOfDll, lpbuf, modinfo.SizeOfImage, &nRead);

//
walkImportTable(lpbuf);

return 0;
}