Завершение IRP_MJ_CREATE. Драйвер минифильтра.
От: KAlex1  
Дата: 25.11.09 19:58
Оценка:
Доброго времени суток!
Занимаюсь вопросом запрета доступа к каталогу. Делаю это через драйвер минифильтра.
Т.е. через завершение 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;
}
completion irp_mj_create драйвер минифильтра
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.