Здравствуйте, 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_, Вы писали:
A_>Честно говоря думал, что нет в природе такого способа. Ан нет
Попробуй покопать вот в такую сторону:
A_>Експортируется из ntdll.dll и как следствие, работать будет только в семействе NT (NT4/2000/XP/etc.)
A_>По крайней мере OBJECT_BASIC_INFORMATION похоже на то, что нужно.
Спасибо за помощь! Интересная идея. Хотя, в принципе, вопрос отпал, так как я уже решил как обойтись без получения информации об аттрибуте открытия файла.
А суть вообще в следующем: написал приложение, которое работает с некой базой данных. БД имеет свой формат и является набором файлов. К базе данных делаются запросы. Количество запросов — очень большое, размер — маленький (десятки байт). При сетевой работе с БД, доступ осуществляется ОЧЕНЬ медленно. В результате, было решено создать модуль для кеширования сетевых файлов. Модуль перехватывает все обращения к CreateFile, CloseHandle, ReadFile, и кеширует файлы. Кеширование необходимо было сделать только для файлов c аттрибутом GENERIC_READ. При этом, определять аттрибут надо было как в перехваченой CreateFile, так и в ReadFile. Ситуация осложняется тем, что модуль кеширования должен работать корректно, даже при присоединении к процессу инородных модулей. (Мне, например, нужно использовать VTune, для оптимизации кеширования).
В принципе, на текущий момент вопрос о получении аттрибутов файла уже не столь актуален, так как я отказался от нахождения аттрибутов открытия при перехвате ReadFile.
Благодарю за помощь!