VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 560|回复: 2

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

[复制链接]
45_avatar_middle
online_member aliec 发表于 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();




上一篇:字符串写文件为什么只写进去了一半?
下一篇:《实用C++》第31课 类的成员函数

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

87_avatar_middle
online_member xiaotao701 发表于 2018-3-30 18:34:07 | 显示全部楼层
虽然我把windows核心编程看完了,然并卵。显然一遍不行!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

45_avatar_middle
ico_lz  楼主| aliec 发表于 2018-3-30 18:36:18 | 显示全部楼层
xiaotao701 发表于 2018-3-30 18:34
虽然我把windows核心编程看完了,然并卵。显然一遍不行!

继续努力

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

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

GMT+8, 2018-7-18 16:55

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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