![](/img/trans.png)
[英]How do I get the current size of the heap memory of a process in Linux using C/C++ system calls?
[英]c++ how do i get the current console conhost process
在"how i get the conhost process"
,我已經搜索了很多網站,但實際上並不是我要找的東西。
我已經搜尋了。
superuser/stackoverflow
堆棧溢出 stackoverflow
如何win32進程獲取其父代的pid stackoverflow
C如何獲取父進程ID stackoverflow
C如何確定是否正在運行Windows進程 stackoverflow
獲取完整的運行過程列表Visual C stackoverflow
MS-C-GET-PID-的電流處理 stackoverflow
獲取當前正在處理的具有其引用計數的dll列表 codeproject
Get-Parent-Process-PID cplusplus
獲取正在運行的進程的列表 msdn.microsoft
GetModuleFileNameEx msdn.microsoft
GetModuleFileName msdn.microsoft
GetCurrentProcessId msdn.microsoft
GetProcessId msdn.microsoft
GetModuleHandle msdn.microsoft
GetConsoleWindow msdn.microsoft
工具幫助 msdn.microsoft
CreateToolhelp32Snapshot msdn.microsoft
NextModule32 msdn.microsoft
DebugActiveProcess msdn.microsoft
枚舉進程的所有模塊 而且我找不到任何有關"how to get the conhost process"
。
我有一些適用於當前"cmd.exe / program.exe"
代碼,並且為我提供了"PID, NAME, PATH, READ/WRITE ADDRESS"
。
我可以獲取parent
進程,但不是conhost.exe
。
代碼"need to link library 'psapi' first"
:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <psapi.h>
#include <iostream>
#include <tlhelp32.h>
int PrintModules(DWORD processID) {
HMODULE hMods[1024];
HANDLE hProcess;
DWORD cbNeeded;
unsigned int i;
printf( "\nProcess ID: %u\n", processID);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
if(NULL == hProcess) return 1;
if(EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) {
for(i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
TCHAR szModName[MAX_PATH];
if(GetModuleFileNameEx(hProcess, hMods[i], szModName,sizeof(szModName) / sizeof(TCHAR))) {
_tprintf( TEXT(" %s (0x%08X)\n"), szModName, hMods[i]);
}
}
}
CloseHandle(hProcess);
return 0;
}
int main(void) {
DWORD cpid = GetCurrentProcessId();
PrintModules(cpid);
int ppid = -1;
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe = { 0 };
pe.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(h, &pe)) {
do {
if(pe.th32ProcessID == cpid) {
printf("PID: %i; PPID: %i\n", cpid, pe.th32ParentProcessID);
ppid = pe.th32ParentProcessID;
}
} while(Process32Next(h, &pe));
}
PrintModules(ppid);
CloseHandle(h);
std::cin.get();
return 0;
}
而且我想不出一種方法來獲取當前的conhost
程序。
當您打開使用控制台的program
,將創建一個conhost.exe
進程。 我的問題是我如何獲得conhost.exe
進程...
謝謝! :)
我想到的一種方法是獲取CMD.EXE進程的開始時間。 然后遍歷所有CONHOST進程以尋找相同(或非常接近)的開始時間。
作為概念驗證,請下載並安裝Process Explorer。 在ProcExp中找到您的CMD.EXE進程,然后查看“屬性”,“圖像”選項卡。 注意開始時間。 然后遍歷每個CONHOST進程,尋找同時啟動的進程。
請注意,ProcExp顯示1秒的分辨率,但是ProcExp使用的任何基礎API都可能具有更好的分辨率。
您可能需要在Google上搜索一些信息,以了解ProcExp使用什么API來收集流程開始時間。 此外,您可以使用多種工具查看可執行文件(在這種情況下為ProcExp)導入的API。 您也許可以從ProcExp導入的API名稱中推斷出將提供進程開始時間的API。
如果您仍然需要它(在閱讀注釋之后),這是一段獲取conhost.exe進程的代碼。 請注意,我僅出於說明目的而編寫它(以檢查[MSDN]:工具幫助功能是否可用於這種情況),所以不要介意其結構或其他編碼NO-NO 。
code.c :
#include <Windows.h>
#include <TlHelp32.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
int main(int argc, char **argv) {
DWORD pid = 0, i = 0, cPid = 0;
PROCESSENTRY32 pe32;
BOOL res = FALSE;
HANDLE snap = INVALID_HANDLE_VALUE, proc = INVALID_HANDLE_VALUE;
char c = 0;
if (argc > 1) {
pid = atoi(argv[1]);
} else {
pid = GetCurrentProcessId();
}
printf("PID: %d\n", pid);
snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, pid);
if (snap == INVALID_HANDLE_VALUE) {
printf("CreateToolhelp32Snapshot failed: %d\n", GetLastError());
return -1;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
res = Process32First(snap, &pe32);
if (res == FALSE) {
printf("Process32First failed: %d\n", GetLastError());
CloseHandle(snap);
return -2;
}
do {
if (_tcscmp(pe32.szExeFile, TEXT("conhost.exe")) == 0) {
_tprintf(TEXT(" Idx: %02d PID: %5d PPID: %5d Name: %s\n"), i++, pe32.th32ProcessID, pe32.th32ParentProcessID, pe32.szExeFile);
if (pe32.th32ParentProcessID == pid) {
cPid = pe32.th32ProcessID;
}
}
} while ((res = Process32Next(snap, &pe32)));
CloseHandle(snap);
if ((proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, cPid)) == INVALID_HANDLE_VALUE) {
printf("OpenProcess failed: %d\n", GetLastError());
return -3;
}
printf("Conhost handle: 0x%08X\n", proc);
CloseHandle(proc);
printf("Press a key to exit...\n");
c = getch();
return 0;
}
輸出 (作為Win 10上的VStudio 2010 控制台應用程序 ( Debug-x86 )):
e:\\Work\\Dev\\StackOverflow\\q035102238>ver Microsoft Windows [Version 10.0.17134.48] e:\\Work\\Dev\\StackOverflow\\q035102238>"Debug\\q035102238.exe" PID: 22388 Idx: 00 PID: 19892 PPID: 20164 Name: conhost.exe Idx: 01 PID: 21128 PPID: 21120 Name: conhost.exe Idx: 02 PID: 1144 PPID: 20572 Name: conhost.exe Idx: 03 PID: 8184 PPID: 19572 Name: conhost.exe Idx: 04 PID: 10976 PPID: 20608 Name: conhost.exe Idx: 05 PID: 21284 PPID: 8792 Name: conhost.exe Idx: 06 PID: 8172 PPID: 20444 Name: conhost.exe Idx: 07 PID: 4396 PPID: 19484 Name: conhost.exe Idx: 08 PID: 12484 PPID: 2580 Name: conhost.exe Idx: 09 PID: 18636 PPID: 11552 Name: conhost.exe Idx: 10 PID: 21456 PPID: 21016 Name: conhost.exe Idx: 11 PID: 960 PPID: 3528 Name: conhost.exe Idx: 12 PID: 20616 PPID: 18404 Name: conhost.exe Idx: 13 PID: 21548 PPID: 21528 Name: conhost.exe Idx: 14 PID: 20192 PPID: 8316 Name: conhost.exe Idx: 15 PID: 2496 PPID: 9284 Name: conhost.exe Idx: 16 PID: 5820 PPID: 23140 Name: conhost.exe Idx: 17 PID: 6032 PPID: 26512 Name: conhost.exe Connhost handle: 0x00000000 Press a key to exit...
因此,可以枚舉所有正在運行的conhost.exe進程,並且還可以將PROCESS_ALL_ACCESS
授予與當前應用程序相關聯的PROCESS_ALL_ACCESS
(我必須在此提及,我的Win用戶具有完全的管理特權)。
@ EDIT0 :
輸出 :
c:\\Work\\Dev\\StackOverflow\\q035102238>ver Microsoft Windows [Version 6.1.7601] c:\\Work\\Dev\\StackOverflow\\q035102238>q035102238.exe PID: 1548 Idx: 00 PID: 4960 PPID: 3472 Name: conhost.exe Idx: 01 PID: 5024 PPID: 3472 Name: conhost.exe Idx: 02 PID: 5076 PPID: 3472 Name: conhost.exe Idx: 03 PID: 2676 PPID: 3472 Name: conhost.exe Idx: 04 PID: 1888 PPID: 3472 Name: conhost.exe Connhost handle: 0x00000000 Press a key to exit...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.