2014-09-28 1 views
1

У меня есть 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

+0

Thansk man Я разместил неправильную структуру, я исправил ее. – Noitidart

+0

Сделает это исправление и обновит новый код. Большое спасибо за эту заметку, я очень ценю это, потому что это был ответ, который был чрезвычайно важен, а не то, что я спросил. Спасибо, @eryksun! Просто любопытно: как часто это происходит, хотя PID больше, чем 65536? Я никогда честно не видел более 12 тысяч. – Noitidart

+1

Я не знаю, как часто бывает, что PID больше 65535, но у FYI у меня в настоящее время несколько, которые выше трехсот тысяч (300000). Я полагаю, что это более распространено, когда система имеет несколько активных сеансов обслуживания терминалов, но даже если это редко, это не должно вызывать ошибки в коде. – eryksun

ответ

2

для XP, вы можете использовать NtQueryInformationFile() с информационным классом FileNameInformation.

+2

'NtQueryObject' для' ObjectNameInformation' возвращает полный путь NT, включая путь к устройству, например '\ Device \ HarddiskVolume1 \ Windows \ System32 \ ntdll.dll'. Вы получите только относительный путь к устройству из 'NtQueryInformationFile', например' \ Windows \ System32 \ ntdll.dll'. См. [Этот ответ] (http://stackoverflow.com/a/5286888). – eryksun

+0

Спасибо @eryksun. И Реми. Вопрос, хотя это правда: «Однако NtQueryInformationFile будет заторможен, если он не сможет успешно прочитать из заблокированного потока. Но GetFinalPathNameByHandle' не страдает от этого раздражающего побочного эффекта'. Это правда? Мне интересно, потому что я получаю странные ошибки, такие как переполнение буфера, когда длина показывает, что он не переполняется: http://i.imgur.com/xPEHKml.png В моем случае я пытаюсь понять путь заблокированного файла. – Noitidart

+0

Эй, @Remy, NtQueryInformationFile является фанатом для кучки из них, он успешно работает над теми, в которых я нуждаюсь. Но для учебных целей: от [ЗДЕСЬ] (http://social.msdn.microsoft.com/Forums/en-US/93e3dea7-ea1d-4dc4-938a-31a2c821e46d/grabbing-file-name-and-path-of- open-files? forum = vblanguage), они сказали для каждого дескриптора вызова 'NtQueryObject', а затем, если это объект File, тогда я должен называть его' NtQueryInformationFile'. Из моей информации о записи в руке я протестировал 'ObjectTypeIndex' и многие разные типы показали успех. То же самое проявляется в другом месте. http://i.imgur.com/tvESZTZ.png – Noitidart