Доброго времени суток!
Занимаюсь вопросом запрета доступа к каталогу. Делаю это через драйвер минифильтра.
Т.е. через завершение IRP_MJ_CREATE в PreOperationCallback routine. Data->IoStatus.Status=STATUS_ACCESS_DENIED;
Вроде бы делаю все как написано в WDK, но почему-то в каталог всеравно заходит и никакой реакции системы на STATUS_ACCESS_DENIED даже не видно.
Подскажите пожалуйста как это исправить.
Ниже привожу код всей процедуры:
FLT_PREOP_CALLBACK_STATUS
DADPreOperationCallback (
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__deref_out_opt PVOID *CompletionContext
)
{
PUNICODE_STRING nameToUse;
NTSTATUS status;
PFLT_FILE_NAME_INFORMATION nameInfo = NULL;
if (FltObjects->FileObject != NULL) {
status = FltGetFileNameInformation( Data, //Получить имя каталога который обрабатывается в данный момент
FLT_FILE_NAME_NORMALIZED |
FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
&nameInfo );
} else {
// Can't get a name when there's no file object
status = STATUS_UNSUCCESSFUL;
}
if (NT_SUCCESS( status ))
{
nameToUse = &nameInfo->Name;
#ifdef DBG
ASSERT( NT_SUCCESS( FltParseFileNameInformation( nameInfo ) ) );
#else
FltParseFileNameInformation( nameInfo );
#endif
if ( !RtlCompareUnicodeString(&DADData.VolumeNameToUse, &nameInfo->Volume, TRUE))
{ // сравненение имен разделов
if ( !RtlCompareUnicodeString(&nameInfo->ParentDir, &DADData.DirectoryName, FALSE))
{ // сравннение имен каталогов
// если имена каталогов совпадают, то блокируем доступ,
KdPrint(("Our folder!\n"));
Data->IoStatus.Status=STATUS_ACCESS_DENIED;
FltReleaseFileNameInformation( nameInfo );
return FLT_PREOP_COMPLETE;
}
}
if (!NT_SUCCESS(status))
{
KdPrint(("Failed with status : %08X\n" , status ));
if (NULL != nameInfo) {
FltReleaseFileNameInformation( nameInfo );
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
}
#if DBG
//
// Debug support to break on certain errors.
if (FltObjects->FileObject != NULL) {
NTSTATUS retryStatus;
if ((StatusToBreakOn != 0) && (status == StatusToBreakOn)) {
DbgBreakPoint();
}
retryStatus = FltGetFileNameInformation( Data,
FLT_FILE_NAME_NORMALIZED |
FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
&nameInfo );
if (!NT_SUCCESS( retryStatus )) {
// We always release nameInfo, so ignore return value.
NOTHING;
}
}
#endif
if (NULL != nameInfo) {
FltReleaseFileNameInformation( nameInfo );
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}