抱真正的经过/线程词柄

首先在开正文之前先行介绍最简便的获得进程/线程词柄方法。那就是是得以创造过程/线程时得句柄。

开创过程/线程是取得句柄。

//进程创造函数

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

相关文章