hex.pp.ua

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

Получение файлового идентификатора в 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;
}
система комментирования CACKLE

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


Разделы сайта
Главная
Блог
Native API
NTFS и ReFS
Микроконтроллеры
Справочник NTDLL
Коды NTSTATUS
Разное

Избранное
NTFS Stream Explorer
Native Shell
Тенгвар

Остальное
nvpnhcknn (архив)
English pages
Контакты

Ленты atom
Лента Atom сайта Лента Atom блога



При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт.