使用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