получение FileMode в WinAPI
От: KolyanV  
Дата: 06.03.05 12:22
Оценка:
Приветствую!
Возник следующий вопрос: как используя функции WinAPI, имея HANDLE открытого файла узнать режим открытия (GENERIC_READ, GENERIC_WRITE) ?
Заранее благодарен за ответ!
Re: получение FileMode в WinAPI
От: Alter_ Украина http://alter.org.ua
Дата: 07.03.05 07:01
Оценка:
Здравствуйте, KolyanV, Вы писали:

KV>Приветствую!

KV>Возник следующий вопрос: как используя функции WinAPI, имея HANDLE открытого файла узнать режим открытия (GENERIC_READ, GENERIC_WRITE) ?
KV>Заранее благодарен за ответ!

Честно говоря думал, что нет в природе такого способа. Ан нет Попробуй покопать вот в такую сторону:
Експортируется из ntdll.dll и как следствие, работать будет только в семействе NT (NT4/2000/XP/etc.)
По крайней мере OBJECT_BASIC_INFORMATION похоже на то, что нужно.

typedef enum _OBJECT_INFORMATION_CLASS {
    ObjectBasicInformation,
    ObjectNameInformation,
    ObjectTypeInformation,
    ObjectTypesInformation,
    ObjectHandleFlagInformation
} OBJECT_INFORMATION_CLASS;

typedef struct _OBJECT_BASIC_INFORMATION {
    ULONG Attributes;
    ACCESS_MASK GrantedAccess;
    ULONG HandleCount;
    ULONG PointerCount;
    ULONG PagedPoolCharge;
    ULONG NonPagedPoolCharge;
    ULONG Reserved[ 3 ];
    ULONG NameInfoSize;
    ULONG TypeInfoSize;
    ULONG SecurityDescriptorSize;
    LARGE_INTEGER CreationTime;
} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;

typedef struct _OBJECT_NAME_INFORMATION {               // ntddk nthal
    UNICODE_STRING Name;                                // ntddk nthal
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;   // ntddk nthal

typedef struct _OBJECT_TYPE_INFORMATION {
    UNICODE_STRING TypeName;
    ULONG TotalNumberOfObjects;
    ULONG TotalNumberOfHandles;
    ULONG TotalPagedPoolUsage;
    ULONG TotalNonPagedPoolUsage;
    ULONG TotalNamePoolUsage;
    ULONG TotalHandleTableUsage;
    ULONG HighWaterNumberOfObjects;
    ULONG HighWaterNumberOfHandles;
    ULONG HighWaterPagedPoolUsage;
    ULONG HighWaterNonPagedPoolUsage;
    ULONG HighWaterNamePoolUsage;
    ULONG HighWaterHandleTableUsage;
    ULONG InvalidAttributes;
    GENERIC_MAPPING GenericMapping;
    ULONG ValidAccessMask;
    BOOLEAN SecurityRequired;
    BOOLEAN MaintainHandleCount;
    ULONG PoolType;
    ULONG DefaultPagedPoolCharge;
    ULONG DefaultNonPagedPoolCharge;
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;

typedef struct _OBJECT_TYPES_INFORMATION {
    ULONG NumberOfTypes;
    // OBJECT_TYPE_INFORMATION TypeInformation;
} OBJECT_TYPES_INFORMATION, *POBJECT_TYPES_INFORMATION;

typedef struct _OBJECT_HANDLE_FLAG_INFORMATION {
    BOOLEAN Inherit;
    BOOLEAN ProtectFromClose;
} OBJECT_HANDLE_FLAG_INFORMATION, *POBJECT_HANDLE_FLAG_INFORMATION;

NTSYSAPI
NTSTATUS
NTAPI
NtQueryObject(
    IN HANDLE Handle,
    IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
    OUT PVOID ObjectInformation,
    IN ULONG Length,
    OUT PULONG ReturnLength OPTIONAL
    );
--
Alter, http://alter.org.ua
Re[2]: получение FileMode в WinAPI
От: KolyanV  
Дата: 07.03.05 09:35
Оценка:
Здравствуйте, Alter_, Вы писали:

A_>Честно говоря думал, что нет в природе такого способа. Ан нет Попробуй покопать вот в такую сторону:

A_>Експортируется из ntdll.dll и как следствие, работать будет только в семействе NT (NT4/2000/XP/etc.)
A_>По крайней мере OBJECT_BASIC_INFORMATION похоже на то, что нужно.

Спасибо за помощь! Интересная идея. Хотя, в принципе, вопрос отпал, так как я уже решил как обойтись без получения информации об аттрибуте открытия файла.

А суть вообще в следующем: написал приложение, которое работает с некой базой данных. БД имеет свой формат и является набором файлов. К базе данных делаются запросы. Количество запросов — очень большое, размер — маленький (десятки байт). При сетевой работе с БД, доступ осуществляется ОЧЕНЬ медленно. В результате, было решено создать модуль для кеширования сетевых файлов. Модуль перехватывает все обращения к CreateFile, CloseHandle, ReadFile, и кеширует файлы. Кеширование необходимо было сделать только для файлов c аттрибутом GENERIC_READ. При этом, определять аттрибут надо было как в перехваченой CreateFile, так и в ReadFile. Ситуация осложняется тем, что модуль кеширования должен работать корректно, даже при присоединении к процессу инородных модулей. (Мне, например, нужно использовать VTune, для оптимизации кеширования).
В принципе, на текущий момент вопрос о получении аттрибутов файла уже не столь актуален, так как я отказался от нахождения аттрибутов открытия при перехвате ReadFile.

Благодарю за помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.