zoukankan      html  css  js  c++  java
  • Win32Snapshot(快照)

    http://baike.baidu.com/view/589425
    http://msdn.microsoft.com/en-us/library/ms686832(VS.85).aspx

    Snapshots are at the core of the tool help functions. A snapshot is a read-only copy of the current state of one or more of the following lists that reside in system memory: processes, threads, modules, and heaps.

    一枚举进程

    BOOL GetProcessList( )
    {
      HANDLE hProcessSnap;
      HANDLE hProcess;
      
      DWORD dwPriorityClass;
    
      // Take a snapshot of all processes in the system.
      hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
      if( hProcessSnap == INVALID_HANDLE_VALUE )
      {
        printError( TEXT("CreateToolhelp32Snapshot (of processes)") );
        return( FALSE );
      }
      PROCESSENTRY32 pe32;
      pe32.dwSize = sizeof( PROCESSENTRY32 );
      // Retrieve information about the first process,
      // and exit if unsuccessful
      if(!Process32First( hProcessSnap, &pe32 ) )
      {
        printError( TEXT("Process32First") ); // show cause of failure
        CloseHandle( hProcessSnap );          // clean the snapshot object
        return( FALSE );
      }
      int i=0;
      // Now walk the snapshot of processes, and
      // display information about each process in turn
      do
      {
        _tprintf( TEXT("\nPROCESS NAME:  %s"), pe32.szExeFile );
        printf( "\n-----------------------------------------------------" );
        //ListProcessThreads( pe32.th32ProcessID );
        //ListProcessModules( pe32.th32ProcessID );
      } while( Process32Next( hProcessSnap, &pe32 ) );
      CloseHandle( hProcessSnap );
      return( TRUE );
    }
    

    二.枚举进程中的线程

    BOOL ListProcessThreads( DWORD dwOwnerPID ) 
    { 
      HANDLE hThreadSnap = INVALID_HANDLE_VALUE; 
      THREADENTRY32 te32; 
     
      // Take a snapshot of all running threads  
      hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); 
      if( hThreadSnap == INVALID_HANDLE_VALUE ) 
        return( FALSE ); 
     
      // Fill in the size of the structure before using it. 
      te32.dwSize = sizeof(THREADENTRY32); 
     
      // Retrieve information about the first thread,
      // and exit if unsuccessful
      if( !Thread32First( hThreadSnap, &te32 ) ) 
      {
        printError( TEXT("Thread32First") ); // show cause of failure
        CloseHandle( hThreadSnap );          // clean the snapshot object
        return( FALSE );
      }
    
      do 
      { 
        if( te32.th32OwnerProcessID == dwOwnerPID )
        {
          printf( "\n\n     THREAD ID      = 0x%08X", te32.th32ThreadID ); 
          printf( "\n     Base priority  = %d", te32.tpBasePri ); 
          printf( "\n     Delta priority = %d", te32.tpDeltaPri ); 
        }
      } while( Thread32Next(hThreadSnap, &te32 ) ); 
    
      CloseHandle( hThreadSnap );
      return( TRUE );
    }
    

    三.枚举模块信息

    BOOL ListProcessModules( DWORD dwPID )
    {
      HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
      MODULEENTRY32 me32;
    
      // Take a snapshot of all modules in the specified process.
      hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
      if( hModuleSnap == INVALID_HANDLE_VALUE )
      {
        printError( TEXT("CreateToolhelp32Snapshot (of modules)") );
        return( FALSE );
      }
    
      // Set the size of the structure before using it.
      me32.dwSize = sizeof( MODULEENTRY32 );
    
      // Retrieve information about the first module,
      // and exit if unsuccessful
      if( !Module32First( hModuleSnap, &me32 ) )
      {
        printError( TEXT("Module32First") );  // show cause of failure
        CloseHandle( hModuleSnap );           // clean the snapshot object
        return( FALSE );
      }
    
      // Now walk the module list of the process,
      // and display information about each module
      do
      {
        _tprintf( TEXT("\n\n     MODULE NAME:     %s"),   me32.szModule );
        _tprintf( TEXT("\n     Executable     = %s"),     me32.szExePath );
        printf( "\n     Process ID     = 0x%08X",         me32.th32ProcessID );
        printf( "\n     Ref count (g)  = 0x%04X",     me32.GlblcntUsage );
        printf( "\n     Ref count (p)  = 0x%04X",     me32.ProccntUsage );
        printf( "\n     Base address   = 0x%08X", (DWORD) me32.modBaseAddr );
        printf( "\n     Base size      = %d",             me32.modBaseSize );
    
      } while( Module32Next( hModuleSnap, &me32 ) );
    
      CloseHandle( hModuleSnap );
      return( TRUE );
    }
    

    参考:http://www.cnblogs.com/carekee/articles/1948288.html

    使用EnumProcesses函数枚举进程

    要记得引用lib文件

    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <psapi.h>
    #pragma comment(lib,"Psapi.lib ")
    void PrintProcessNameAndID( DWORD processID )
    {
        TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
        // Get a handle to the process.
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
            PROCESS_VM_READ,
            FALSE, processID );
        
        // Get the process name.
        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;
    
            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
                &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName, 
                    sizeof(szProcessName)/sizeof(TCHAR) );
            }
        }
    
        // Print the process name and identifier.
        _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );
    
        CloseHandle( hProcess );
    }
    
    void main( )
    {
        // Get the list of process identifiers.
    
        DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i;
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
            return;
    
        // Calculate how many process identifiers were returned.
        cProcesses = cbNeeded / sizeof(DWORD);
        // Print the name and process identifier for each process.
        for ( i = 0; i < cProcesses; i++ )
            if( aProcesses[i] != 0 )
            {
                PrintProcessNameAndID( aProcesses[i] );
            }
    }
    
  • 相关阅读:
    Git :版本控制工具进阶
    Git 提交本地代码
    Git创建代码仓库
    Git
    SQLlite数据库的增删改查
    Android学习第十天
    Android学习第九天
    Android学习第八天
    Android学习第七天
    【k8s】Deployment
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2050554.html
Copyright © 2011-2022 走看看