// WndProcInfo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define _WIN32_WINNT 0x0500
#include "windows.h"
#include "conio.h"
#include "../psapi/psapi.h"
#pragma comment(lib,"../psapi/psapi.lib");
void EnvVariable(LPSTR pszVar){
//设置指定的变量的值
SetEnvironmentVariable(pszVar,"C:\\");
char szValue[1024]={0};
GetEnvironmentVariable(pszVar,szValue,1024);
printf("%s,%s\n",pszVar,szValue);
}
void ProcModule(){
HANDLE hProc=GetCurrentProcess();
HMODULE hModules[256]={0};
DWORD nNeed=0;
EnumProcessModules(hProc,hModules,256,&nNeed);
//计算句柄的数量
DWORD nCount=nNeed/sizeof(HMODULE);
//循环输出句柄
for(DWORD nIndex=0;nIndex<nCount;nIndex++){
//获取模块的路径信息
char szPath[MAX_PATH]={0};
GetModuleFileNameEx(hProc,hModules[nIndex],szPath,MAX_PATH);
printf("%d:%p %s\n",nIndex+1,hModules[nIndex],szPath);
}
}
void ProcInfo(){
DWORD nID=GetCurrentProcessId();
//这里只能获取到一个伪句柄 -1 想要获取当前进程的实际句柄还得用
//OpenProcess
HANDLE hProc=GetCurrentProcess();
printf("Process ID:%d\n",nID);
printf("Process Handle:%p\n",hProc);
//实际句柄
hProc=OpenProcess(PROCESS_ALL_ACCESS,false,nID);
printf("Process Handle:%p \n",hProc);
}
void EnvString(){
//获取系统所有进程环境信息
LPSTR pszEnv=(LPSTR)GetEnvironmentStrings();
LPSTR pszTmp=pszEnv;
while(0!=pszTmp[0])
{
printf("%s\n",pszTmp);
pszTmp=strlen(pszTmp)+1+pszTmp;
}
FreeEnvironmentStrings(pszEnv);
}
void Create(){
STARTUPINFO si={0};
//设置子进程窗体大小
si.cb=sizeof(si);
si.dwFlags=STARTF_USESIZE;
si.dwXSize=200;
si.dwYSize=200;
PROCESS_INFORMATION pi={0};
//如果创建的也是控制台输出程序那么它会显示在当前控制台输出,第二个参数是打开程序的传入值
//如果不想向上面那样CREATE_NEW_CONSOLE这个可以新建一个控制台
CreateProcess("E:\\C++Temp\\test2\\Debug\\test2.exe","\"hello word\"",NULL,NULL,false,0,NULL,NULL,
&si,&pi);
//输出进程线程的ID等信息
printf("Process Handle:%p\n",pi.hProcess);
printf("Process ID:%d\n",pi.dwProcessId);
printf("Thread Handle:%p\n",pi.hThread);
printf("Thread ID:%d\n",pi.dwThreadId);
}
void Wait(){
STARTUPINFO si={0};
//设置子进程窗体大小
si.cb=sizeof(si);
PROCESS_INFORMATION pi={0};
//如果创建的也是控制台输出程序那么它会显示在当前控制台输出,第二个参数是打开程序的传入值
//如果不想向上面那样CREATE_NEW_CONSOLE这个可以新建一个控制台
CreateProcess("C:\\windows\\system32\\winmine.exe","\"hello word\"",NULL,NULL,false,0,NULL,NULL,
&si,&pi);
//输出进程线程的ID等信息
printf("Winmine is running\n");
//等候 前一个句柄发来消息 第二个参数是等候时间
WaitForSingleObject(pi.hProcess,INFINITE);
printf("Winmine is Stop\n");
}
void Terminate(DWORD dwProcID){
HANDLE hProc=OpenProcess(PROCESS_ALL_ACCESS,false,dwProcID);
TerminateProcess(hProc,0);
}
HANDLE CreateWs(LPSTR pszPath){
STARTUPINFO si={0};
si.cb=sizeof(si);
PROCESS_INFORMATION pi={0};
CreateProcess(pszPath,NULL,NULL,NULL,false,0,NULL,NULL,
&si,&pi);
return pi.hProcess;
}
void Job( ){
HANDLE hJob=CreateJobObject(NULL,"MyJob");
JOBOBJECT_BASIC_UI_RESTRICTIONS ui={0};
//限制他不能COPY 等,也可以修改其他的话也可以拥有不同的权限
ui.UIRestrictionsClass=JOB_OBJECT_UILIMIT_READCLIPBOARD|
JOB_OBJECT_UILIMIT_WRITECLIPBOARD;
SetInformationJobObject(hJob,
JobObjectBasicUIRestrictions,&ui,sizeof(ui));
//创建进程
HANDLE hProc=CreateWs("C:\\windows\\system32\\notepad.exe");
HANDLE hProc1=CreateWs("C:\\windows\\system32\\mspaint.exe");
//吧进程加入到作业里面
AssignProcessToJobObject (hJob,hProc);
AssignProcessToJobObject (hJob,hProc);
getch();
//结束作业内的所有进程
TerminateJobObject (hJob,0);
//关闭JOB
CloseHandle(hJob);
}
int main(int argc, char* argv[])
{
//获取所有的信息
//EnvString();
//获取指定信息
//EnvVariable("MYPATH");
//获取进程信息
//ProcInfo();
//获取进程模块信息
//ProcModule();
//创建一个进程
//Create();
//结束进程
//Terminate(1356);
//等候进程,相当于一个阻塞函数
//Wait();
//创建一个进程 然后再把进程加入作业 进行权限设置 比如COPY 这些权限就没有了
Job();
getch();
return 0;
}