Получение файлового идентификатора в 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
По вопросам сотрудничества и другим вопросам по работе сайта пишите на cleogroup[собака]yandex.ru