Задать вопрос
@Lost_brain

Как проверить открыть ли файл какой-либо программой, используя winapi?

Нашел лишь такой ответ на свой вопрос
А что помешает вызвать NtQuerySystemInformation, NtDuplicateObject, NtQueryObject в r3?
Пример как получить список хендлов можно здесь посмотреть, а там далее копируем дескриптор в свой процесс (NtDuplicateObject), смотрим тип (SYSTEM_HANDLE_ENTRY::ObjectTy pe, если не ошибаюсь файлы это тип 0x1C) и получаем имя объекта (NtQueryObject + ObjectNameInformation) для файла. Преобразовать в нормальный путь имя объекта можно с помощью GetFinalPathNameByHandle/GetFileInformationByHandleEx.
typedef enum _OBJECT_INFORMATION_CLASS {
    ObjectBasicInformation,
    ObjectNameInformation,
    ObjectTypeInformation,
    ObjectAllInformation,
    ObjectDataInformation
} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
 
typedef struct _UNICODE_STRING {
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
 
typedef struct _OBJECT_NAME_INFORMATION {
  UNICODE_STRING Name;
  WCHAR          Buffer[0];
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;


Но как именно это реализовать не знаю. Может кто-нибудь подсказать, как проверить файл, открыт ли он еще кем-либо в системе? Мне любой способ подойдет, если с winapi не найдется.
  • Вопрос задан
  • 353 просмотра
Подписаться 1 Простой 2 комментария
Ответ пользователя PresetX К ответам на вопрос (2)
@PresetX
А может вашу задачу можно решить в разы проще, и обычным CreateFile с флагом OPEN_EXISTING запрашивать монопольный доступ? Наверное в случае уже открытого дескриптора просто вернется ERROR_SHARING_VIOLATION
Ответ написан
Комментировать