得到真正的进程/线程句柄

参数好多啊,若是想询问参数的具体意思能够去查看MSDN,本文不对这几个参数实行详解,不过最后二个参数除了那么些之外,通过它能够收获进度和主线程的水源句柄和ID。先来看一下PPROCESS_INFORMATION结构:

typedef struct _PROCESS_INFORMATION{

HANDLE hProcess;

HANDLE hThread;

DWORD dwProcessID;

DWORD dwThreadID;

}PROCESS_INFORMATION;

在创制进度在此以前,大家先是要自个儿定义四个PROCESS_INFOENVISIONMATION变量,然后利用它的地址调用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。

接下去介绍将伪句柄转换为实际句柄。

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

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()的第3个参数差别。不过那几个函数会大增水源对象计数,所以在选拔完句柄后须要调用CloseHandle()使句柄计数减一。

接下去介绍一下在Windows系统中哪些获取进度/线程的伪句柄。

Windows提供了多个函数来得到进度/线程的伪句柄。

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

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

调用那多少个函数会回到经过/线程内核查象的一个伪句柄,不会在进度句柄表中新建句柄,同时也不会扩张进度/线程内核对象计数。

当然假诺采用伪句柄举办CloseHandle()函数调用,CloseHandle会忽略这次调用。

首先在初阶正文从前先介绍最简便的获得进度/线程句柄方法。那正是能够在开创进程/线程时收获句柄。

创办进度/线程是取得句柄。

//进程创建函数

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);

相关文章