windows 使用属于已终止进程的进程句柄是否安全

eqoofvh9  于 2023-01-14  发布在  Windows
关注(0)|答案(1)|浏览(195)

我正在用C++开发一个Windows控制台应用程序。我需要我的程序在另一个我没有任何控制权的进程上做一些操作。
但是,我有一些怀疑的情况下,目标进程可能会被终止的一些原因(由任务管理器等)。它是安全的使用句柄的进程已经终止?

  • 注意:如果其中一个功能失败,我将停止操作。*
HANDLE hProcess = OpenProcess(pid);
if( hProcess != NULL )
{
    // Lets suppose process is terminated here
    
    /* Some operations on process using returned handle*/
}
w46czmvw

w46czmvw1#

Windows中的Kernel objects是引用计数的,引用表示为handles to objects。客户端代码可以创建内核对象并接收初始引用(例如CreateProcess),递增现有对象上的引用计数(例如OpenProcessDuplicateHandle),并递减引用计数(CloseHandle)。只要您保留HANDLE,该HANDLE引用的对象就保持活动状态。
对于process对象,只要你持有对它的引用(HANDLE),该对象就有效。进程已经终止的事实是可以观察到的,但是如果有任何对它的未完成引用,则不会使进程对象无效或破坏进程对象。
具体来说,这意味着你可以用一个“实时”进程(操作系统仍然在为它调度线程)执行任何操作,比如WaitForSingleObject,另外你可以调用GetExitCodeProcess,而那个调用不会返回STILL_ACTIVE
禁止调用CloseHandle,您现在是一个利益相关者,对进程对象的消亡有发言权。除非您签署它,否则它不会消失。这样做的一个必然结果是,您现在还控制PID的有效性。它与进程的生命周期相关联,只要您通过HANDLE持有对它的引用,该PID就不会被另一个进程重用。
总之,只要你坚持一个(进程)HANDLE,你就可以做任何事情。

相关问题