现在的位置: 首页 > 综合 > 正文

Win32学习笔记——进程

2013年11月01日 ⁄ 综合 ⁄ 共 2136字 ⁄ 字号 评论关闭
	Windows进程
	1. Windows进程
	进程一个容器,包含了应用程序实例的各种资源。Windows多任务操作系统,因此可以同时执行多个进程。
	2. Windows进程的一些特点
		2.1 进程中包含了执行代码等资源。	
		2.2 进程都具有私有的地址空间。
		2.3 每个进程都有一个ID,表示进程。
		2.4 每个进程都有自己的安全属性。
		2.5 至少要包含一个可以执行的线程。
		
	进程的环境
	1. 环境信息的获取
		获取:
		GetEnvironmentStrings(VOID)
		返回值是获取到的所有环境信息
		释放:
		FreeEnvironmentStrings

void EnvString()
{
	
	//获取所有环境信息
	LPTSTR pszEnv = GetEnvironmentStrings() ;
	LPTSTR pszTemp = pszEnv;

	while (0 != *pszTemp)
	{
		wprintf(_T("%s\n"), pszTemp) ;
		pszTemp += wcslen(pszTemp) + 1 ;
	}

	//释放环境信息字符串
	FreeEnvironmentStrings(pszEnv) ;
}

	2. 环境变量的获取和设置
		获取:
		GetEnvironmentVariable
		设置:
		SetEnvironmentVariable
三	进程信息
	1. 进程ID和句柄
		GetProcessID 获取进程的ID 
		GetCurrentProcess 获取进程的句柄
			返回值为-1,是当前进程的伪句柄。
			如果想获取当前进程的实际句柄需要使用OpenProcess()
	2. 打开进程
		OpenProcess 获取进程的真实句柄
	3. 获取进程的所有模块(EXE, DLL)
		获取进程的详细信息使用PSAPI
		EnumProcessModulses

void ProcModule()
{
	//获取进程句柄
	DWORD dwModuleNeeded ;
	HANDLE hHandle = GetCurrentProcess() ;

	//获取所需大小
	EnumProcessModules(hHandle, NULL, 0, &dwModuleNeeded) ;
	DWORD dwCount = dwModuleNeeded/sizeof(HMODULE) ;
	HMODULE *pModule = new HMODULE[dwCount] ;
	
	//获取进程模块
	EnumProcessModules(hHandle, pModule, dwModuleNeeded, 0) ;

	//枚举模块名称
	for (DWORD dwIndex = 0 ; dwIndex < dwCount; ++dwIndex)
	{
		TCHAR pszBuff[MAX_PATH] = {0} ;
		GetModuleFileNameEx(hHandle, pModule[dwIndex], pszBuff, MAX_PATH) ;
		wprintf(_T("%d : %s \t: %p\n"), dwIndex+1, pszBuff, pModule[dwIndex]) ;
	}

	delete pModule ;
};

	进程的使用
	1. 创建进程
		WinExec(已淘汰)
		ShellExecute(一般用来打开带命令行的文件)
		CreateProcess  (执行一个EXE可执行文件)
		当进程创建成功,可以从进程信息中获取创建好的进程句柄ID等。
	2. 打开进程
		OpenProcess()
	3. 结束进程
		ExitProcess()
		TerminateProcess() ;
	4. 等候进程结束
		WaitForSingleObject() ;
		阻塞函数,当运行时,会在等候的时间内,待等句柄信号。
五	Windows作业
	1. Windows作业
		实际是一个进程组。可以对作业设置权限,一旦进程加入到作业之内,进程的权限将被作业限制。
	2. 作业的使用
		2.1 创建一个作业
			CreateJobObject
		2.2 设置作业权限
			SetInfomationJobObject
		2.3 将进程加入作业
  			AssignProcessToJobObject
		2.4 关闭作业
			CloseHandle
		2.5 结束作业
			使用TerminateJobObject结束作业
			但是并不是所有情况下,作业内的进程都能被结束。

void Job() 
{
	//创建JOB对象
	HANDLE hJob = CreateJobObject(NULL, _T("")) ;

	//设置权限
	JOBOBJECT_BASIC_UI_RESTRICTIONS ui = {0} ;
	ui.UIRestrictionsClass = JOB_OBJECT_UILIMIT_READCLIPBOARD | JOB_OBJECT_UILIMIT_WRITECLIPBOARD ;
	SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &ui, sizeof(ui)) ;

	//创建进程
	HANDLE hProcess = Create(_T("C:\\WINDOWS\\system32\\notepad.exe")) ;

	//将进程加入作业
	AssignProcessToJobObject(hJob, hProcess) ;

	getch() ;

	//结束作业
	TerminateJobObject(hJob, 0) ;

	CloseHandle(hProcess) ;
	CloseHandle(hJob) ;
}

抱歉!评论已关闭.