我想要一个在进程终止后仍然存在的命名共享内存区域。即使没有程序暂时打开句柄,内存区域和数据也应该是可访问的。只有重新启动才能“释放”共享资源。我该怎么做?
我当前的解决方案:带有打开句柄的保持活动进程。
NtMakePermanentObject(HANDLE)
在已创建的命名对象上设置 OBJ_PERMANENT
属性,使其在所有句柄消失时不会消失。该功能是在 XP 中添加的。在NT所有版本中,如果使用NT原生API创建对象,也可以在创建对象时指定OBJ_PERMANENT
不幸的是,如果您没有
OBJ_PERMANENT
(SeCreatePermanentPrivilege
),这两种设置SE_CREATE_PERMANENT_NAME
的方法都会失败,大多数帐户通常都没有,即使是管理员。解决方法包括:
PsExec
-s some.exe
将以 SYSTEM 身份运行任何可执行文件;它创建了一个服务来在后台完成它。SeDebugPrivilege
(SE_DEBUG_NAME
),它可以让你绕过OpenProcess
中的所有安全检查,你可以忘记OBJ_PERMANENT
,只需将对象的句柄复制到smss.exe
或winlogon.exe
或其他东西.我之所以提到这一点,是因为对于管理员而言,SeDebugPrivilege
似乎比 SeCreatePermanentPrivilege
更常见,这听起来很荒谬。NtMakeTemporaryObject(HANDLE)
,清除OBJ_PERMANENT
,存在于所有版本的NT中。它只需要一个具有删除权限的句柄,没有特殊权限。