// 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; }