#if 0 #include "../../jlib/win32/process.h" using namespace jlib::win32; int main() { //printf("notepad exit code %d\n", daemon("notepad", true, true)); //printf("notepad process id %d\n", daemon("notepad", false, true)); printf("parent process id %d\n", getppid()); } #else #include <windows.h> #include <tlhelp32.h> #include <tchar.h> #include <locale.h> // Forward declarations: BOOL GetProcessList(); BOOL ListProcessModules(DWORD dwPID); BOOL ListProcessThreads(DWORD dwOwnerPID); void printError(const TCHAR* msg); int main(void) { setlocale(LC_ALL, ""); 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; hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwOwnerPID); 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(const 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); } #endif