欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

关于获取进程句柄的问题

程序员文章站 2022-06-17 20:21:54
...

使用CreateProcess创建一个 进程 后,PROCESS_INFORMATION结构中会包含 进程 的handle,和唯一存在的 进程 ID 而后使用openprocess打开 进程 时,根据第一个参数 (dwDesiredAccess:想拥有的该 进程 访问权限 PROCESS_ALL_ACCESS //所有能获得的权限 PROCES

使用CreateProcess创建一个进程后,PROCESS_INFORMATION结构中会包含进程的handle,和唯一存在的进程ID

而后使用openprocess打开进程时,根据第一个参数

(dwDesiredAccess:想拥有的该进程访问权限
PROCESS_ALL_ACCESS //所有能获得的权限
PROCESS_CREATE_PROCESS //需要创建一个进程
PROCESS_CREATE_THREAD //需要创建一个线程
PROCESS_DUP_HANDLE //重复使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION //获得进程信息的权限,如它的退出代码、优先级
PROCESS_QUERY_LIMITED_INFORMATION /*获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
PROCESS_SET_INFORMATION //设置某些信息的权限,如进程优先级
PROCESS_SET_QUOTA //设置内存限制的权限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限
PROCESS_TERMINATE //终止一个进程的权限,使用TerminateProcess
PROCESS_VM_OPERATION //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)
PROCESS_VM_READ //读取进程内存空间的权限,可使用ReadProcessMemory
PROCESS_VM_WRITE //读取进程内存空间的权限,可使用WriteProcessMemory
SYNCHRONIZE //等待进程终止

的不同,返回的句柄值是不同的,而且绝对不等于PROCESS_INFORMATION中的句柄值

当程序不关闭时,用OpenProcess获取同一个进程,每次也都能得到不同的句柄值

因为OpenProcess返回的句柄是系统临时给分配的操作句柄。当你没用CloseHandle(hand)关闭这个句柄,再次调用OpenProcess获取句柄时,他又会分配一个新的句柄给你。相当于2个句柄都指向的同一个进程

实质上这些“进程句柄”其实不是真正的进程句柄,而是进程句柄在“句柄表”中的索引(偏移),真正的进程句柄保存在进程句柄表中

若在每次句柄使用过后,关闭句柄即CloseHandle,则用OpenProcess获取同一个进程就可得到同样的句柄值

每个进程都有句柄表。该表的第一项就是进程自己的句柄,这也是为什么调用GetCurrentProcess()总是返回0x7FFFFFFF的原因。


转自:http://blog.csdn.net/lovelyloulou/article/details/5252288