enumprocesses.cpp
上传用户:leon2013
上传日期:2007-01-10
资源大小:186k
文件大小:10k
源码类别:

杀毒

开发平台:

Visual C++

  1.    /*********************
  2.    EnumProc.c (or .cpp)
  3.    *********************/ 
  4.    #include "EnumProcesses.h"
  5.    #include <tlhelp32.h>
  6.    #include <vdmdbg.h>
  7.    typedef struct
  8.    {
  9.       DWORD          dwPID ;
  10.       PROCENUMPROC   lpProc ;
  11.       DWORD          lParam ;
  12.       BOOL           bEnd ;
  13.    } EnumInfoStruct ;
  14.    BOOL WINAPI Enum16( DWORD dwThreadId, WORD hMod16, WORD hTask16,
  15.       PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined ) ;
  16.    // The EnumProcs function takes a pointer to a callback function
  17.    // that will be called once per process in the system providing
  18.    // process EXE filename and process ID.
  19.    // Callback function definition:
  20.    // BOOL CALLBACK Proc( DWORD dw, LPCSTR lpstr, LPARAM lParam ) ;
  21.    // 
  22.    // lpProc -- Address of callback routine.
  23.    // 
  24.    // lParam -- A user-defined LPARAM value to be passed to
  25.    //           the callback routine.
  26.    BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam )
  27.    {
  28.       OSVERSIONINFO  osver ;
  29.       HINSTANCE      hInstLib ;
  30.       HINSTANCE      hInstLib2 ;
  31.       HANDLE         hSnapShot ;
  32.       PROCESSENTRY32 procentry ;
  33.       BOOL           bFlag ;
  34.       LPDWORD        lpdwPIDs ;
  35.       DWORD          dwSize, dwSize2, dwIndex ;
  36.       HMODULE        hMod ;
  37.       HANDLE         hProcess ;
  38.       char           szFileName[ MAX_PATH ] ;
  39.       EnumInfoStruct sInfo ;
  40.       // ToolHelp Function Pointers.
  41.       HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD,DWORD) ;
  42.       BOOL (WINAPI *lpfProcess32First)(HANDLE,LPPROCESSENTRY32) ;
  43.       BOOL (WINAPI *lpfProcess32Next)(HANDLE,LPPROCESSENTRY32) ;
  44.       // PSAPI Function Pointers.
  45.       BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
  46.       BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *,
  47.          DWORD, LPDWORD );
  48.       DWORD (WINAPI *lpfGetModuleFileNameEx)( HANDLE, HMODULE,
  49.          LPTSTR, DWORD );
  50.       // VDMDBG Function Pointers.
  51.       INT (WINAPI *lpfVDMEnumTaskWOWEx)( DWORD,
  52.          TASKENUMPROCEX  fp, LPARAM );
  53.       // Check to see if were running under Windows95 or
  54.       // Windows NT.
  55.       osver.dwOSVersionInfoSize = sizeof( osver ) ;
  56.       if( !GetVersionEx( &osver ) )
  57.       {
  58.          return FALSE ;
  59.       }
  60.       // If Windows NT:
  61.       if( osver.dwPlatformId == VER_PLATFORM_WIN32_NT )
  62.       {
  63.          // Load library and get the procedures explicitly. We do
  64.          // this so that we don't have to worry about modules using
  65.          // this code failing to load under Windows 95, because
  66.          // it can't resolve references to the PSAPI.DLL.
  67.          hInstLib = LoadLibraryA( "PSAPI.DLL" ) ;
  68.          if( hInstLib == NULL )
  69.             return FALSE ;
  70.          hInstLib2 = LoadLibraryA( "VDMDBG.DLL" ) ;
  71.          if( hInstLib2 == NULL )
  72.             return FALSE ;
  73.          // Get procedure addresses.
  74.          lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))
  75.             GetProcAddress( hInstLib, "EnumProcesses" ) ;
  76.          lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,
  77.             DWORD, LPDWORD)) GetProcAddress( hInstLib,
  78.             "EnumProcessModules" ) ;
  79.          lpfGetModuleFileNameEx =(DWORD (WINAPI *)(HANDLE, HMODULE,
  80.             LPTSTR, DWORD )) GetProcAddress( hInstLib,
  81.             "GetModuleFileNameExA" ) ;
  82.          lpfVDMEnumTaskWOWEx =(INT(WINAPI *)( DWORD, TASKENUMPROCEX,
  83.             LPARAM))GetProcAddress( hInstLib2, "VDMEnumTaskWOWEx" );
  84.          if( lpfEnumProcesses == NULL ||
  85.             lpfEnumProcessModules == NULL ||
  86.             lpfGetModuleFileNameEx == NULL ||
  87.             lpfVDMEnumTaskWOWEx == NULL)
  88.             {
  89.                FreeLibrary( hInstLib ) ;
  90.                FreeLibrary( hInstLib2 ) ;
  91.                return FALSE ;
  92.             }
  93.          // Call the PSAPI function EnumProcesses to get all of the
  94.          // ProcID's currently in the system.
  95.          // NOTE: In the documentation, the third parameter of
  96.          // EnumProcesses is named cbNeeded, which implies that you
  97.          // can call the function once to find out how much space to
  98.          // allocate for a buffer and again to fill the buffer.
  99.          // This is not the case. The cbNeeded parameter returns
  100.          // the number of PIDs returned, so if your buffer size is
  101.          // zero cbNeeded returns zero.
  102.          // NOTE: The "HeapAlloc" loop here ensures that we
  103.          // actually allocate a buffer large enough for all the
  104.          // PIDs in the system.
  105.          dwSize2 = 256 * sizeof( DWORD ) ;
  106.          lpdwPIDs = NULL ;
  107.          do
  108.          {
  109.             if( lpdwPIDs )
  110.             {
  111.                HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ;
  112.                dwSize2 *= 2 ;
  113.             }
  114.             lpdwPIDs = (LPDWORD)HeapAlloc( GetProcessHeap(), 0, dwSize2 );
  115.             if( lpdwPIDs == NULL )
  116.             {
  117.                FreeLibrary( hInstLib ) ;
  118.                FreeLibrary( hInstLib2 ) ;
  119.                return FALSE ;
  120.             }
  121.             if( !lpfEnumProcesses( lpdwPIDs, dwSize2, &dwSize ) )
  122.             {
  123.                HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ;
  124.                FreeLibrary( hInstLib ) ;
  125.                FreeLibrary( hInstLib2 ) ;
  126.                return FALSE ;
  127.             }
  128.          }while( dwSize == dwSize2 ) ;
  129.          // How many ProcID's did we get?
  130.          dwSize /= sizeof( DWORD ) ;
  131.          // Loop through each ProcID.
  132.          for( dwIndex = 0 ; dwIndex < dwSize ; dwIndex++ )
  133.          {
  134.             szFileName[0] = 0 ;
  135.             // Open the process (if we can... security does not
  136.             // permit every process in the system).
  137.             hProcess = OpenProcess(
  138.                PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
  139.                FALSE, lpdwPIDs[ dwIndex ] ) ;
  140.             if( hProcess != NULL )
  141.             {
  142.                // Here we call EnumProcessModules to get only the
  143.                // first module in the process this is important,
  144.                // because this will be the .EXE module for which we
  145.                // will retrieve the full path name in a second.
  146.                if( lpfEnumProcessModules( hProcess, &hMod,
  147.                   sizeof( hMod ), &dwSize2 ) )
  148.                {
  149.                   // Get Full pathname:
  150.                   if( !lpfGetModuleFileNameEx( hProcess, hMod,
  151.                      szFileName, sizeof( szFileName ) ) )
  152.                   {
  153.                      szFileName[0] = 0 ;
  154.                     }
  155.                }
  156.                CloseHandle( hProcess ) ;
  157.             }
  158.             // Regardless of OpenProcess success or failure, we
  159.             // still call the enum func with the ProcID.
  160.             if(!lpProc( lpdwPIDs[dwIndex], 0, szFileName, lParam))
  161.                break ;
  162.             // Did we just bump into an NTVDM?
  163.             if( _stricmp( szFileName+(strlen(szFileName)-9),
  164.                "NTVDM.EXE")==0)
  165.             {
  166.                // Fill in some info for the 16-bit enum proc.
  167.                sInfo.dwPID = lpdwPIDs[dwIndex] ;
  168.                sInfo.lpProc = lpProc ;
  169.                sInfo.lParam = lParam ;
  170.                sInfo.bEnd = FALSE ;
  171.                // Enum the 16-bit stuff.
  172.                lpfVDMEnumTaskWOWEx( lpdwPIDs[dwIndex],
  173.                   (TASKENUMPROCEX) Enum16,
  174.                   (LPARAM) &sInfo);
  175.                // Did our main enum func say quit?
  176.                if(sInfo.bEnd)
  177.                   break ;
  178.             }
  179.          }
  180.          HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ;
  181.          FreeLibrary( hInstLib2 ) ;
  182.       // If Windows 95:
  183.       }else if( osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
  184.       {
  185.          hInstLib = LoadLibraryA( "Kernel32.DLL" ) ;
  186.          if( hInstLib == NULL )
  187.             return FALSE ;
  188.          // Get procedure addresses.
  189.          // We are linking to these functions of Kernel32
  190.          // explicitly, because otherwise a module using
  191.          // this code would fail to load under Windows NT,
  192.          // which does not have the Toolhelp32
  193.          // functions in the Kernel 32.
  194.          lpfCreateToolhelp32Snapshot=
  195.             (HANDLE(WINAPI *)(DWORD,DWORD))
  196.             GetProcAddress( hInstLib,
  197.             "CreateToolhelp32Snapshot" ) ;
  198.          lpfProcess32First=
  199.             (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
  200.             GetProcAddress( hInstLib, "Process32First" ) ;
  201.          lpfProcess32Next=
  202.             (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))
  203.             GetProcAddress( hInstLib, "Process32Next" ) ;
  204.          if( lpfProcess32Next == NULL ||
  205.             lpfProcess32First == NULL ||
  206.             lpfCreateToolhelp32Snapshot == NULL )
  207.          {
  208.             FreeLibrary( hInstLib ) ;
  209.             return FALSE ;
  210.          }
  211.          // Get a handle to a Toolhelp snapshot of the systems
  212.          // processes.
  213.          hSnapShot = lpfCreateToolhelp32Snapshot(
  214.             TH32CS_SNAPPROCESS, 0 ) ;
  215.          if( hSnapShot == INVALID_HANDLE_VALUE )
  216.          {
  217.             FreeLibrary( hInstLib ) ;
  218.             return FALSE ;
  219.          }
  220.          // Get the first process' information.
  221.          procentry.dwSize = sizeof(PROCESSENTRY32) ;
  222.          bFlag = lpfProcess32First( hSnapShot, &procentry ) ;
  223.          // While there are processes, keep looping.
  224.          while( bFlag )
  225.          {
  226.             // Call the enum func with the filename and ProcID.
  227.             if(lpProc( procentry.th32ProcessID, 0,
  228.                procentry.szExeFile, lParam ))
  229.             {
  230.                procentry.dwSize = sizeof(PROCESSENTRY32) ;
  231.                bFlag = lpfProcess32Next( hSnapShot, &procentry );
  232.             }else
  233.                bFlag = FALSE ;
  234.          }
  235.       }else
  236.          return FALSE ;
  237.       // Free the library.
  238.       FreeLibrary( hInstLib ) ;
  239.       return TRUE ;
  240.    }
  241.    BOOL WINAPI Enum16( DWORD dwThreadId, WORD hMod16, WORD hTask16,
  242.       PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined )
  243.    {
  244.       BOOL bRet ;
  245.       EnumInfoStruct *psInfo = (EnumInfoStruct *)lpUserDefined ;
  246.       bRet = psInfo->lpProc( psInfo->dwPID, hTask16, pszFileName,
  247.          psInfo->lParam ) ;
  248.       if(!bRet)
  249.       {
  250.          psInfo->bEnd = TRUE ;
  251.       }
  252.       return !bRet;
  253.    }