进程的创建 获取信息 进程模块信息 结束等候进程 windows工作等14.4.28

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

你可能感兴趣的:(进程的创建 获取信息 进程模块信息 结束等候进程 windows工作等14.4.28)