Win32_Windows进程

一 Windows进程

  1 Windows进程
    进程一个容器,包含了应用程序实例的各种资源。Windows多任务的操作系统,
      因此可以同时执行多个进程

  2 Windows进程的一些特点
    2.1 进程中包含了执行代码等资源。
    2.2 进程都具有私有的地址空间。
    2.3 每个进程都有一个ID,标识进程。
    2.4 每个进程都有自己的安全属性
    2.5 每个进程中至少要包含一个可执行的线程。

二 进程的环境

  1 环境信息的获取
    获取:
    LPVOID GetEnVironmentStrings(VOID)
    返回值是获取到的所有环境信息
    释放:
    BOOL FreeEnVironmentStrings(LPTSTR lpszEnVironmentBlock);

  2 环境变量的获取和设置
   获取

DWORD GetEnvironmentVariable(
  LPCTSTR lpName,//变量名称
  LPTSTR lpBuffer,//数据BUFF
  DWORD nSize);//BUFF的长度

    返回值是获取到的字符串的长度
  设置:

BOOL SetEnvironmentVariable(
  LPCTSTR lpName,//变量名称
  LPCTSTR lpValue);//变量的值
View Code
 1 #include "stdafx.h"
 2 #include "windows.h"
 3 
 4 void EnvVariable(LPSTR pszVar)
 5 {
 6     //设置指定变量的值
 7     SetEnvironmentVariable(pszVar,"C:\\");
 8     
 9     //获取指定的变量值
10     CHAR szValue[1024] = {0};
11     GetEnvironmentVariable(pszVar,szValue,1024);
12     printf("%s:%s\n",pszVar,szValue);
13     
14 
15 }
16 void EnvString()
17 {
18     //获取所有环境信息
19     LPSTR pszEnv =  (LPSTR)GetEnvironmentStrings();
20     LPSTR pszTmp = pszEnv;
21     while(0 != pszTmp[0])
22     {
23         printf("%s\n",pszTmp);
24         pszTmp = strlen(pszTmp) + 1 + pszTmp;
25     }
26     //释放环境信息字符串
27     FreeEnvironmentStrings(pszEnv);
28     
29 }
30 int main(int argc, char* argv[])
31 {
32     EnvString();
33     EnvVariable("MYPATH");
34     return 0;
35 }

三 进程的信息

  1 进程ID和句柄
    GetCurrentProcessID  获取进程ID
    GetCurrentProcess  获取进程的句柄
      返回值为 -1 ,是当前进程的伪句柄。如果想获取当前进程的实际句柄需要                                使用 OpenProcess函数。

  2 打开进程

HANDLE OpenProcess(
  DWORD dwDesiredAccess,//访问模式
  BOLL bInheritHandle,//继承标识
  DWORD dwProcessID);//进程ID

    返回进程句柄

  3 获取进程的所有使用的所有模块(EXE或DLL)
    使用 PSAPI 函数

BOOL EnumProcessModules(
  HANDLE hProcess,//进程句柄
  HMODULE *lphModule,//模块的数组
  DWORD cb,//数组的长度
  LPDWORD lpcbNeeded);//获取到数据的字节数
View Code
 1 #include "stdafx.h"
 2 #include "windows.h"
 3 #include "../psapi/psapi.h"
 4 
 5 #pragma comment(lib,"../psapi/psapi.lib")
 6 
 7 void ProcModule()
 8 {
 9     //当前进程句柄
10     HANDLE hProc = GetCurrentProcess();
11     //获取模块句柄
12     HMODULE hModules[256] = {0};
13     DWORD nNeed = 0;
14     EnumProcessModules(hProc,hModules,256,&nNeed);
15     //计算获取到句柄数量
16     DWORD nCount = nNeed / sizeof(HMODULE);
17     //打印句柄
18     for(DWORD nIndex = 0; nIndex < nCount; nIndex ++)
19     {
20         //获取模块的文件名及路径
21         CHAR szPath[MAX_PATH] = {0};
22         GetModuleFileNameEx(hProc,hModules[nIndex],szPath,
23             MAX_PATH);
24         //打印
25         printf("%d:%p,%s\n",nIndex + 1,hModules[nIndex],szPath);
26     }
27 }
28 void ProcInfo()
29 {
30     //获取进程ID
31     DWORD nID = GetCurrentProcessId();
32     //获取进程句柄(-1 ,伪句柄)
33     HANDLE hProc = GetCurrentProcess();
34     
35     printf("Process ID:%d\n",nID);
36     printf("Process Handle:%p\n",hProc);
37     //根据进程ID获取进程实际句柄
38     hProc =  OpenProcess(PROCESS_ALL_ACCESS,FALSE,nID);
39     printf("Process Handle:%p\n",hProc);
40 }
41 
42 int main(int argc, char* argv[])
43 {
44     ProcInfo();
45     ProcModule();
46     return 0;
47 }


四 进程的使用

  1 创建进程
    WinExec  16位,现在不使用
    ShellExecute  执行打开文件等操作
    CreateProcess 执行一个EXE可执行文件,创建一个进程以及它的主线程

BOOL CreateProcess(
  LPCTSTR lpApplicationName,//应用程序路径名
  LPSTR lpCommandLine,//命令行
  LPSECURITY_ATTRIBUTES lpProcessAttributes,//线程安全属性
  BOOL bInheritHandles,//句柄继承标识
  DWORD dwCreationFlags,//创建标识
  LPVOID lpEnvironment,//环境块
  LPCTSTR lpCurrentDirectory,//当前目录
  LPSTARTUPINFO lpStartupInfo,//启动参数
  LPPROCESS_INFORMATION lpProcessInformatio);//进程信息

    当里程创建成功,可以从进程信息中获取创建好的进程句柄\ID等。
    如果执行程序是16位的程序,那么只能使用 lpCommandLine设置执行程序路径
  2 打开进程
    OpenProcess
  3 结束进程
    ExitProcess

BOOL TerminateProcess(
  HANDLE hProcess,//进程句柄
  UINT uExitCode);//结束代码

  4 等候进程结束

DWORD WaitForSingleObject(
  HANDLE hHandle,//等候的句柄
  DWORD dwMilliseconds);//等候的时间,毫秒

    阻塞函数,当运行时会在等候的时间内等待句柄的信号,

View Code
 1 #include "stdafx.h"
 2 #include "conio.h"
 3 #include "windows.h"
 4 
 5 void Create()
 6 {
 7     STARTUPINFO        si = {0};
 8     PROCESS_INFORMATION pi = {0};
 9     si.cb = sizeof(si);
10     si.dwFlags = STARTF_USESIZE;
11     si.dwXSize = 100;
12     si.dwYSize = 200;
13     //创建进程
14     //CreateProcess("C:\\WINDOWS\\system32\\winmine.exe",
15     //    NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
16     
17     CreateProcess("ChildProc.exe","\"Hello Child\"",
18         NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
19 
20     //输出信息
21     printf("Process Handle:%p\n",pi.hProcess);
22     printf("Process ID:%d\n",pi.dwProcessId);
23     printf("Thread Handle: %p\n",pi.hThread);
24     printf("Thread ID %d\n",pi.dwThreadId);
25 }
26 void Terminate(DWORD dwProcID)
27 {
28     //打开进程获取句柄
29     HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcID);
30     //结束进程
31     TerminateProcess(hProc,0);
32 }
33 void Wait()
34 {
35     //创建进程
36     STARTUPINFO si = {0};
37     PROCESS_INFORMATION pi = {0};
38     si.cb = sizeof(si);
39     CreateProcess("C:\\Windows\\System32\\Winmine.exe",
40         NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
41     printf("Winmine is runnig\n");
42     //等候进程结束
43     WaitForSingleObject(pi.hProcess,INFINITE);
44     printf("Winmine is stop\n");
45 }
46 int main(int argc, char* argv[])
47 {
48     //Create();
49     //Terminate(4100);
50     Wait();
51     getch();
52     return 0;
53 }

 五 Windows 作业(Job)

  1 Windows 作业
    实际是一个进程组,可以对作业设置权限,一旦进程加入到作业之内,进程的权限将
      被作业限制。

  2 作业的使用
    需要 NT5.0以上支持,所以在 Windows.h 前定义:#define _WIN32_WINNT 0x0500
    2.1 创建一个作业

HANDLE CreateJobObject(
  LPSECURITY_ATTRIBUTES lpJobAttributes,//安全属性
  LPCTSTR lpName);//名称

      返回创建的Job句柄
    2.2 设置作业权限

BOOL SetInformationJobObject(
  HANDLE hJob,//Job句柄
  JOBOBJECTINFOCLASS JobObjectInformation,//Job权限的类型
  LPVOID lpJobObjectInformation,//类型所对应的数据结构的地址
  DWORD cbJobObjectInformationLength);//类型所对应的数据结构的长度

     2.3 将进程加入作业

BOOL AssignProcessToJobObject(
  HANDLE hJob,//作业句柄
  HANDLE hProcess);//进程句柄

    2.4 关闭作业 
      CloseHandle
    2.5 结束作业
      使用 TerminateJobObject 结束作业,但并不是所有情况下作业内的进程都能
        被结束。

View Code
 1 #include "stdafx.h"
 2 
 3 #define _WIN32_WINNT    0x0500
 4 
 5 #include "windows.h"
 6 #include "conio.h"
 7 
 8 HANDLE Create(LPSTR pszPath)
 9 {
10     STARTUPINFO        si = {0};
11     PROCESS_INFORMATION    pi = {0};
12     si.cb = sizeof(si);
13 
14     CreateProcess(pszPath,NULL,NULL,NULL,FALSE,0,
15         NULL,NULL,&si,&pi);
16     
17     return pi.hProcess;
18 }
19 void Job()
20 {
21     //创建Job对象
22     HANDLE hJob = CreateJobObject(NULL,"MyJob");
23     //设置权限
24     JOBOBJECT_BASIC_UI_RESTRICTIONS ui = {0};
25     ui.UIRestrictionsClass = JOB_OBJECT_UILIMIT_READCLIPBOARD | 
26         JOB_OBJECT_UILIMIT_WRITECLIPBOARD;
27     SetInformationJobObject(hJob,JobObjectBasicUIRestrictions,&ui,
28         sizeof(ui));
29     //创建进程
30     HANDLE hProc = Create("c:\\windows\\system32\\mspaint.exe");
31     //将进程加入作业
32     AssignProcessToJobObject(hJob,hProc);
33     //创建进程
34      hProc = Create("c:\\windows\\system32\\mspaint.exe");
35     //将进程加入作业
36     AssignProcessToJobObject(hJob,hProc);
37     
38     getch();
39     //结束作业
40     TerminateJobObject(hJob,0);
41     //关闭Job
42     CloseHandle(hJob);
43 
44 }
45 int main(int argc, char* argv[])
46 {
47 
48     Job();
49     return 0;
50 }

 

posted @ 2012-10-18 11:46  吟唱黑暗  阅读(261)  评论(0编辑  收藏  举报