VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 820|回复: 2

[分享] Windows编程(三)第一个内核对象操练——进程

[复制链接]
45_avatar_middle
在线会员 发表于 2018-3-28 18:09:28 | 显示全部楼层 |阅读模式
我们平时双击运行的各个软件就是启动了一个进程,所以进程是和我们打交道最多的一个内核对象。既然我们说了Windows编程的本质就是申请内核对象,拿到句柄,操作句柄,销毁句柄,那我们就来操练一下:
第一、申请内核对象:
     凡是申请内核对象,Windows API都是以Create开头的的函数,比如:
1、建立一个新进程的函数:
BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);
   用这个函数就可以通知操作系统要申请一个进程内核对象了,请操作系统给与执行。操作系统接到申请后就开始准备虚拟空间,把该进程装载进去,然后执行,再把该进程的句柄返回给你,句柄存在PROCESS_INFORMATION这个数据结构里:
typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD dwProcessId;
  DWORD dwThreadId;
} PROCESS_INFORMATION,
*LPPROCESS_INFORMATION;
2、申请系统进程快照对象:
   如果要列出正在运行的一系列进程,可以申请进程快照内核对象:
HANDLE WINAPI CreateToolhelp32Snapshot(
  __in  DWORD dwFlags,
  __in  DWORD th32ProcessID
);
这个函数直接就把句柄返回给你了。
第二、操作句柄:
拿到快照句柄后,下面就可以操作了,有两个操作函数:
BOOL WINAPI Process32First(
  __in     HANDLE hSnapshot,
  __inout  LPPROCESSENTRY32 lppe
);
BOOL WINAPI Process32Next(
  __in   HANDLE hSnapshot,
  __out  LPPROCESSENTRY32 lppe
);
它们把获取的进程信息存在PROCESSENTRY32数据结构中:
typedef struct tagPROCESSENTRY32 {
  DWORD dwSize;
  DWORD cntUsage;
  DWORD th32ProcessID;
  ULONG_PTR th32DefaultHeapID;
  DWORD th32ModuleID;
  DWORD cntThreads;
  DWORD th32ParentProcessID;
  LONG pcPriClassBase;
  DWORD dwFlags;
  TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32,
*PPROCESSENTRY32;
当获得进程的ID号后,可以用:
HANDLE WINAPI OpenProcess(
  __in  DWORD dwDesiredAccess,
  __in  BOOL bInheritHandle,
  __in  DWORD dwProcessId
);
获取单个进程的句柄。
第三、销毁句柄:
1、终止其他进程函数:
BOOL WINAPI TerminateProcess(
  __in  HANDLE hProcess,
  __in  UINT uExitCode
);
只要拿到进程句柄,就可以用该函数终止它。
2、用OpenProcess得到的句柄别忘了CloseHandle();




上一篇:Windows编程(二)Windows编程的本质
下一篇:mfc在Treectrl中动态添加树项
87_avatar_middle
在线会员 发表于 2018-3-30 18:34:07 | 显示全部楼层
虽然我把windows核心编程看完了,然并卵。显然一遍不行!
45_avatar_middle
ico_lz  楼主| 发表于 2018-3-30 18:36:18 | 显示全部楼层
xiaotao701 发表于 2018-3-30 18:34
虽然我把windows核心编程看完了,然并卵。显然一遍不行!

继续努力
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-26 13:37

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表