我有5个进程。我有他们的进程ID。每个进程都锁定自己的parent.lock
文件。我有这些parent.lock
数组中的文件路径称为PARENT_LOCKS_PATHS
.
Using NtQuerySystemInformation
and SystemHandleInformation
我得到了一个返回的列表SYSTEM_HANDLE_TABLE_ENTRY_INFO
这 5 个进程使用的所有句柄。它们按 PID 分组。
结构SYSTEM_HANDLE_TABLE_ENTRY_INFO
:
var SYSTEM_HANDLE_TABLE_ENTRY_INFO = new ctypes.StructType('SYSTEM_HANDLE_TABLE_ENTRY_INFO', [ //typedef struct _TagHANDLEINFO
{'UniqueProcessId': ctypes.unsigned_short},
{'CreatorBackTraceIndex': ctypes.unsigned_short},
{'ObjectTypeIndex': ctypes.unsigned_char},
{'HandleAttributes': ctypes.unsigned_char},
{'HandleValue': ctypes.unsigned_short},
{'Object': ctypes.uint32_t},
{'GrantedAccess': ctypes.unsigned_long}
]); //HANDLEINFO, PHANDLEINFO;
在每个PID组中,我知道哪个句柄是parent.lock
文件,我知道这一点是因为parent.lock
文件是only句柄有GrantedAccess
of 1048704
。所以我有一个对象,它的 PID 与其关联parent.lock
处理条目信息。
所以现在的问题是:我想确定,哪个parent.lock
文件属于哪个路径PARENT_LOCKS_PATHS
文件但无法使用GetFinalPathNameByHandle
(因为我需要支持xp)。我无法复制句柄 ID,因为文件已锁定,它是通过以下方式创建/打开的:
mLockFileHandle = CreateFileW(filePath.get(),
GENERIC_READ | GENERIC_WRITE,
0, // no sharing - of course
nullptr,
CREATE_ALWAYS,
0,
nullptr);
Here is a graphic of my situation (thanks to visio):