Я не вижу журналы в DbgView, но фильтр можно увидеть в DeviceTree

123
17

Я хочу написать minifilter драйвер для файловой системы, я скомпилировал код в файле.sys (ошибок нет), но после установки я не вижу журналы в DbgView. Но фильтр можно увидеть в программе DeviceTree. Пожалуйста, скажите мне, что моя проблема. Благодарю.

#pragma once
#include <FltKernel.h>
#include <ntddk.h>
#include <dontuse.h>
#include <suppress.h>
#include <stdio.h>
#include <ntstrsafe.h>
FLT_POSTOP_CALLBACK_STATUS PostFileOperationCallback ( IN OUT PFLT_CALLBACK_DATA Data,
IN PCFLT_RELATED_OBJECTS FltObjects,
IN PVOID CompletionContext,
IN FLT_POST_OPERATION_FLAGS Flags);

FLT_PREOP_CALLBACK_STATUS
PreFileOperationCallback (
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__deref_out_opt PVOID *CompletionContext
);

NTSTATUS FilterUnload ( IN FLT_FILTER_UNLOAD_FLAGS Flags );

NTSTATUS FilterLoad (IN PCFLT_RELATED_OBJECTS FltObjects,
IN FLT_INSTANCE_SETUP_FLAGS Flags,
IN DEVICE_TYPE VolumeDeviceType,
IN FLT_FILESYSTEM_TYPE VolumeFilesystemType);

typedef struct _MINIFILTER
{
PDRIVER_OBJECT pDriverObject;
PFLT_FILTER pFilter;
} MINIFILTER, *PMINIFILTER;

const FLT_OPERATION_REGISTRATION Callbacks[] = {

{ IRP_MJ_CREATE,
0,
PreFileOperationCallback,
PostFileOperationCallback },

{ IRP_MJ_OPERATION_END }
};

const FLT_CONTEXT_REGISTRATION Contexts[] = {
{ FLT_CONTEXT_END }
};

CONST FLT_REGISTRATION FilterRegistration = {

sizeof( FLT_REGISTRATION ), // Size
FLT_REGISTRATION_VERSION, // Version
0, // Flags

Contexts, // Context
Callbacks, // Operation callbacks

FilterUnload, // FilterUnload

FilterLoad, // InstanceSetup
NULL, // InstanceQueryTeardown
NULL, // InstanceTeardownStart
NULL, // InstanceTeardownComplete

NULL, // GenerateFileName
NULL // NormalizeNameComponent
};

MINIFILTER fileManager;

NTSTATUS FilterLoad (IN PCFLT_RELATED_OBJECTS FltObjects,
IN FLT_INSTANCE_SETUP_FLAGS Flags,
IN DEVICE_TYPE VolumeDeviceType,
IN FLT_FILESYSTEM_TYPE VolumeFilesystemType)
{
DbgPrint("12313");
if (VolumeDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM) {
return STATUS_FLT_DO_NOT_ATTACH;
}

return STATUS_SUCCESS;
}

NTSTATUS FilterUnload ( IN FLT_FILTER_UNLOAD_FLAGS Flags )
{
return STATUS_SUCCESS;
}

FLT_PREOP_CALLBACK_STATUS
PreFileOperationCallback (
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__deref_out_opt PVOID *CompletionContext
)
{

NTSTATUS status;
PFILE_OBJECT FileObject;

FLT_PREOP_CALLBACK_STATUS returnStatus = FLT_PREOP_SUCCESS_NO_CALLBACK;

/* If this is a callback for a FS Filter driver then we ignore the event */
if(FLT_IS_FS_FILTER_OPERATION(Data))
{
return FLT_PREOP_SUCCESS_NO_CALLBACK;
}

if (FltObjects->FileObject != NULL && Data != NULL) {
FileObject = Data->Iopb->TargetFileObject;
if(FileObject != NULL && Data->Iopb->MajorFunction == IRP_MJ_CREATE)
{
DbgPrint("MiniFilter: YES!!!");
}
}

return FLT_PREOP_SUCCESS_NO_CALLBACK;
}

FLT_POSTOP_CALLBACK_STATUS PostFileOperationCallback ( IN OUT PFLT_CALLBACK_DATA Data,
IN PCFLT_RELATED_OBJECTS FltObjects,
IN PVOID CompletionContext,
IN FLT_POST_OPERATION_FLAGS Flags)
{

return FLT_POSTOP_FINISHED_PROCESSING;

}
//////////////////////////////////////////////////////////////

/*
* обработчик-заглушка
*/
NTSTATUS
OnStubDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest (Irp,
IO_NO_INCREMENT
);
return Irp->IoStatus.Status;
}

VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
FltUnregisterFilter(fileManager.pFilter);
DbgPrint("MiniFilter: Unloaded");
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
int i;
NTSTATUS status;
PCHAR ConfigInfo;
UNICODE_STRING test;

DbgPrint("MiniFilter: Started.");

// Register a dispatch function
for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
{
theDriverObject->MajorFunction[i] = OnStubDispatch;
}

theDriverObject->DriverUnload = OnUnload;

fileManager.pDriverObject = theDriverObject;

status = FltRegisterFilter(theDriverObject, &FilterRegistration, &fileManager.pFilter);

if (!NT_SUCCESS(status))
{
DbgPrint("MiniFilter: Driver not started. ERROR FltRegisterFilter - %08x\n", status);
return status;
}

status = FltStartFiltering( fileManager.pFilter );

if (!NT_SUCCESS( status )) {
FltUnregisterFilter( fileManager.pFilter );
DbgPrint("MiniFilter: Driver not started. ERROR FltStartFiltering - %08x\n", status);
return status;
}

DbgPrint("MiniFilter: Filter was started and configured.");
return STATUS_SUCCESS;
}

спросил(а) 2014-03-18T19:23:00+04:00 6 лет, 7 месяцев назад
1
Решение
70

status = FltEnumerateVolumes(fileManager.pFilter, NULL, 0, &NumberofVolumes);
buffer = ExAllocatePool(PagedPool,1024);

if(buffer != NULL)
{
for(i = 0; i < NumberofVolumes; i++)
{
status = FltEnumerateVolumeInformation(fileManager.pFilter, i, FilterVolumeBasicInformation, buffer, 1024, &NumberofVolumes2);
pFilterInfo = (PFILTER_VOLUME_BASIC_INFORMATION)buffer;
uStrVolume.Length = (USHORT)pFilterInfo->FilterVolumeNameLength;
uStrVolume.MaximumLength = uStrVolume.Length;
uStrVolume.Buffer = &pFilterInfo->FilterVolumeName[0];

if(NT_SUCCESS(status)){
status = FltGetVolumeFromName(fileManager.pFilter, &uStrVolume, &pFLTVolume);
if(NT_SUCCESS(status)){
status = FltAttachVolume(fileManager.pFilter, pFLTVolume, NULL, NULL);
DbgPrint("Attached Volume Successfully.................... \n");
FltObjectDereference(pFLTVolume);
}
}
}
ExFreePool(buffer);
}

ответил(а) 2014-05-05T05:03:00+04:00 6 лет, 5 месяцев назад
41

Начиная с Vista отладочные сообщения фильтруются. Вы должны применить маску, чтобы иметь возможность видеть это сообщение в DbgView или Windbg. Просто прочитайте эту статью http://www.osronline.com/article.cfm?article=295 или вы можете исправить ее с помощью windbg: ed nt! Kd_DEFAULT_Mask 0xFFFFFFFFFFFFFFFF (для x64)

ответил(а) 2014-03-19T14:08:00+04:00 6 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема