簡體   English   中英

C ++如何獲取當前的控制台主機進程

[英]c++ how do i get the current console conhost process

"how i get the conhost process" ,我已經搜索了很多網站,但實際上並不是我要找的東西。

我已經搜尋了。

而且我找不到任何有關"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

  • 作為@BladeMight注意到,在Win 7 的所有 conhost.exe過程是crss.exe的孩子(因為它也可以看到ProcExp)

輸出

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM