首頁  >  文章  >  資料庫  >  关于获取进程句柄的问题

关于获取进程句柄的问题

WBOY
WBOY原創
2016-06-07 15:31:131233瀏覽

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn