获取真正的进程/线程句柄

首先在开始正文之前先介绍最简单的获取进程/线程句柄方法。那就是可以在创建进程/线程时获取句柄。

创建进程/线程是获取句柄。

//进程创建函数

BOOL CreateProcess(

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psaProcess,

PSECURITY_ATTRIBUTES psaThread,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo);

参数好多啊,如果想了解参数的具体含义可以去查看MSDN,本文不对这些参数进行详解,但是最后一个参数除外,通过它可以获得进程和主线程的内核句柄和ID。先来看一下PPROCESS_INFORMATION结构:

typedef struct _PROCESS_INFORMATION{

HANDLE hProcess;

HANDLE hThread;

DWORD dwProcessID;

DWORD dwThreadID;

}PROCESS_INFORMATION;

在创建进程之前,我们首先要自己定义一个PROCESS_INFORMATION变量,然后使用它的地址调用CreateProcess()函数,CreateProcess函数在返回之前会出事化结构成员。这样我们就可以的到进程与主线程的句柄和ID了。

PROCESS_INFORMATION pi;

CreateProcess(……,&pi);

接下来就可以通过pi来获取进程与主线程的句柄和ID。

//创建线程函数

HANDLE CreateThread(

PSECURITY_ATTRIBUTES psa,

DWORD cbStackSize,

PTHREAD_START_ROUTINE pfnStartAddr,

PVOID pvParam,

DWORD dwCreateFlags,

PDWORD pdwThreadID

);

该函数的返回值就是创建的新线程的句柄,最后一个参数即为线程ID。

接下来介绍一下在Windows系统中如何获取进程/线程的伪句柄。

Windows提供了两个函数来获取进程/线程的伪句柄。

HANDLE GetCurrentProcess(); //获取进程伪句柄

HANDLE GetCurrentThread(); //获取线程伪句柄

调用这两个函数会返回进程/线程内核对象的一个伪句柄,不会在进程句柄表中新建句柄,同时也不会增加进程/线程内核对象计数。

当然如果使用伪句柄进行CloseHandle()函数调用,CloseHandle会忽略此次调用。

接下来介绍将伪句柄转换为真实句柄。

//复制内核对象句柄函数

BOOL DuplicateHandle(

HANDLE hSourceProcess,

HANDLE hSource,

HANDLE hTargetProcess,

HANDLE phTarget,

DWORD dwDesiredAccess,

BOOL bInheritHandle,

DWORD dwOptions

);

这个函数获得一个进程句柄表中的一个记录项,然后在另一个句柄表中创建这个记录项的副本。

第一个参数hSourceProcess和第三个参数hTargetProcess是内核对象句柄,而且必须是进程内核对象。

第二个参数hSource可以是任何类型内核对象的句柄,但是必须和第一个参数所代表的进程相关。

第四个参数用来接收复制的句柄值。

最后三个参数用来指定内核对象在目标进程中的句柄表项,使用何种访问权限和继承标志。

若最后一个参数指定为DUPLICATE_SAME_ACCESS,表明复制后的句柄与原句柄具有相同的访问权限。

//获取线程句柄

HANDLE hThread;

DuplicateHandle(

GetCurrentProcess(),

GetCurrentThread(),

GetCurrentProcess(),

&hThread,

0,

FALSE,

DUPLICATE_SAME_ACCESS

);

//获取进程句柄

HANDLE hProcess;

DuplicateHandle(

GetCurrentProcess(),

GetCurrentProcess(),

GetCurrentProcess(),

&hProcess,

0,

FALSE,

DUPLICATE_SAME_ACCESS

);

可以看到,获取进程和线程句柄只是传入DuplicateHandle()的第二个参数不同。但是这个函数会增加内核对象计数,所以在使用完句柄后需要调用CloseHandle()使句柄计数减一。

时间: 2024-07-30 23:30:25

获取真正的进程/线程句柄的相关文章

获取系统中所有进程&线程信息

读书笔记--[计算机病毒解密与对抗] 目录: 遍历进程&线程程序 终止进程 获取进程信息 获取进程内模块信息 获取进程命令行参数 代码运行环境:Win7 x64 VS2012 Update3 遍历系统中所有进程 [cpp] view plain copy print? #include <stdio.h> #include <windows.h> #include <TlHelp32.h> int main() { // 为进程的所有线程拍个快照 HANDLE 

C#根据进程名称获取进程的句柄?

C#根据进程名称获取进程的句柄或C#如何获取其他进程的句柄? 不用FindWindow方法! [StructLayout(LayoutKind.Sequential)] public struct ProcessEntry32 { public uint dwSize; public uint cntUsage; public uint th32ProcessID; public IntPtr th32DefaultHeapID; public uint th32ModuleID; public

内存管理[5]通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表

本例在建立一个新的堆前后分别通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表, 没想到一个最简单的程序也有 5 个堆. 效果图: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Memo1: TMemo;    

C#依据进程名称获取进程的句柄?

C#依据进程名称获取进程的句柄或C#怎样获取其它进程的句柄? 有时候标题名是动态变化的,所以不使用FindWindow方法! [StructLayout(LayoutKind.Sequential)] public struct ProcessEntry32 { public uint dwSize; public uint cntUsage; public uint th32ProcessID; public IntPtr th32DefaultHeapID; public uint th32

进程线程----转自林海峰

进程与线程 一 背景知识 进程是对正在运行程序的一个抽象,进程的概念起源于操作系统,是操作系统最核心的概念,操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作系统,点击进入 进程是操作系统提供的最古老也是最重要的抽象概念之一.即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力.将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在. 本文将将着重介绍进

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

进程线程及其状态

进程线程及其状态 进程 进程的概念 进程就是执行中的程序. 进程的状态 进程有五种状态,分别是: 新建:进程正在被创建 运行:进程正在被执行 阻塞:进程等待某个事件(如I/O操作) 就绪:进程等待分配处理器 终止:进程完成执行 进程调度流程图 线程 线程的概念 线程是程序执行流的最小单元,线程早期也有轻量级进程之称.一个进程中可能包含多个线程.在系统内核层面,进程与线程并无本质的不同.进程与线程最大的不同点是资源分配. 线程与进程的比较 线程与进程都可以实现多任务. 线程是CPU调度的基本单元,

android 进程/线程管理(四)续----消息机制的思考(自定义消息机制)

继续分析handler 和looper 先看看handler的 public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } } 所以消息的处理分层三种,就是 1.传入一

进程线程协程那些事儿

一.进程与线程 1.进程 我们电脑的应用程序,都是进程,假设我们用的电脑是单核的,cpu同时只能执行一个进程.当程序出于I/O阻塞的时候,CPU如果和程序一起等待,那就太浪费了,cpu会去执行其他的程序,此时就涉及到切换,切换前要保存上一个程序运行的状态,才能恢复,所以就需要有个东西来记录这个东西,就可以引出进程的概念了. 进程就是一个程序在一个数据集上的一次动态执行过程.进程由程序,数据集,进程控制块三部分组成.程序用来描述进程哪些功能以及如何完成:数据集是程序执行过程中所使用的资源:进程控制