Zver
Гость
|
|
« : 17-05-2004 07:22 » |
|
Драйвер создан на основе filemon и предназначен для контроля доступа и фильтрации запросов к гибким дискам (floppy, cdrom, cd-rw и. т. д.).
Привожу код фильтрующей функции:
NTSTATUS HookDispatcher (PDEVICE_OBJECT HookDevice, PIRP Irp) { PIO_STACK_LOCATION CurrentIrpStack = IoGetCurrentIrpStackLocation(Irp); PIO_STACK_LOCATION NextIrpStack = IoGetNextIrpStackLocation(Irp); PHOOK_EXTENSION HookExt; KIRQL Irql;
//получаем информацию о целевом устройстве файловой системе HookExt = HookDevice->DeviceExtension;
// Определяем, с какой функцией мы имеем дело switch( CurrentIrpStack->MajorFunction ) { case IRP_MJ_CREATE: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_CREATE"); break; case IRP_MJ_READ: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_READ"); break; case IRP_MJ_WRITE: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_WRITE"); break; case IRP_MJ_CLOSE: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_CLOSE"); break; case IRP_MJ_FLUSH_BUFFERS: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_FLUSH_BUFFERS"); break; case IRP_MJ_QUERY_INFORMATION: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_QUERY_INFORMATION"); break; case IRP_MJ_SET_INFORMATION: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SET_INFORMATION"); break; case IRP_MJ_QUERY_EA: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_QUERY_EA"); break; case IRP_MJ_SET_EA: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SEA_EA"); break; case IRP_MJ_QUERY_VOLUME_INFORMATION: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_QUERY_VOLUME_INFORMATION"); break; case IRP_MJ_SET_VOLUME_INFORMATION: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SET_VOLUME_INFORMATION"); break; case IRP_MJ_DIRECTORY_CONTROL: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_DIRECTORY_CONTROL"); break; case IRP_MJ_FILE_SYSTEM_CONTROL: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SYSTEM_CONTROL"); break; case IRP_MJ_SHUTDOWN: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SHUTDOWN"); break; case IRP_MJ_LOCK_CONTROL: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_LOCK_CONTROL"); break; case IRP_MJ_CLEANUP: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_CLEANUP"); break; case IRP_MJ_DEVICE_CONTROL: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_DEVICE_CONTROL"); break; case IRP_MJ_CREATE_MAILSLOT: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_CREATE_MAILSLOT"); break; case IRP_MJ_QUERY_SECURITY: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_QUERY_SECURITY"); break; case IRP_MJ_SET_SECURITY: DbgPrint("Horonzon - HookDispatcher=>IRP_MJ_SET_SECURITY"); break; default: DbgPrint("Horonzon - HookDispatcher=>UNKNOWN"); break; }
// копируем параметры в стек следующего уровня *NextIrpStack = *CurrentIrpStack;
if(Magic) {
// устанавливаем процедуру завершения, если мы не выгружаемся KeAcquireSpinLock(&SpinLock, &Irql); if( !UnloadInProgress ) { OutstandingIRPCount++; IoSetCompletionRoutine( Irp, HoronzonCompletionRoutine, NULL, TRUE, TRUE, TRUE ); } KeReleaseSpinLock(&SpinLock, Irql);
DbgPrint("Horonzon - HookDispatcher=>IoCallDriver"); // возвращаем результаты запроса вызывающему return IoCallDriver( HookExt->FileSystem, Irp ); } else { //Вот здесь основная зацепка. Есть ли более изящные способы? IoCancelIrp(Irp); DbgPrint("Horonzon - HookDispatcher=>IoCancelIrp"); return STATUS_SUCCESS; }
}
Вопрос знатокам. Подскажите пожалуйста, известны ли более изящный способы фильтрации IRP, чем банальное удаление? Если есть исходные коды, пожалуйста дайте ссылку, буду очень благодарен.
|