Windows 시스템 프로그래밍:프로세스

독자 여러분, 오늘 가장 재미있는 화제를 배울 것입니다.프로세스따라서 프로세스를 만들기 전에 프로세스를 알아야 합니다.
프로세스는 현재 실행 중인 프로그램입니다.프로세스와 관련된 많은 정보를 볼 수 있기 때문에 시스템 단계에서 프로세스는 프로세스와 사용된 자원에 대한 모든 정보를 저장하는 데이터 구조입니다.
본문에서 다음과 같은 조작을 수행하는 프로그램을 만드는 방법을 보여 드리겠습니다
  • 목록 프로세스
  • pid
  • 을 통해 압정처리
  • 생성 프로세스
  • 프로세스 세부 정보 얻기
  • 이 문장은 다른 문장보다 좀 길 것이다😃
    여기서 내가 tchar을 사용하는 것을 볼 수 있을 것이다.h와 wmain.지금부터 나는 광범위한 문자와char은 이른바 ANSI 함수족(A로 끝난다)에 사용되고, wchar_t은 새로운 유니코드(또는 넓이) 함수족(W로 끝난다)에 사용된다.

    프로세스 나열
    EnumProcesses 헤더 파일에 표시된 Psapi.h 함수를 사용하면 시스템의 모든 프로세스를 열거할 수 있습니다.
    BOOL EnumProcesses(
      DWORD   *lpidProcess,
      DWORD   cb,
      LPDWORD lpcbNeeded
    );
    
    함수 매개 변수

  • lpidProcess→ 수신 프로세스 ID 목록(일명 pid)
  • 배열에 대한 포인터

  • cb→ lpidProcess 배열의 크기는 바이트 단위입니다.

  • LPCBC 필요→ lpidProcess 수조에서 되돌아오는 바이트입니다.
  • 실행 중인 프로세스의 프로세스 ID는 lpidProcess에 표시됩니다.프로세스의 이름을 얻으려면 먼저 OpenProcess을 사용하여 프로세스를 열고 processthreadsapi.h에서 PROCESS_QUERY_INFORMATION | PROCESS_VM_READ 권한을 설명하고 모듈을 열거하며 마지막으로 기본 모듈의 이름을 획득해야 한다.이 기본 모듈은 프로세스의 이름을 포함합니다.
    HANDLE OpenProcess(
      DWORD dwDesiredAccess,
      BOOL  bInheritHandle,
      DWORD dwProcessId
    );
    
    함수 매개 변수

  • 희망 방문→ 프로세스 객체에 대한 액세스 권한입니다.이 매개변수는 process access rights 중 하나 이상일 수 있습니다.

  • 장원→ 이 값이 TRUE이면 프로세스에서 만든 프로세스는 핸들
  • 을 계승합니다

  • dwProcessId→ 열 로컬 프로세스의 식별자입니다.
  • 함수가 성공적으로 실행되면, 올바른 프로세스 핸들을 되돌려줍니다.
    실행 가능한 파일의 이름을 가져오려면 프로세스 모듈을 열거한 다음 기본 모듈 이름을 가져와야 합니다
    함수를 처리할 때 불러올 수 있는 프로세스 모듈을 프로세스 모듈이라고 합니다.그것은 .dll 또는 .exe일 수 있다.하나의 프로세스는 여러 모듈을 메모리에 불러올 수 있습니다.
    따라서 프로세스 이름을 얻으려면 EnumProcessModules에서 GetModuleBaseNamePsapi.h이 필요합니다.
    BOOL EnumProcessModules(
      HANDLE  hProcess,
      HMODULE *lphModule,
      DWORD   cb,
      LPDWORD lpcbNeeded
    );
    
    기능 매개 변수는 다음과 같다.

  • HProces→ 프로세스의 유효한 핸들입니다.

  • *LPH 모듈→ 모듈 핸들 목록을 수신하는 그룹입니다.

  • cb→ lphModule수 그룹의 크기, 바이트
  • 단위

  • LPCBC 필요→ lphModule 수조에 모든 모듈 핸들을 저장하는 데 필요한 바이트 수
  • DWORD GetMappedFileNameW(
      HANDLE hProcess,
      LPVOID lpv,
      LPWSTR lpFilename,
      DWORD  nSize
    );
    
    기능 매개 변수는 다음과 같다.

  • HProces→ 프로세스 처리 방법.PROCESS_QUERY_INFORMATION 액세스 권한 사용

  • lpv→ 검증할 모듈의 주소입니다.

  • 파일 이름→ lpv의 메모리 맵 파일 이름을 받는 버퍼를 가리키는 바늘입니다.

  • 은서택→ lpFilename 버퍼 크기입니다.
  • 그러므로 본문의 한 토막은 아래와 같다
    int ListProcesses() {
        DWORD processes[1024], cbNeeded, cbProcesses;
        // enumerating all processes
        // https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocesses
        BOOL procBool = EnumProcesses(processes, sizeof(processes), &cbNeeded);
        if (!procBool) {
            _tprintf(_T("Unable to fetch processes\n"));
            return 1;
        }
    
        cbProcesses = cbNeeded / sizeof(DWORD); // getting actual number of processes that function has returned
    
        _tprintf(_T("Total Processes: %d\n\n"), cbProcesses);
        for (int i = 0; i < cbProcesses; i++) {
            GetProcessNameById(processes[i]); // printing process name
        }
    
        return 0;
    }
    
    void GetProcessNameById(DWORD pId)
    {
        // TCHAR is same as WCHAR (wchar_t)
        TCHAR procName[MAX_PATH] = _T("<Unknown>");
    
        // opening the process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
        HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pId);
    
        // checking if process is opened
        // the processes running in same privilege will only be opened
        if (process != NULL) {
            HMODULE hMod;
            DWORD cbNeeded;
    
            // enumerating the process modules
            // https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocessmodules
            if (EnumProcessModules(process, &hMod, sizeof(hMod),
                &cbNeeded))
            {
                // getting module base name, which is the name of the process
                // https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmappedfilenamew
                GetModuleBaseName(process, hMod, procName,
                    sizeof(procName) / sizeof(TCHAR));
            }
        }
    
        // closing process handle
        // https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
        CloseHandle(process);
        _tprintf(_T("[%d] %s\n"), pId, procName);
    }
    
    많은 프로세스 (같은 사용자가 실행하는 프로세스라도) 의 이름이 <Unknown>인 것을 볼 수 있습니다.프로세스가 프로세스 메모리를 읽을 수 있는 권한이 없기 때문에 모든 모듈을 열거할 수 없습니다.
    그들의 이름을 읽으려면 현재 프로세스에 SeDebugPrivilege을 설정해야 합니다.

    PID를 통한 프로세스 종료
    작업 관리자에서 실행 중인 프로세스를 종료했을 수도 있습니다. 이 프로세스는 정체되었거나 파손되었을 수도 있습니다.따라서 프로그래밍을 통해 TerminateProcess에서 processthreadsapi.h에서 프로세스를 종료할 수 있습니다
    BOOL TerminateProcess(
      HANDLE hProcess,
      UINT   uExitCode
    );
    
    기능 매개 변수는 다음과 같다.

  • HProces→ PROCESS_TERMINATE 권한이 있는 프로세스 핸들

  • UEXIT 코드→ 이 호출로 종료된 프로세스와 루틴에 사용할 종료 코드입니다.
  • 이 과정을 중지하는 부분은 다음과 같다
    int KillProcess(DWORD pId) {
        // opening process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
        HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pId);
    
        if (hProc == NULL) {
            _tprintf(_T("Unable to open process %d\n"), pId);
            return 1;
        }
    
        // terminating the process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess
        BOOL tpBool = TerminateProcess(hProc, 2);  // exit the program with non zero return code
    
        if (!tpBool) {
            _tprintf(_T("Unable to kill the process %d\n"), pId);
            // closing process handle
            // https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
            CloseHandle(hProc);
            return 1;
        }
        else {
            _tprintf(_T("Killed Process %d\n"), pId);
            // closing process handle
            // https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
            CloseHandle(hProc);
            return 0;
        }
    }
    

    생성 프로세스
    CreateProcessprocessthreadsapi.h 함수에서 새 프로세스를 만듭니다. 이 프로세스는 생성 프로세스와 독립적으로 실행됩니다.그러나 간단하게 보기 위해 이런 관계를 부자관계라고 부른다.
    BOOL CreateProcessW(
      LPCWSTR               lpApplicationName,
      LPWSTR                lpCommandLine,
      LPSECURITY_ATTRIBUTES lpProcessAttributes,
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      BOOL                  bInheritHandles,
      DWORD                 dwCreationFlags,
      LPVOID                lpEnvironment,
      LPCWSTR               lpCurrentDirectory,
      LPSTARTUPINFOW        lpStartupInfo,
      LPPROCESS_INFORMATION lpProcessInformation
    );
    
    기능 매개 변수는 다음과 같다.

  • lpApplicationName→ 실행할 모듈의 이름입니다.이 모듈은 Windows 기반 응용 프로그램일 수 있습니다.그것은 다른 유형의 모듈일 수 있다.문자열은 실행할 모듈의 전체 경로와 파일 이름을 지정할 수 있습니다.NULL이면 모듈 이름은 lpCommandLine 문자열의 첫 번째 공백으로 구분된 태그여야 합니다.

  • lpCommandLine→ 실행할 명령줄입니다.이 문자열의 최대 길이는 32767문자이며, lpCommandLine의 모듈 이름 부분은 MAX_PATH문자로 제한됩니다.

  • lpProcessAttributes→ SECURITY_ATTRIBUTES 구조의 지침을 가리키며, 이 구조는 새 프로세스 대상의 반환 핸들을 하위 프로세스에서 계승할 수 있는지 확인합니다.NULL이면 프로세스 핸들을 상속할 수 없습니다.

  • lpThreadAttributes→ SECURITY_ATTRIBUTES 구조의 지침을 가리키며, 이 구조는 새로운 루틴 대상의 반환 핸들을 하위 프로세스에서 계승할 수 있는지 확인합니다.NULL이면 프로세스 핸들을 상속할 수 없습니다.

  • 빈리산수→ 이 매개 변수가 TRUE이면 호출 프로세스의 모든 계승 가능한 핸들이 새 프로세스에 계승됩니다.매개변수가 FALSE이면 핸들이
  • 을 상속하지 않습니다.

  • dwCreationFlags→ 우선 순위 클래스와 프로세스가 만든 로고를 제어합니다.값 목록은 Process Creation Flags을 참조하십시오.

  • lpEnvironment→ 새 프로세스의 환경 블록을 가리키는 지침입니다.이 매개 변수가 NULL이면 새 프로세스는 호출된 프로세스 환경을 사용합니다.

  • lpCurrentDirectory→ 프로세스 현재 디렉토리의 전체 경로입니다.이 인자가 NULL이면 새 프로세스는 호출 프로세스와 같은 현재 드라이브와 디렉터리를 가지고 있습니다.

  • lpStartupInfo→ STARTUPINFO 또는 STARTUPINFOEX 패브릭
  • 에 대한 포인터

  • lpProcessInformation→ PROCESS_INFORMATION 구조의 지침을 가리키며 이 구조는 새로운 프로세스에 대한 표지 정보를 받는다.
  • 그래서 이 장면이 이렇게 보여요.
    int _CreateProcess()
    {
        std::wstring path(L"C:\\Windows\\notepad.exe");
    
        STARTUPINFO si;
        si.cb = sizeof(si);
    
        PROCESS_INFORMATION pi;
    
        // initializing the variables
        ZeroMemory(&si, sizeof(si));
        ZeroMemory(&pi, sizeof(pi));
    
        BOOL cpBool = CreateProcessW(
            NULL, // creating an independent process
            &path[0], // passing in the path of the executable 
            NULL, // don't want the process handle to be inherited
            NULL, // don't want the thread handle to be inherited
            FALSE, // setting inheritance handle to false
            0x0, // normal creation flags
            NULL, // using parent process environment config
            NULL, // the new process will have the same current drive and directory as the calling process
            &si, // passing in the startup information
            &pi // passing in the process information
        );
    
        if (cpBool) {
            _tprintf(_T("Process Created: %d"), pi.dwProcessId);
        }
        else {
            _tprintf(_T("Unable to create process\n"));
            return 1;
        }
    
        return 0;
    }
    

    프로세스 세부 정보 가져오기
    프로세스 이름,pid, 실행 가능한 경로를 인쇄할 수 있습니다.GetProcessImageFileNameWPsapi.h 함수를 사용할 수 있습니다.
    DWORD GetProcessImageFileNameW(
      HANDLE hProcess,
      LPWSTR lpImageFileName,
      DWORD  nSize
    );
    
    기능 매개 변수 설명

  • HProces→ PROCESS_QUERY_INFORMATION 또는 PROCESS_QUERY_LIMITED_INFORMATION 액세스 권한을 가진
  • 프로세스의 핸들

  • lpImageFileName→ 실행 가능한 파일
  • 의 전체 경로를 받는 버퍼에 대한 포인터

  • 은서택→ lpImageFileName 버퍼 크기는 문자 단위입니다.
  • 함수가 성공하면 버퍼에 복사된 문자열의 길이를 되돌려줍니다.
    이 모듈의 코드 세션은
    int GetProcess(DWORD pId)
    {
        // opening process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
        HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pId);
    
        if (hProc == NULL || hProc == INVALID_HANDLE_VALUE)
        {
            _tprintf(_T("Unable to open process"));
            return 1;
        }
    
        // initializing the variable
        LPWSTR procName = (LPWSTR)malloc(MAX_PATH);
    
        // getting process name by id
        GetProcessNameById(pId);
    
        // get process executable path
        // https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getprocessimagefilenamew
        GetProcessImageFileNameW(hProc, &procName[0], MAX_PATH);
        _tprintf(_T("Executable Path: %s\n"), procName);
    
        // deallocate the variables
        free(procName);
        CloseHandle(hProc);
        return 0;
    }
    
    다음은 이 모든 완전한 코드입니다.
    #include <Windows.h>
    #include <tchar.h>
    #include <Psapi.h>
    #include <iostream>
    #include <processthreadsapi.h>
    #include <handleapi.h>
    
    /*
    Function prototypes
    */
    int ListProcesses();
    int KillProcess(DWORD pId);
    int _CreateProcess();
    int GetProcess(DWORD pId);
    void GetProcessNameById(DWORD pId);
    
    int wmain(int argc, WCHAR** argv) {
    
        int option;
        _tprintf(_T("1. list processes\n"));
        _tprintf(_T("2. kill process by pid\n"));
        _tprintf(_T("3. create process\n"));
        _tprintf(_T("4. get process details\n"));
        _tprintf(_T("> "));
        DWORD pid;
    
        std::wcin >> option; // use wcin when you want to get wide charaters
    
        switch (option) {
        case 1:
            return ListProcesses();
        case 2:
            _tprintf(_T("Enter Process PID: "));
            std::wcin >> pid;
            return KillProcess(pid);
            break;
        case 3:
            return _CreateProcess();
            break;
        case 4:
            _tprintf(_T("Enter Process PID: "));
            std::wcin >> pid;
            return GetProcess(pid);
            break;
        default:
            _tprintf(_T("Please select options 1 2 3 4 only\n"));
            return 1;
        }
    }
    
    int ListProcesses() {
        DWORD processes[1024], cbNeeded, cbProcesses;
        // enumerating all processes
        // https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocesses
        BOOL procBool = EnumProcesses(processes, sizeof(processes), &cbNeeded);
        if (!procBool) {
            _tprintf(_T("Unable to fetch processes\n"));
            return 1;
        }
    
        cbProcesses = cbNeeded / sizeof(DWORD); // getting actual number of processes that function has returned
    
        _tprintf(_T("Total Processes: %d\n\n"), cbProcesses);
        for (int i = 0; i < cbProcesses; i++) {
            GetProcessNameById(processes[i]); // printing process name
        }
    
        return 0;
    }
    
    void GetProcessNameById(DWORD pId)
    {
        // TCHAR is same as WCHAR (wchar_t)
        TCHAR procName[MAX_PATH] = _T("<Unknown>");
    
        // opening the process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
        HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pId);
    
        // checking if process is opened
        // the processes running in same privilege will only be opened
        if (process != NULL) {
            HMODULE hMod;
            DWORD cbNeeded;
    
            // enumerating the process modules
            // https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocessmodules
            if (EnumProcessModules(process, &hMod, sizeof(hMod),
                &cbNeeded))
            {
                // getting module base name, which is the name of the process
                // https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmappedfilenamew
                GetModuleBaseName(process, hMod, procName,
                    sizeof(procName) / sizeof(TCHAR));
            }
        }
    
        // closing process handle
        // https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
        CloseHandle(process);
        _tprintf(_T("[%d] %s\n"), pId, procName);
    }
    
    int KillProcess(DWORD pId) {
        // opening process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
        HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pId);
    
        if (hProc == NULL) {
            _tprintf(_T("Unable to open process %d\n"), pId);
            return 1;
        }
    
        // terminating the process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocess
        BOOL tpBool = TerminateProcess(hProc, 2);  // exit the program with non zero return code
    
        if (!tpBool) {
            _tprintf(_T("Unable to kill the process %d\n"), pId);
            // closing process handle
            // https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
            CloseHandle(hProc);
            return 1;
        }
        else {
            _tprintf(_T("Killed Process %d\n"), pId);
            // closing process handle
            // https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle
            CloseHandle(hProc);
            return 0;
        }
    }
    
    int _CreateProcess()
    {
        std::wstring path(L"C:\\Windows\\notepad.exe");
    
        STARTUPINFO si;
        si.cb = sizeof(si);
    
        PROCESS_INFORMATION pi;
    
        // initializing the variables
        // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366920(v=vs.85)
        ZeroMemory(&si, sizeof(si));
        ZeroMemory(&pi, sizeof(pi));
    
        // creating process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw
        BOOL cpBool = CreateProcessW(
            NULL, // creating an independent process
            &path[0], // passing in the path of the executable 
            NULL, // don't want the process handle to be inherited
            NULL, // don't want the thread handle to be inherited
            FALSE, // setting inheritance handle to false
            0x0, // normal creation flags
            NULL, // using parent process environment config
            NULL, // the new process will have the same current drive and directory as the calling process
            &si, // passing in the startup information
            &pi // passing in the process information
        );
    
        if (cpBool) {
            _tprintf(_T("Process Created: %d"), pi.dwProcessId);
        }
        else {
            _tprintf(_T("Unable to create process\n"));
            return 1;
        }
    
        return 0;
    }
    
    int GetProcess(DWORD pId)
    {
        // opening process
        // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
        HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pId);
    
        if (hProc == NULL || hProc == INVALID_HANDLE_VALUE)
        {
            _tprintf(_T("Unable to open process"));
            return 1;
        }
    
        // initializing the variable
        LPWSTR procName = (LPWSTR)malloc(MAX_PATH);
    
        // getting process name by id
        GetProcessNameById(pId);
    
        // get process executable path
        // https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getprocessimagefilenamew
        GetProcessImageFileNameW(hProc, &procName[0], MAX_PATH);
        _tprintf(_T("Executable Path: %s\n"), procName);
    
        // deallocate the variables
        free(procName);
        CloseHandle(hProc);
        return 0;
    }
    
    이 글을 읽어 주셔서 감사합니다.링크로 연락 주세요.
  • 이메일: [email protected]
  • 트위터:
  • Facebook:@tbhaxor
  • GitHub:@tbhaxor
  • 영국:
  • Instagram:
  • 좋은 웹페이지 즐겨찾기