none
能不能从用户进程获取系统进程的锁? RRS feed

  • 问题

  • 有进程A(系统进程)和进程B(用户进程),A和B用一个进程锁互斥,B能不能或得A的进程锁?

    谢谢。


    D
    2011年2月18日 9:30

答案

全部回复

  • 内核对象都是可以有名字的
    2011年2月18日 10:26
  • Hi sailuer

    请问您说的系统进程的锁,具体是指什么?

    另外如果您只是想在用户进程获取系统进程的具体信息可以用CreateToolhelp32Snapshot函数给系统内的所有进程拍一个快照 ,然后用Process32FirstProcess32Next遍历进程快照,轮流显示每个进程的信息 

    具体代码如下: 

    Copy
    #include <windows.h>
    #include <tlhelp32.h>
    #include <tchar.h>
    
    // Forward declarations:
    BOOL GetProcessList( );
    BOOL ListProcessModules( DWORD dwPID );
    BOOL ListProcessThreads( DWORD dwOwnerPID );
    void printError( TCHAR* msg );
    
    int main( void )
    {
     GetProcessList( );
     return 0;
    }
    
    BOOL GetProcessList( )
    {
     HANDLE hProcessSnap;
     HANDLE hProcess;
     PROCESSENTRY32 pe32;
     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 );
     }
    
     // Set the size of the structure before using it.
     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 );
     }
    
     // Now walk the snapshot of processes, and
     // display information about each process in turn
     do
     {
     _tprintf( TEXT("\n\n=====================================================" ));
     _tprintf( TEXT("\nPROCESS NAME: %s"), pe32.szExeFile );
     _tprintf( TEXT("\n-------------------------------------------------------" ));
    
     // Retrieve the priority class.
     dwPriorityClass = 0;
     hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
     if( hProcess == NULL )
      printError( TEXT("OpenProcess") );
     else
     {
      dwPriorityClass = GetPriorityClass( hProcess );
      if( !dwPriorityClass )
      printError( TEXT("GetPriorityClass") );
      CloseHandle( hProcess );
     }
    
     _tprintf( TEXT("\n Process ID  = 0x%08X"), pe32.th32ProcessID );
     _tprintf( TEXT("\n Thread count  = %d"), pe32.cntThreads );
     _tprintf( TEXT("\n Parent process ID = 0x%08X"), pe32.th32ParentProcessID );
     _tprintf( TEXT("\n Priority base  = %d"), pe32.pcPriClassBase );
     if( dwPriorityClass )
      _tprintf( TEXT("\n Priority class = %d"), dwPriorityClass );
    
     // List the modules and threads associated with this process
     ListProcessModules( pe32.th32ProcessID );
     ListProcessThreads( pe32.th32ProcessID );
    
     } while( Process32Next( hProcessSnap, &pe32 ) );
    
     CloseHandle( hProcessSnap );
     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 );
     _tprintf( TEXT("\n  Process ID  = 0x%08X"),   me32.th32ProcessID );
     _tprintf( TEXT("\n  Ref count (g) = 0x%04X"),  me32.GlblcntUsage );
     _tprintf( TEXT("\n  Ref count (p) = 0x%04X"),  me32.ProccntUsage );
     _tprintf( TEXT("\n  Base address = 0x%08X"), (DWORD) me32.modBaseAddr );
     _tprintf( TEXT("\n  Base size  = %d"),    me32.modBaseSize );
    
     } while( Module32Next( hModuleSnap, &me32 ) );
    
     CloseHandle( hModuleSnap );
     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 );
     }
    
     // Now walk the thread list of the system,
     // and display information about each thread
     // associated with the specified process
     do 
     { 
     if( te32.th32OwnerProcessID == dwOwnerPID )
     {
      _tprintf( TEXT("\n\n  THREAD ID  = 0x%08X"), te32.th32ThreadID ); 
      _tprintf( TEXT("\n  Base priority = %d"), te32.tpBasePri ); 
      _tprintf( TEXT("\n  Delta priority = %d"), te32.tpDeltaPri ); 
      _tprintf( TEXT("\n"));
     }
     } while( Thread32Next(hThreadSnap, &te32 ) ); 
    
     CloseHandle( hThreadSnap );
     return( TRUE );
    }
    
    void printError( TCHAR* msg )
    {
     DWORD eNum;
     TCHAR sysMsg[256];
     TCHAR* p;
    
     eNum = GetLastError( );
     FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
       NULL, eNum,
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
       sysMsg, 256, NULL );
    
     // Trim the end of the line and terminate it with a null
     p = sysMsg;
     while( ( *p > 31 ) || ( *p == 9 ) )
     ++p;
     do { *p-- = 0; } while( ( p >= sysMsg ) &&
           ( ( *p == '.' ) || ( *p < 33 ) ) );
    
     // Display the message
     _tprintf( TEXT("\n WARNING: %s failed with error %d (%s)"), msg, eNum, sysMsg );
    }
    
    
    
    

     

    如果您的问题解决了,请把有用的回答标记为答案!

    谢谢,

    Lucy

     


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年2月24日 10:13
    版主
  • Hi sailuer,

    经过我们进一步的研究,关于

    >>有进程A(系统进程)和进程B(用户进程),A和B用一个进程锁互斥,B能不能或得A的进程锁?

    是可以的,就像heroboy所说的,内核对象都可以有名字的。我们只需要给事件适当的命名。

    请看以下链接:

    http://msdn.microsoft.com/en-us/library/aa382954(v=VS.85).aspx

     

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年3月2日 2:39
    版主