2013-05-26 2 views
0

Я пытаюсь написать устаревший драйвер фильтра-крючка, похожий на брандмауэр: найдите dst-порт и заблокируйте его. Но когда отправляются пакеты, диспетчерская процедура не вызывается.Драйвер фильтра фильтра: процедура отправки не называется

Регистрация диспетчерская:

DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch; 

Старт IPFilter водитель:

C:\Users\unnamed>net start ipfilterdriver 

После этого, запуск драйвера отладки с помощью визуальной DDK. Загрузка драйвера успешно, но точка останова в диспетчере не достигнута. Что я делаю не так?

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) 
{ 
    UNICODE_STRING DeviceName,Win32Device; 
    PDEVICE_OBJECT DeviceObject = NULL; 
    NTSTATUS status; 
    unsigned i; 

    RtlInitUnicodeString(&DeviceName,L"\\Device\\driver10"); 
    RtlInitUnicodeString(&Win32Device,L"\\DosDevices\\driver10"); 

    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) 
     DriverObject->MajorFunction[i] = driver1DefaultHandler; 
    /* 
    DriverObject->MajorFunction[IRP_MJ_CREATE] = driver1CreateClose; 
    DriverObject->MajorFunction[IRP_MJ_CLOSE] = driver1CreateClose; 
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch; 
    */ 
    status = IoCreateDevice(DriverObject, 0, &DeviceName, 
       FILE_DEVICE_DRVFLTIP, 0, FALSE, 
       &DeviceObject); 
    if (NT_SUCCESS(status)) { 
     status = IoCreateSymbolicLink(&Win32Device, &DeviceName); 
     if (!NT_SUCCESS(status))   
       dprintf("DrvFltIp.SYS: IoCreateSymbolicLink failed\n"); 

     DriverObject->MajorFunction[IRP_MJ_CREATE]   = 
     DriverObject->MajorFunction[IRP_MJ_CLOSE]   = 
     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch; 
     DriverObject->DriverUnload = driver1Unload; 
    } 
    if (!NT_SUCCESS(status)) { 
     dprintf("Error in initialization. Unloading...");   
     driver1Unload(DriverObject); 
    } 

    if (!DeviceObject) 
     return STATUS_UNEXPECTED_IO_ERROR; 
/* 
DeviceObject->Flags |= DO_DIRECT_IO; 
DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; 
DeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT; 
*/ 
    DbgPrint("Driver started\n");  
    return status; 
} 
NTSTATUS DrvDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
    dprintf("DrvDispatch called\n"); 
    PIO_STACK_LOCATION irpStack; 
    PVOID    ioBuffer; 
    ULONG    inputBufferLength; 
    ULONG    outputBufferLength; 
    ULONG    ioControlCode; 
    NTSTATUS   ntStatus; 

    Irp->IoStatus.Status  = STATUS_SUCCESS; 
    Irp->IoStatus.Information = 0; 

    irpStack = IoGetCurrentIrpStackLocation(Irp); 

    switch (irpStack->MajorFunction) { 
    case IRP_MJ_CREATE: 
     dprintf("DrvFltIp.SYS: IRP_MJ_CREATE\n"); 
     break; 

    case IRP_MJ_CLOSE: 
     dprintf("DrvFltIp.SYS: IRP_MJ_CLOSE\n"); 
     break; 

    case IRP_MJ_DEVICE_CONTROL: 
     dprintf("DrvFltIp.SYS: IRP_MJ_DEVICE_CONTROL\n");   
     break; 
    }  
    ntStatus = Irp->IoStatus.Status; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
    return ntStatus; 
} 
+0

Вы уверены, что хотите 'IRP_MJ_DEVICE_CONTROL'? Вы не представили очень много деталей, но это не кажется мне правильным. –

+0

Я не уверен ... Но пример, на котором основан мой код, использует IRP_MJ_DEVICE_CONTROL, и я не могу найти больше информации об этом типе драйверов. Добавьте код DriverEntry и диспетчера к вопросу. –

ответ

Смежные вопросы