| 
							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, чем банальное удаление? Если есть исходные коды, пожалуйста дайте ссылку, буду очень благодарен. 
						 |