如何在进程之间共享内核对象,例如可等待计时器

How to share kernel objects, such as Waitable Timers, between processes?

本文关键字:计时器 等待 对象 内核 进程 之间 共享      更新时间:2023-10-16

我正在创建一个对象,例如一个可等待的计时器,我想与另一个进程共享我的对象:

// In process 1:
HANDLE hTimerProcess1 = CreateWaitableTimer(NULL, FALSE, L"Time1");
// In process 2:
HANDLE hTimerProcess2 = CreateWaitableTimer(NULL, FALSE, L"Time1");
  1. 作为第三个参数,我传递相同的名称"Time1",这是否意味着我正在创建一个新的内核对象hTimerProcess2但具有与hTimerProcess1相同的描述符表条目,或者hTimerProcess2只是对现有对象的引用(hTimerProcess1)?
  2. 如何证明hTimerProcess1hTimerProcess2是同一个内核对象?我尝试获取他们的地址,但他们是不同的。

我正在阅读 M. Richter 的"高级 Win32 编程"

从文档到CreateWaitableTimer

如果命名计时器对象在函数调用之前存在,则 函数返回现有对象的句柄和 GetLastError 返回ERROR_ALREADY_EXISTS

所以你的问题 #1 的答案是否定的,你没有创建一个新的内核对象 - 如果两个调用都成功,它们将引用同一个计时器。

如何证明它们是相同的?您可以通过在一个进程中调用SetWaitableTimer并在另一个进程中等待它来做到这一点。

如果要额外确保在第二个进程中获取相同的计时器对象,请改为调用OpenWaitableTimer - 因为这仅在计时器已存在时才成功。

根据 CreateWaitableTimer 的描述,这是可能的:

如果函数成功,则返回值是计时器对象的句柄。如果命名的计时器对象在函数调用之前存在,则该函数将返回现有对象的句柄,并且 GetLastError 返回ERROR_ALREADY_EXISTS。

因此,您应该检查句柄的值(而不是地址)和GetLastError()的结果,以查看您的实现是否成功。