±â¼ú ÀÚ·á: 175030 - ¸¶Áö¸· °ËÅä: 2004³â 10¿ù 3ÀÏ ÀÏ¿äÀÏ - ¼öÁ¤: 2.2

HOWTO: Win32 API¸¦ »ç¿ëÇÏ¿© ÀÀ¿ë ÇÁ·Î±×·¥ ¿­°Å

½Ã½ºÅÛ ÆÁº» ¹®¼­ÀÇ ³»¿ëÀº ±ÍÇϰ¡ »ç¿ëÇÏ´Â ¿î¿µ üÁ¦¿Í ´Ù¸¥ ¿î¿µ üÁ¦¿¡ ÇØ´çÇÕ´Ï´Ù. ¹®¼­ ³»¿ë Áß ±ÍÇÏ¿Í °ü·Ã ¾ø´Â ºÎºÐÀº Ç¥½ÃµÇÁö ¾Ê½À´Ï´Ù.

ÀÌ ÆäÀÌÁö¿¡¼­

¸ðµÎ È®´ë | ¸ðµÎ Ãà¼Ò

¿ä¾à

ÇÑ °¡Áö ÀϹÝÀûÀÎ ÇÁ·Î±×·¡¹Ö ÀÛ¾÷À¸·Î´Â ½ÇÇà ÁßÀÎ ¸ðµç "ÀÀ¿ë ÇÁ·Î±×·¥"À» ¿­°ÅÇÏ´Â ÀÛ¾÷ÀÌ ÀÖ½À´Ï´Ù. Windows ÀÛ¾÷ °ü¸®ÀÚ´Â ÀÌ·¯ÇÑ ÁÁÀº ¿¹·Î, "ÀÀ¿ë ÇÁ·Î±×·¥"À» µÎ °¡Áö ¹æ½ÄÀ¸·Î ³ª¿­ÇÕ´Ï´Ù. ÀÛ¾÷ °ü¸®ÀÚÀÇ Ã¹ ¹øÂ° ÅÇÀº µ¥½ºÅ©Åé¿¡¼­ ½ÇÇà ÁßÀÎ "¸ðµç ÀÀ¿ë ÇÁ·Î±×·¥ â"À» ³ª¿­ÇÏ¸ç µÎ ¹øÂ° ÅÇÀº ½Ã½ºÅÛÀÇ ¸ðµç "ÇÁ·Î¼¼½º"¸¦ ³ª¿­ÇÕ´Ï´Ù. ÀÌ ¹®¼­¿¡¼­´Â ÀÌ·¯ÇÑ µÎ ÀÛ¾÷À» ¼öÇàÇÏ´Â ¹æ¹ýÀ» ÀÚ¼¼ÇÏ°Ô ¼³¸íÇÕ´Ï´Ù.

Ãß°¡ Á¤º¸

ÃÖ»óÀ§ â ¿­°Å

µ¥½ºÅ©ÅéÀÇ ÇÁ·Î¼¼½º ¿­°Å ÀÛ¾÷°ú ÃÖ»óÀ§ â ¿­°Å ÀÛ¾÷À» ºñ±³ÇØ º¸¸é ÃÖ»óÀ§ â ¿­°Å ÀÛ¾÷ÀÌ Á»´õ °£´ÜÇÕ´Ï´Ù. ÃÖ»óÀ§ âÀ» ¿­°ÅÇÏ·Á¸é 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¿Í ÇÔ²² ¹èÆ÷µË´Ï´Ù.
Microsoft Platform SDK
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ (http://www.microsoft.com/msdownload/platformsdk/sdkupdate/)
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 Á¦¿Ü)Àº ´ÙÀ½ À§Ä¡¿¡¼­ ´Ù¿î·ÎµåÇÒ ¼ö ÀÖ½À´Ï´Ù.
Platform SDK Redistributable: PSAPI for Windows NT
http://www.microsoft.com/downloads/release.asp?releaseid=30337 (http://www.microsoft.com/downloads/release.asp?releaseid=3 0337)
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);
}
				

ÂüÁ¶

Pietrek, MattÀÇ Microsoft Systems Journal, no. 8, "Under the Hood"(1996³â 8¿ù)

Pietrek, MattÀÇ Microsoft Systems Journal, no. 11, "Under the Hood"(1996³â 11¿ù)



Microsoft Á¦Ç° °ü·Ã ±â¼ú Àü¹®°¡µé°ú ¿Â¶óÀÎÀ¸·Î Á¤º¸¸¦ ±³È¯ÇϽ÷Á¸é Microsoft ´º½º ±×·ì (http://support.microsoft.com/newsgroups/default.aspx) ¿¡ Âü¿©ÇϽñ⠹ٶø´Ï´Ù.

º» ¹®¼­ÀÇ Á¤º¸´Â ´ÙÀ½ÀÇ Á¦Ç°¿¡ Àû¿ëµË´Ï´Ù.
  • Microsoft Win32 Application Programming Interface?À»(¸¦) ´ÙÀ½°ú ÇÔ²² »ç¿ëÇßÀ» ¶§
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Windows NT 4.0
    • Microsoft Windows 2000 Standard Edition
    • Microsoft Windows XP Professional
Ű¿öµå:?
kbhowto kbthread kbkernbase KB175030