oktava-studio.ru

Как получить идентификатор файла



Получение файлового идентификатора в Windows




Две простые функции, позволяющие выяснить идентификатор файла, для последующего использования этого идентификатора с функцией OpenFileById, которая позволяет получить хэндл файла, не зная его имени (а зная лишь file id).

Первая функция, GetFileId(), позволяет получить обычный идентификатор. Вторая функция, GetFileIdEx(), позволяет получить 128-битный идентификатор файла, который поддерживается только в файловой системе ReFS под Windows Server 2012.

// Получение файлового идентификатора по хэндлу
LARGE_INTEGER GetFileId(IN HANDLE hFile)
{
  LARGE_INTEGER uResult;
  PBY_HANDLE_FILE_INFORMATION bhfi;
  if (INVALID_HANDLE_VALUE == hFile)
  {
    ZeroMemory(&uResult, sizeof(LARGE_INTEGER));
    return uResult;
  }
  bhfi = (PBY_HANDLE_FILE_INFORMATION)HeapAlloc(GetProcessHeap(), 
    HEAP_ZERO_MEMORY, sizeof(BY_HANDLE_FILE_INFORMATION));
  GetFileInformationByHandle(hFile, bhfi);
  uResult.LowPart =  bhfi->nFileIndexLow;
  uResult.HighPart = bhfi->nFileIndexHigh;
  HeapFree(GetProcessHeap(), 0, bhfi);
  return uResult;
}
//128-битный ИД
BOOL GetFileIdEx(IN HANDLE hFile, PFILE_ID_INFO pFii)
{
 BOOL bResult = FALSE;
 if ((NULL == pFii) || (INVALID_HANDLE_VALUE == hFile))
 {
    return bResult;
 }
 OSVERSIONINFOEX osvi;
 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
 GetVersionEx((OSVERSIONINFO*) &osvi);
 // Windows 2012 Server или выше
 if ( osvi.dwMajorVersion >= 6 && osvi.dwMinorVersion >= 2 
    && osvi.wProductType != VER_NT_WORKSTATION)
 {
  bResult = GetFileInformationByHandleEx(hFile, 
      FileIdInformation, pFii, sizeof(FILE_ID_INFO));
 }
 return bResult;
}


Автор: амдф
Дата: 22.12.2012







Copyright © 2016- Программирование Native API и расширенные возможности NTFS
По вопросам сотрудничества и другим вопросам по работе сайта пишите на cleogroup[собака]yandex.ru