取得真正的历程/线程句柄

率先在伊始正文从前先介绍最简便易行的收获进程/线程句柄方法。这就是足以在创建进程/线程时取得句柄。

创立进程/线程是拿到句柄。

//进程创设函数

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;

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

相关文章