Windows 시스템 프로그래밍:프로세스
52125 단어 systemprogrammingwindowscpp
프로세스는 현재 실행 중인 프로그램입니다.프로세스와 관련된 많은 정보를 볼 수 있기 때문에 시스템 단계에서 프로세스는 프로세스와 사용된 자원에 대한 모든 정보를 저장하는 데이터 구조입니다.
본문에서 다음과 같은 조작을 수행하는 프로그램을 만드는 방법을 보여 드리겠습니다
여기서 내가 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
수조에서 되돌아오는 바이트입니다.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에서 GetModuleBaseName과 Psapi.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;
}
}
생성 프로세스
CreateProcess의 processthreadsapi.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, 실행 가능한 경로를 인쇄할 수 있습니다.GetProcessImageFileNameW의 Psapi.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;
}
이 글을 읽어 주셔서 감사합니다.링크로 연락 주세요.Reference
이 문제에 관하여(Windows 시스템 프로그래밍:프로세스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tbhaxor/windows-system-programming-processes-1hg7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)