得真正的历程/线程句柄

率先以初步正文之前先介绍最简单易行的拿走进程/线程句柄方法。那便是可当创立过程/线程时收获句柄。

创立过程/线程是赢得句柄。

//进程创造函数

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()使句柄计数减一。

相关文章