FileInformation - извлечь детали переименования файла - PullRequest
0 голосов
/ 04 июля 2019

Какой самый простой и эффективный способ извлечь сведения о файле из параметра «FileInformation», когда «FileInformationClass» равен «10» (т. Е. Операция переименования файла)?

Я пытаюсь перехватить вызов API NtSetInformation, и я хотел бы изменить имя результирующего файла.

На данный момент единственным кодом, который у меня есть, является определение для NtSetInformationFile, а именно:

__kernel_entry NTSYSCALLAPI NTSTATUS NtSetInformationFile(
  HANDLE                 FileHandle,
  PIO_STATUS_BLOCK       IoStatusBlock,
  PVOID                  FileInformation,
  ULONG                  Length,
  FILE_INFORMATION_CLASS FileInformationClass
);

Я искал в Интернете и нашел пример, где FileInformation была изменена на "uint32_t"( ссылка - см. Строку 794), но затем код, чтобы получить подробности файла, довольно обширный (Boost).Есть ли эффективный способ выполнить эту задачу без использования Boost?

1 Ответ

1 голос
/ 04 июля 2019

Зачем искать случайный код, который вы найдете в Интернете, когда структура, о которой вы спрашиваете о , задокументирована ?

Как и большинство NT API, расположение файлов может быть относительно дескриптора каталога:

Если файл не перемещается в другой каталог или если элемент FileName содержит полный путь, этот элемент имеет значение NULL. В противном случае это дескриптор корневого каталога, в котором будет находиться файл после его переименования.

MSDN также сообщает, что существует 3 возможных комбинации:

Строка имени файла в элементе FileName должна быть указана в одной из следующих форм.

  • Простое имя файла. (Элемент RootDirectory имеет значение NULL.) В этом случае файл просто переименовывается в том же каталоге. Таким образом, операция переименования изменяет имя файла, но не его местоположение.
  • Полное имя файла. (Элемент RootDirectory имеет значение NULL.) В этом случае операция переименования изменяет имя и местоположение файла.
  • Относительное имя файла. В этом случае элемент RootDirectory содержит дескриптор целевого каталога для операции переименования. Само имя файла должно быть простым именем файла.

Вам, вероятно, нужно использовать что-то вроде GetFinalPathNameByHandle, если вы заботитесь о полном пути. Если вас интересует только имя файла, а не путь, вы можете просто проанализировать элемент FileName (часть имени находится после последнего \).

Чтобы изменить имя, вы должны вызвать реальную функцию NtSetInformationFile с вашим собственным FILE_RENAME_INFORMATION буфером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...