1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#include <iostream>
#define _WIN32_WINNT 0x05010000
#include <windows.h>
#include <winbase.h>
void pause()
{
std::cin.sync();
std::cout << "\nPAUSED\n";
std::cin.ignore();
}
int main()
{
TCHAR ProcName[] = "Notepad.exe";
TCHAR ProcName2[] = "calc.exe";
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
PROCESS_INFORMATION pi2;
ZeroMemory(&pi2, sizeof(pi));
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
STARTUPINFO si2;
ZeroMemory(&si2, sizeof(si2));
si2.cb = sizeof(si2);
HANDLE Jobject = CreateJobObject(NULL, "Job");
JOBOBJECT_EXTENDED_LIMIT_INFORMATION JBLI;
try
{
if(Jobject == NULL)
{
throw "COULD NOT CREATE JOB OBJECT:";
}
if(!AssignProcessToJobObject(Jobject, OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId())))
{
throw "COULD NOT ASSIGN SELF TO JOB OBJECT!:";
}
if(!QueryInformationJobObject(Jobject, JobObjectExtendedLimitInformation, &JBLI, sizeof(JBLI), NULL))
{
throw "COULD NOT QUERY JOB OBJECT INFORMATION CLASS!:";
}
JBLI.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_BREAKAWAY_OK;
if(!SetInformationJobObject(Jobject, JobObjectExtendedLimitInformation, &JBLI, sizeof(JBLI)))
{
throw "COULD NOT SET JOB OBJECT INFORMATION CLASS!:";
}
CreateProcess(NULL, ProcName, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if(!CreateProcess(NULL, ProcName2, NULL, NULL, FALSE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si2, &pi2))
{
throw "COULD NOT CREATE CHILD PROCESS!:";
}
std::cout << "Child Process ID: " << pi.dwProcessId << "\tThread ID: " << pi.dwThreadId << "\tHandle: " << pi.hProcess << "\n";
}
catch(char* Message)
{
std::cout << Message << " " << GetLastError() << "\n";
}
pause();
TerminateProcess(pi.hProcess, 1816);
TerminateProcess(pi2.hProcess, 1816);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(pi2.hThread);
CloseHandle(pi2.hProcess);
CloseHandle(Jobject);
return 0;
}
|