У меня есть 5 процессов. У меня есть их идентификаторы процесса. Каждый из этих процессов блокирует собственный файл parent.lock
. У меня есть эти пути parent.lock
в массиве с именем PARENT_LOCKS_PATHS
.Не удается дублировать дескриптор файла с известным путем, но имеет его HANDLE_ENTRY_INFO
Использование NtQuerySystemInformation
и 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
является только ручка, которая имеет GrantedAccess
из 1048704
. Таким образом, у меня есть объект, у которого есть PID, связанный с его информацией о записи дескриптора parent.lock
.
Так что теперь вопрос: Я хочу, чтобы определить, что parent.lock
файл принадлежит какой путь в файле PARENT_LOCKS_PATHS
, не имея возможности использовать GetFinalPathNameByHandle
(как мне нужно поддерживать XP). Я не мог дублировать дескриптор идентификатор, так как файл заблокирован он был создан/открыт:
mLockFileHandle = CreateFileW(filePath.get(),
GENERIC_READ | GENERIC_WRITE,
0, // no sharing - of course
nullptr,
CREATE_ALWAYS,
0,
nullptr);
Вот яркий моей ситуации (спасибо): Visio
Thansk man Я разместил неправильную структуру, я исправил ее. – Noitidart
Сделает это исправление и обновит новый код. Большое спасибо за эту заметку, я очень ценю это, потому что это был ответ, который был чрезвычайно важен, а не то, что я спросил. Спасибо, @eryksun! Просто любопытно: как часто это происходит, хотя PID больше, чем 65536? Я никогда честно не видел более 12 тысяч. – Noitidart
Я не знаю, как часто бывает, что PID больше 65535, но у FYI у меня в настоящее время несколько, которые выше трехсот тысяч (300000). Я полагаю, что это более распространено, когда система имеет несколько активных сеансов обслуживания терминалов, но даже если это редко, это не должно вызывать ошибки в коде. – eryksun