FileID API (OpenFileById, SetFileInformationByHandle, GetFileInformationByHandleEx)

Библиотека FileID API, fileextd.lib, fileextd.dll




В Windows Vista и Windows 2008 Server появились новые функции WinAPI — FileID API. Названия этих функций OpenFileById(), SetFileInformationByHandle() и GetFileInformationByHandleEx(). Служат они для открытия хэндла файла по его идентификатору (вместо имени), получения и установки различных свойств файлов. Функции можно использовать и в более ранних версиях Windows, но в этом случае их нельзя экспортировать из ядра, а нужно воспользоваться .lib-файлом, предоставляемым Майкрософтом.

Применение

Итак, если программа запущена в Windows Vista или Windows 2008 Server, то функции можно брать прямо из kernel32.dll, статически или динамически. Если хочется совместимости с Windows XP/2003, то нужно скачать пакет Win32 FileID APIs 1.1.EXE с официального сайта Майкрософт или напрямую с моего сайта.

FileExtD.DLL

В архиве с сайта Microsoft присутствует только заголовочный файл fileextd.h и библиотека для статической линковки fileextd.lib. Было бы удобно иметь ещё и динамическую библиотеку. Тогда в приложении можно проверять версию операционной системы и в одном случае грузить функции из системной библиотеки, в другом случае из своей. Я сделал динамическую версию библиотеки — fileextd.dll. Скачать её можно здесь. В архиве две библиотеки, одна для x86, вторая для x64.

Прототипы

Прототипы функций выглядят так:

HANDLE
WINAPI
OpenFileById (
    __in     HANDLE hVolumeHint,
    __in     LPFILE_ID_DESCRIPTOR lpFileId,
    __in     DWORD dwDesiredAccess,
    __in     DWORD dwShareMode,
    __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    __in     DWORD dwFlagsAndAttributes        
    );
    
SetFileInformationByHandle(
    __in  HANDLE hFile,
    __in  FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
    __in  LPVOID lpFileInformation,
    __in  DWORD dwBufferSize 
    );
    
BOOL
WINAPI
GetFileInformationByHandleEx(
    __in  HANDLE hFile,
    __in  FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
    __out LPVOID lpFileInformation,
    __in  DWORD dwBufferSize
);           


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


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