ÃÖ»óÀ§ â ¿°Å
µ¥½ºÅ©ÅéÀÇ ÇÁ·Î¼¼½º ¿°Å ÀÛ¾÷°ú ÃÖ»óÀ§ â ¿°Å ÀÛ¾÷À» ºñ±³ÇØ º¸¸é ÃÖ»óÀ§ â ¿°Å ÀÛ¾÷ÀÌ Á»´õ °£´ÜÇÕ´Ï´Ù. ÃÖ»óÀ§
âÀ» ¿°ÅÇÏ·Á¸é
EnumWindows() ÇÔ¼ö¸¦ »ç¿ëÇϽʽÿÀ. zÃà º¯°æ ¹× ¼Õ½Ç âÀ¸·Î ÀÎÇØ È¥µ¿µÉ ¼ö ÀÖÀ¸¹Ç·Î
GetWindow()¸¦ »ç¿ëÇÏ¿© â ¸ñ·ÏÀ» ¸¸µéÁö ¸¶½Ê½Ã¿À.
EnumWindows()´Â Äݹé ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿Í »ç¿ëÀÚ Á¤ÀÇ
LPARAM °ªÀ» ¸Å°³ º¯¼ö·Î »ç¿ëÇϸç, µ¥½ºÅ©Åé¿¡¼ ½ÇÇà ÁßÀÎ °¢ â(¶Ç´Â ÃÖ»óÀ§ â)¿¡ ´ëÇØ Äݹé ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. ±×·¯¸é
Äݹé ÇÔ¼ö´Â ÇØ´ç â ÇÚµéÀ» »ç¿ëÇÏ¿© âÀ» ¸ñ·Ï¿¡ Ãß°¡ÇÏ´Â µîÀÇ ÀÛ¾÷À» ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀ» »ç¿ëÇϸé âÀÇ zÃà º¯°æ µîÀ¸·Î ÀÎÇØ
È¥µ¿µÇÁö ¾Ê½À´Ï´Ù. â ÇÚµéÀ» ¾òÀ¸¸é
GetWindowText()¸¦ È£ÃâÇÏ¿© Á¦¸ñÀ» °¡Á®¿Ã ¼ö ÀÖ½À´Ï´Ù.
ÇÁ·Î¼¼½º ¿°Å
½Ã½ºÅÛÀÇ ÇÁ·Î¼¼½º ¸ñ·ÏÀ» ¸¸µå´Â ÀÛ¾÷Àº â ¿°Å ÀÛ¾÷º¸´Ù ¾à°£ º¹ÀâÇÕ´Ï´Ù. ÁÖ·Î ±× ÀÌÀ¯´Â »ç¿ëÇÏ´Â Win32 ¿î¿µ
üÁ¦¿¡ µû¶ó ÀÌ ÀÛ¾÷À» ¼öÇàÇÏ´Â API ÇÔ¼ö°¡ ´Þ¶óÁö±â ¶§¹®ÀÔ´Ï´Ù. Windows 95, Windows 98, Windows
Millennium Edition, Windows 2000 ¹× Windows XP¿¡¼´Â APIÀÇ ToolHelp32 ¶óÀ̺귯¸®¿¡ ÀÖ´Â ÇÔ¼ö¸¦
»ç¿ëÇÒ ¼ö ÀÖÁö¸¸, Windows NT¿¡¼´Â Platform SDK¿¡¼ Á¦°øÇÏ´Â APIÀÇ PSAPI ¶óÀ̺귯¸®¿¡ ÀÖ´Â ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.
ÀÌ ¹®¼¿¡¼´Â ÀÌ·¯ÇÑ µÎ °¡Áö ¹æ¹ýÀ» ¸ðµÎ ¼³¸íÇÏ¸ç ¸ðµç Win32 ¿î¿µ üÁ¦¿¡¼ ÀÛµ¿ÇÏ´Â
EnumProcs()¶ó´Â ¿¹Á¦ ·¡ÆÛ ÇÔ¼öµµ Á¦°øÇÕ´Ï´Ù.
ToolHelp32 ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º ¿°Å
¸ÕÀú ToolHelp32 ¹æ¹ýÀ» »ìÆìº¾´Ï´Ù. KERNEL32.dll¿¡ ÀÖ´Â ToolHelp32 ÇÔ¼ö´Â Ç¥ÁØ API
ÇÔ¼öÀÔ´Ï´Ù. ÀÌ·¯ÇÑ API´Â Windows NT 4.0¿¡¼ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù.
ToolHelp32´Â ½Ã½ºÅÛÀÇ ÇÁ·Î¼¼½º¿Í
½º·¹µå¸¦ ¿°ÅÇÒ »Ó ¾Æ´Ï¶ó ¸Þ¸ð¸®¿Í ¸ðµâ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Â ´Ù¾çÇÑ ÇÔ¼ö¸¦ Á¦°øÇÕ´Ï´Ù. ±×·¯³ª ÇÁ·Î¼¼½º¸¦ ¿°ÅÇÒ ¶§´Â
CreateToolhelp32Snapshot(),
Process32First(),
Process32Next() µîÀÇ ¼¼ ÇÔ¼ö¸¸ ÇÊ¿äÇÕ´Ï´Ù.
ToolHelp32 ÇÔ¼ö¸¦ »ç¿ëÇϴ ù ¹øÂ° ´Ü°è´Â ½Ã½ºÅÛ Á¤º¸¿¡ ´ëÇÑ
"½º³À¼¦"À» ¸¸µå´Â °ÍÀÔ´Ï´Ù. ½º³À¼¦Àº
CreateToolhelp32Snapshot() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸¸µì´Ï´Ù. ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ½º³À¼¦¿¡ ÀúÀåµÇ´Â Á¤º¸ÀÇ Á¾·ù¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÁ·Î¼¼½º Á¤º¸¸¦
ÀúÀåÇÏ·Á¸é
TH32CS_SNAPPROCESS Ç÷¡±×¸¦ Æ÷ÇÔ½ÃÄÑ¾ß ÇÕ´Ï´Ù.
CreateToolhelp32Snapshot() ÇÔ¼ö´Â ¿Ï·áµÇ¸é,
CloseHandle()¿¡ Àü´ÞµÇ¾î¾ß ÇÏ´Â ÇÚµéÀ» ¹ÝȯÇÕ´Ï´Ù.
½º³À¼¦À» ¸¸µç ÈÄ ÀÌ ½º³À¼¦¿¡¼ ÇÁ·Î¼¼½º ¸ñ·ÏÀ» °Ë»öÇÏ·Á¸é
Process32First¸¦ ÇÑ ¹ø È£ÃâÇÑ ´ÙÀ½
Process32Next¸¦ ¹Ýº¹ È£ÃâÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö Áß Çϳª°¡ FALSE¸¦ ¹ÝȯÇÒ ¶§±îÁö ÀÌ ÀÛ¾÷À» °è¼ÓÇÕ´Ï´Ù. ÀÌ ÀÛ¾÷Àº ½º³À¼¦¿¡ ÀÖ´Â
ÇÁ·Î¼¼½º ¸ñ·Ï Àüü¿¡ ¹Ýº¹µË´Ï´Ù. ÀÌ·¯ÇÑ µÎ ÇÔ¼ö´Â ¸ðµÎ ½º³À¼¦¿¡ ´ëÇÑ ÇÚµé°ú PROCESSENTRY32 ±¸Á¶¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸Å°³ º¯¼ö·Î
»ç¿ëÇÕ´Ï´Ù.
Process32First ¶Ç´Â
Process32Next¸¦ È£ÃâÇϸé PROCESSENTRY32 ±¸Á¶¿¡´Â ½Ã½ºÅÛ ÇÁ·Î¼¼½º Áß Çϳª¿¡ ´ëÇÑ À¯¿ëÇÑ Á¤º¸°¡ Æ÷ÇԵ˴ϴÙ. ÇÁ·Î¼¼½º
ID´Â PROCESSENTRY32 ±¸Á¶ÀÇ th32ProcessID ±¸¼º¿ø¿¡ ÀÖ½À´Ï´Ù. À̰ÍÀ»
OpenProcess() API¿¡ Àü´ÞÇÏ¿© ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÚµéÀ» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ½ÇÇà ÆÄÀÏ ¹× ÇÁ·Î¼¼½º °æ·Î´Â PROCESSENTRY32
±¸Á¶ÀÇ szExeFile ±¸¼º¿ø¿¡ ÀúÀåµË´Ï´Ù. ÀÌ ±¸Á¶¿¡´Â ´Ù¸¥ À¯¿ëÇÑ Á¤º¸µµ µé¾î ÀÖ½À´Ï´Ù.
Âü°í:Process32First()¸¦ È£ÃâÇϱâ Àü¿¡ PROCESSENTRY32 ±¸Á¶ÀÇ dwSize ±¸¼º¿øÀ»
sizeof(PROCESSENTRY32)·Î ¼³Á¤ÇÏ´Â °ÍÀÌ Áß¿äÇÕ´Ï´Ù.
PSAPI ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º ¿°Å
Windows NT¿¡¼ ÇÁ·Î¼¼½º ¸ñ·ÏÀ» ¸¸µé·Á¸é PSAPI.dll¿¡ ÀÖ´Â PSAPI ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ÀÌ
ÆÄÀÏÀº ´ÙÀ½ Microsoft À¥ »çÀÌÆ®¿¡¼ ´Ù¿î·ÎµåÇÒ ¼ö ÀÖ´Â Ç÷§Æû Platform SDK¿Í ÇÔ²² ¹èÆ÷µË´Ï´Ù.
Platform SDK¿¡´Â ÇÊ¿äÇÑ PSAPI.h¿Í PSAPI.lib ÆÄÀϵµ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.
PSAPI ¶óÀ̺귯¸®¿¡ ÀÖ´Â ÇÔ¼ö¸¦ »ç¿ëÇÏ·Á¸é PSAPI.lib ÆÄÀÏÀ» ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡Çϰí PSAPI API¸¦ È£ÃâÇÏ´Â ¸ðµâ¿¡ PSAPI.h
ÆÄÀÏÀ» Æ÷ÇÔÇÕ´Ï´Ù. Windows NT 4.0¿¡´Â PSAPI.dll ÆÄÀÏÀ» »ç¿ëÇÏ´Â ½ÇÇà ÆÄÀÏÀÌ ¹èÆ÷µÇÁö ¾ÊÀ¸¹Ç·Î ¹Ýµå½Ã PSAPI.dll
ÆÄÀϰú ÇÔ²² ½ÇÇà ÆÄÀÏÀ» ¹èÆ÷ÇϽʽÿÀ. Àç¹èÆ÷ °¡´ÉÇÑ ¹öÀüÀÇ PSAPI.dll(Àüü Platform SDK Á¦¿Ü)Àº ´ÙÀ½ À§Ä¡¿¡¼ ´Ù¿î·ÎµåÇÒ
¼ö ÀÖ½À´Ï´Ù.
ToolHelp32 ÇÔ¼ö¿Í ¸¶Âù°¡Áö·Î PSAPI ¶óÀ̺귯¸®¿¡µµ ±âŸ À¯¿ëÇÑ ÇÔ¼ö°¡ ¸¹ÀÌ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ±×·¯³ª ÀÌ
¹®¼¿¡¼´Â
EnumProcesses(),
EnumProcessModules(),
GetModuleFileNameEx(),
GetModuleBaseName() µî ÇÁ·Î¼¼½º ¿°Å °ü·Ã ÇÔ¼ö¸¸ ¼³¸íÇÕ´Ï´Ù.
ÇÁ·Î¼¼½º ¸ñ·ÏÀ» ¸¸µå´Â ù ¹øÂ° ´Ü°è´Â
EnumProcesses()¸¦ È£ÃâÇÏ´Â °ÍÀÔ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÕ´Ï´Ù.
BOOL EnumProcesses( DWORD *lpidProcess, DWORD cb, DWORD *cbNeeded );
EnumProcesses()´Â DWORD ¹è¿¿¡ ´ëÇÑ Æ÷ÀÎÅÍ(lpidProcess), ¹è¿ÀÇ Å©±â(
cb) ¹× ¹ÝȯµÈ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ ¹Þ´Â DWORD¿¡ ´ëÇÑ Æ÷ÀÎÅÍ(
cbNeeded)¸¦ ¸Å°³ º¯¼ö·Î »ç¿ëÇÕ´Ï´Ù. DWORD ¹è¿Àº ÇöÀç ½ÇÇà ÁßÀÎ ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÁ·Î¼¼½º IDÀÇ ¹è¿·Î ä¿öÁý´Ï´Ù.
cbNeeded ¸Å°³ º¯¼ö´Â »ç¿ëµÇ´Â ¹è¿ÀÇ Å©±â¸¦ ¹ÝȯÇÕ´Ï´Ù. nReturned = cbNeeded / sizeof(DWORD)´Â
¾ó¸¶³ª ¸¹Àº ÇÁ·Î¼¼½º ID°¡ ¹ÝȯµÇ¾ú´ÂÁö °è»êÇÕ´Ï´Ù.
Âü°í: ÀÌ ¹®¼¿¡¼´Â ¹ÝȯµÈ DWORD "cbNeeded"¶ó°í ÁöÁ¤ÇÏÁö¸¸ ½ÇÁ¦·Î ¾î´À Á¤µµ Å©±âÀÇ ¹è¿ÀÌ Àü´ÞµÇ¾î¾ß ÇÏ´ÂÁö
È®ÀÎÇÒ ¹æ¹ýÀº ¾ø½À´Ï´Ù.
EnumProcesses()´Â
cb ¸Å°³ º¯¼ö¿¡ Àü´ÞµÈ ¹è¿ °ªº¸´Ù Å«
cbNeeded °ªÀ» ¹ÝȯÇÏÁö ¾Ê½À´Ï´Ù. µû¶ó¼
EnumProcesses() ÇÔ¼ö¸¦ ¼º°øÀûÀ¸·Î »ç¿ëÇÏ´Â À¯ÀÏÇÑ ¹æ¹ýÀº DWORD ¹è¿À» ÇÒ´çÇϰí, ¹Ýȯ ½Ã
cbNeeded°¡
cb¿Í °°À¸¸é ´õ Å« ¹è¿À» ÇÒ´çÇÏ¿©
cbNeeded°¡
cbº¸´Ù ÀÛ¾ÆÁú ¶§±îÁö ´Ù½Ã ½ÃµµÇÏ´Â °ÍÀÔ´Ï´Ù.
ÀÌÁ¦ ½Ã½ºÅÛÀÇ °¢ ÇÁ·Î¼¼½º ID°¡ Æ÷ÇÔµÈ ¹è¿ÀÌ
¸¸µé¾îÁý´Ï´Ù. ÇÁ·Î¼¼½º À̸§À» ¾Æ´Â °ÍÀÌ ¸ñÀûÀ̶ó¸é ¸ÕÀú ÇÚµéÀ» ¾ò¾î¾ß ÇÕ´Ï´Ù. ÇÁ·Î¼¼½º ID¿¡¼ ÇÚµéÀ» ¾òÀ¸·Á¸é
OpenProcess()¸¦ »ç¿ëÇϽʽÿÀ.
ÇÚµéÀ» ¾òÀº ÈÄ¿¡´Â ÇÁ·Î¼¼½ºÀÇ Ã¹ ¹øÂ° ¸ðµâÀ» ¾ò¾î¾ß ÇÕ´Ï´Ù. ÇÁ·Î¼¼½ºÀÇ Ã¹ ¹øÂ°
¸ðµâÀ» ¾òÀ¸·Á¸é ´ÙÀ½ ¸Å°³ º¯¼ö¸¦ »ç¿ëÇÏ¿©
EnumProcessModules() API¸¦ È£ÃâÇϽʽÿÀ.
EnumProcessModules( hProcess, &hModule, sizeof(hModule), &cbReturned );
ÀÌ ÇÔ¼ö´Â hModule º¯¼ö¿¡ ÇÁ·Î¼¼½ºÀÇ Ã¹ ¹øÂ° ¸ðµâ¿¡ ´ëÇÑ ÇÚµéÀ» ÀúÀåÇÕ´Ï´Ù. ½ÇÁ¦·Î ÇÁ·Î¼¼½º¿¡´Â À̸§ÀÌ ¾øÁö¸¸ ÇÁ·Î¼¼½ºÀÇ
ù ¹øÂ° ¸ðµâÀÌ ÇÁ·Î¼¼½ºÀÇ ½ÇÇà ÆÄÀÏÀÌ µË´Ï´Ù. ÀÌÁ¦ ¹ÝȯµÈ ¸ðµâ ÇÚµé(hModule)À»
GetModuleFileNameEx() ¶Ç´Â
GetModuleBaseName() API¿¡¼ »ç¿ëÇÏ¿© Àüü ÆÄÀÏ °æ·Î À̸§À̳ª ÇÁ·Î¼¼½º ½ÇÇà ÆÄÀÏÀÇ °£´ÜÇÑ ¸ðµâ À̸§À» ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. µÎ ÇÔ¼ö
¸ðµÎ ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ÇÚµé, ¸ðµâ¿¡ ´ëÇÑ ÇÚµé, À̸§À» ¹ÝȯÇÏ´Â ¹öÆÛ Æ÷ÀÎÅÍ¿Í ¹öÆÛ Å©±â¸¦ ¸Å°³ º¯¼ö·Î »ç¿ëÇÕ´Ï´Ù.
EnumProcesses() API¸¦ ÅëÇØ ¹ÝȯµÈ °¢ ÇÁ·Î¼¼½º ID¿¡ ´ëÇØ ÀÌ ´Ü°è¸¦ ¹Ýº¹Çϸé Windows NTÀÇ ÇÁ·Î¼¼½º ¸ñ·ÏÀÌ ¸¸µé¾îÁý´Ï´Ù.
16ºñÆ® ÇÁ·Î¼¼½º
Windows 95, Windows 98 ¹× Windows Millennium Edition¿¡¼´Â 16ºñÆ® ÀÀ¿ë
ÇÁ·Î±×·¥À» Win32 ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼Ã³·³ ToolHelp32¸¦ »ç¿ëÇÏ¿© ¿°ÅÇÒ ¼ö ÀÖ½À´Ï´Ù. 16ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥¿¡µµ Win32 ÀÀ¿ë
ÇÁ·Î±×·¥°ú ¸¶Âù°¡Áö·Î ÇÁ·Î¼¼½º ID µîÀÌ ÀÖ½À´Ï´Ù. ±×·¯³ª Windows NT, Windows 2000 ¶Ç´Â Windows XP ¿î¿µ
üÁ¦¿¡¼´Â °æ¿ì°¡ ´Ù¸¨´Ï´Ù. ÀÌ·¯ÇÑ ¿î¿µ üÁ¦¿¡¼´Â 16ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ VDM(Virtual Dos Machine)¿¡¼
½ÇÇàµË´Ï´Ù.
µû¶ó¼ Windows NT, Windows 2000 ¹× Windows XP¿¡¼ 16ºñÆ® ÀÀ¿ë ÇÁ·Î±×·¥À»
¿°ÅÇÏ·Á¸é
VDMEnumTaskWOWEx()¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ¿øº» ¸ðµâ¿¡ VDMDBG.h¸¦ Æ÷ÇÔÇØ¾ß Çϸç VDMDBG.lib ÆÄÀÏÀ» »ç¿ëÀÚ ÇÁ·ÎÁ§Æ®¿Í
¿¬°áÇØ¾ß ÇÕ´Ï´Ù. ÀÌ µÎ ÆÄÀÏÀº Platform SDK¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.
ÀÌ ÇÔ¼öÀÇ ¼±¾ðÀº ´ÙÀ½°ú °°½À´Ï´Ù.
INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
LPARAM lparam );
¿©±â¼ dwProcessId´Â ¿°ÅÇÒ 16ºñÆ® ÀÛ¾÷ÀÇ NTVDM ÇÁ·Î¼¼½º¿¡ ´ëÇÑ ½Äº°ÀÚÀÔ´Ï´Ù.
fp ¸Å°³ º¯¼ö´Â ÄÝ¹é ¿°Å ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀ̸ç,
lparam ¸Å°³ º¯¼ö´Â ¿°Å ÇÔ¼ö¿¡ Àü´ÞµÉ »ç¿ëÀÚ Á¤ÀÇ °ªÀÔ´Ï´Ù.
¿°Å ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇØ¾ß ÇÕ´Ï´Ù.
BOOL WINAPI Enum16( DWORD dwThreadId, WORD hMod16, WORD hTask16, PSZ
pszModName, PSZ pszFileName, LPARAM lpUserDefined );
ÀÌ ÇÔ¼ö´Â
VDMEnumTaskWOWEx()¿¡ Àü´ÞµÇ¸ç NTVDM ÇÁ·Î¼¼½º¿¡¼ ½ÇÇà ÁßÀÎ °¢ 16ºñÆ® ÀÛ¾÷¿¡ ´ëÇØ ÇÑ ¹ø È£ÃâµË´Ï´Ù. ¿°Å¸¦ °è¼ÓÇÏ·Á¸é
FALSE¸¦, ¿°Å¸¦ ³¡³»·Á¸é TRUE¸¦ ¹ÝÈ¯ÇØ¾ß ÇÕ´Ï´Ù. À̰ÍÀº
EnumWindows()¿Í ¹Ý´ëÀÔ´Ï´Ù.
¿¹Á¦ ÄÚµå
´ÙÀ½ ¿¹Á¦ ÄÚµå´Â PSAPI ¹× ToolHelp32 ÇÔ¼ö¸¦
EnumProcs()¶ó´Â ÇÑ ÇÔ¼ö·Î ĸ½¶ÈÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö´Â ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ »ç¿ëÇϰí À̰ÍÀ» ¹Ýº¹ÀûÀ¸·Î È£ÃâÇÑ´Ù´Â Á¡¿¡¼
EnumWindows()¿Í ºñ½ÁÇϸç, ½Ã½ºÅÛ¿¡ ÀÖ´Â °¢ ÇÁ·Î¼¼½º¿¡ ´ëÇØ ÇÑ ¹ø ÀÛµ¿ÇÕ´Ï´Ù. ÀÌ ÇÔ¼öÀÇ ¼±¾ðÀº ´ÙÀ½°ú °°½À´Ï´Ù.
BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam );
ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °æ¿ì Äݹé ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇϽʽÿÀ.
BOOL CALLBACK Proc( DWORD dw, WORD w16, LPCSTR lpstr, LPARAM lParam );
dw ¸Å°³ º¯¼ö´Â ID¸¦ Æ÷ÇÔÇÏ°Ô µÇ°í, 32ºñÆ® ÇÁ·Î¼¼½ºÀÎ °æ¿ì "w16"Àº 16ºñÆ® ÀÛ¾÷ ¹øÈ£³ª 0(Windows
95¿¡¼´Â Ç×»ó 0)À̰í,
lpstr ¸Å°³ º¯¼ö´Â ÇØ´ç ÆÄÀÏ À̸§À» °¡¸®Å°¸ç,
lParam˼
EnumProcs()¿¡ Àü´ÞµÇ´Â »ç¿ëÀÚ Á¤ÀÇ
lParamÀÔ´Ï´Ù.
EnumProcs() ÇÔ¼ö´Â º¸´Ù ÀϹÝÀûÀÎ ¾Ï½ÃÀû ¿¬°á ´ë½Å ¸í½ÃÀû ¿¬°áÀ» ÅëÇØ ToolHelp32 ¹× PSAPI ÇÔ¼ö¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ
¹æ¹ýÀ» »ç¿ëÇÏ¸é ¸ðµç Win32 ¿î¿µ üÁ¦¿¡¼ Äڵ尡 ÀÌÁø ȣȯµË´Ï´Ù.
//
// EnumProc.c
//
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <vdmdbg.h>
typedef BOOL (CALLBACK *PROCENUMPROC)(DWORD, WORD, LPSTR, LPARAM);
typedef struct {
DWORD dwPID;
PROCENUMPROC lpProc;
DWORD lParam;
BOOL bEnd;
} EnumInfoStruct;
BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam);
BOOL WINAPI Enum16(DWORD dwThreadId, WORD hMod16, WORD hTask16,
PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined);
//
// The EnumProcs function takes a pointer to a callback function
// that will be called once per process with the process filename
// and process ID.
//
// lpProc -- Address of callback routine.
//
// lParam -- A user-defined LPARAM value to be passed to
// the callback routine.
//
// Callback function definition:
// BOOL CALLBACK Proc(DWORD dw, WORD w, LPCSTR lpstr, LPARAM lParam);
//
BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam) {
OSVERSIONINFO osver;
HINSTANCE hInstLib = NULL;
HINSTANCE hInstLib2 = NULL;
HANDLE hSnapShot = NULL;
LPDWORD lpdwPIDs = NULL;
PROCESSENTRY32 procentry;
BOOL bFlag;
DWORD dwSize;
DWORD dwSize2;
DWORD dwIndex;
HMODULE hMod;
HANDLE hProcess;
char szFileName[MAX_PATH];
EnumInfoStruct sInfo;
// ToolHelp Function Pointers.
HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD, DWORD);
BOOL (WINAPI *lpfProcess32First)(HANDLE, LPPROCESSENTRY32);
BOOL (WINAPI *lpfProcess32Next)(HANDLE, LPPROCESSENTRY32);
// PSAPI Function Pointers.
BOOL (WINAPI *lpfEnumProcesses)(DWORD *, DWORD, DWORD *);
BOOL (WINAPI *lpfEnumProcessModules)(HANDLE, HMODULE *, DWORD,
LPDWORD);
DWORD (WINAPI *lpfGetModuleBaseName)(HANDLE, HMODULE, LPTSTR, DWORD);
// VDMDBG Function Pointers.
INT (WINAPI *lpfVDMEnumTaskWOWEx)(DWORD, TASKENUMPROCEX, LPARAM);
// Retrieve the OS version
osver.dwOSVersionInfoSize = sizeof(osver);
if (!GetVersionEx(&osver))
return FALSE;
// If Windows NT 4.0
if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
&& osver.dwMajorVersion == 4) {
__try {
// Get the procedure addresses explicitly. We do
// this so we don't have to worry about modules
// failing to load under OSes other than Windows NT 4.0
// because references to PSAPI.DLL can't be resolved.
hInstLib = LoadLibraryA("PSAPI.DLL");
if (hInstLib == NULL)
__leave;
hInstLib2 = LoadLibraryA("VDMDBG.DLL");
if (hInstLib2 == NULL)
__leave;
// Get procedure addresses.
lpfEnumProcesses = (BOOL (WINAPI *)(DWORD *, DWORD, DWORD*))
GetProcAddress(hInstLib, "EnumProcesses");
lpfEnumProcessModules = (BOOL (WINAPI *)(HANDLE, HMODULE *,
DWORD, LPDWORD)) GetProcAddress(hInstLib,
"EnumProcessModules");
lpfGetModuleBaseName = (DWORD (WINAPI *)(HANDLE, HMODULE,
LPTSTR, DWORD)) GetProcAddress(hInstLib,
"GetModuleBaseNameA");
lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
LPARAM)) GetProcAddress(hInstLib2, "VDMEnumTaskWOWEx");
if (lpfEnumProcesses == NULL
|| lpfEnumProcessModules == NULL
|| lpfGetModuleBaseName == NULL
|| lpfVDMEnumTaskWOWEx == NULL)
__leave;
//
// Call the PSAPI function EnumProcesses to get all of the
// ProcID's currently in the system.
//
// NOTE: In the documentation, the third parameter of
// EnumProcesses is named cbNeeded, which implies that you
// can call the function once to find out how much space to
// allocate for a buffer and again to fill the buffer.
// This is not the case. The cbNeeded parameter returns
// the number of PIDs returned, so if your buffer size is
// zero cbNeeded returns zero.
//
// NOTE: The "HeapAlloc" loop here ensures that we
// actually allocate a buffer large enough for all the
// PIDs in the system.
//
dwSize2 = 256 * sizeof(DWORD);
do {
if (lpdwPIDs) {
HeapFree(GetProcessHeap(), 0, lpdwPIDs);
dwSize2 *= 2;
}
lpdwPIDs = (LPDWORD) HeapAlloc(GetProcessHeap(), 0,
dwSize2);
if (lpdwPIDs == NULL)
__leave;
if (!lpfEnumProcesses(lpdwPIDs, dwSize2, &dwSize))
__leave;
} while (dwSize == dwSize2);
// How many ProcID's did we get?
dwSize /= sizeof(DWORD);
// Loop through each ProcID.
for (dwIndex = 0; dwIndex < dwSize; dwIndex++) {
szFileName[0] = 0;
// Open the process (if we can... security does not
// permit every process in the system to be opened).
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE, lpdwPIDs[dwIndex]);
if (hProcess != NULL) {
// Here we call EnumProcessModules to get only the
// first module in the process. This will be the
// EXE module for which we will retrieve the name.
if (lpfEnumProcessModules(hProcess, &hMod,
sizeof(hMod), &dwSize2)) {
// Get the module name
if (!lpfGetModuleBaseName(hProcess, hMod,
szFileName, sizeof(szFileName)))
szFileName[0] = 0;
}
CloseHandle(hProcess);
}
// Regardless of OpenProcess success or failure, we
// still call the enum func with the ProcID.
if (!lpProc(lpdwPIDs[dwIndex], 0, szFileName, lParam))
break;
// Did we just bump into an NTVDM?
if (_stricmp(szFileName, "NTVDM.EXE") == 0) {
// Fill in some info for the 16-bit enum proc.
sInfo.dwPID = lpdwPIDs[dwIndex];
sInfo.lpProc = lpProc;
sInfo.lParam = (DWORD) lParam;
sInfo.bEnd = FALSE;
// Enum the 16-bit stuff.
lpfVDMEnumTaskWOWEx(lpdwPIDs[dwIndex],
(TASKENUMPROCEX) Enum16, (LPARAM) &sInfo);
// Did our main enum func say quit?
if (sInfo.bEnd)
break;
}
}
} __finally {
if (hInstLib)
FreeLibrary(hInstLib);
if (hInstLib2)
FreeLibrary(hInstLib2);
if (lpdwPIDs)
HeapFree(GetProcessHeap(), 0, lpdwPIDs);
}
// If any OS other than Windows NT 4.0.
} else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
|| (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
&& osver.dwMajorVersion > 4)) {
__try {
hInstLib = LoadLibraryA("Kernel32.DLL");
if (hInstLib == NULL)
__leave;
// If NT-based OS, load VDMDBG.DLL.
if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
hInstLib2 = LoadLibraryA("VDMDBG.DLL");
if (hInstLib2 == NULL)
__leave;
}
// Get procedure addresses. We are linking to
// these functions explicitly, because a module using
// this code would fail to load under Windows NT,
// which does not have the Toolhelp32
// functions in KERNEL32.DLL.
lpfCreateToolhelp32Snapshot =
(HANDLE (WINAPI *)(DWORD,DWORD))
GetProcAddress(hInstLib, "CreateToolhelp32Snapshot");
lpfProcess32First =
(BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
GetProcAddress(hInstLib, "Process32First");
lpfProcess32Next =
(BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
GetProcAddress(hInstLib, "Process32Next");
if (lpfProcess32Next == NULL
|| lpfProcess32First == NULL
|| lpfCreateToolhelp32Snapshot == NULL)
__leave;
if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
LPARAM)) GetProcAddress(hInstLib2, "VDMEnumTaskWOWEx");
if (lpfVDMEnumTaskWOWEx == NULL)
__leave;
}
// Get a handle to a Toolhelp snapshot of all processes.
hSnapShot = lpfCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapShot == INVALID_HANDLE_VALUE) {
FreeLibrary(hInstLib);
return FALSE;
}
// Get the first process' information.
procentry.dwSize = sizeof(PROCESSENTRY32);
bFlag = lpfProcess32First(hSnapShot, &procentry);
// While there are processes, keep looping.
while (bFlag) {
// Call the enum func with the filename and ProcID.
if (lpProc(procentry.th32ProcessID, 0,
procentry.szExeFile, lParam)) {
// Did we just bump into an NTVDM?
if (_stricmp(procentry.szExeFile, "NTVDM.EXE") == 0) {
// Fill in some info for the 16-bit enum proc.
sInfo.dwPID = procentry.th32ProcessID;
sInfo.lpProc = lpProc;
sInfo.lParam = (DWORD) lParam;
sInfo.bEnd = FALSE;
// Enum the 16-bit stuff.
lpfVDMEnumTaskWOWEx(procentry.th32ProcessID,
(TASKENUMPROCEX) Enum16, (LPARAM) &sInfo);
// Did our main enum func say quit?
if (sInfo.bEnd)
break;
}
procentry.dwSize = sizeof(PROCESSENTRY32);
bFlag = lpfProcess32Next(hSnapShot, &procentry);
} else
bFlag = FALSE;
}
} __finally {
if (hInstLib)
FreeLibrary(hInstLib);
if (hInstLib2)
FreeLibrary(hInstLib2);
}
} else
return FALSE;
// Free the library.
FreeLibrary(hInstLib);
return TRUE;
}
BOOL WINAPI Enum16(DWORD dwThreadId, WORD hMod16, WORD hTask16,
PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined) {
BOOL bRet;
EnumInfoStruct *psInfo = (EnumInfoStruct *)lpUserDefined;
bRet = psInfo->lpProc(psInfo->dwPID, hTask16, pszFileName,
psInfo->lParam);
if (!bRet)
psInfo->bEnd = TRUE;
return !bRet;
}
BOOL CALLBACK MyProcessEnumerator(DWORD dwPID, WORD wTask,
LPCSTR szProcess, LPARAM lParam) {
if (wTask == 0)
printf("%5u %s\n", dwPID, szProcess);
else
printf(" %5u %s\n", wTask, szProcess);
return TRUE;
}
void main() {
EnumProcs((PROCENUMPROC) MyProcessEnumerator, 0);
}