работа с TDI

Тема в разделе "WASM.BEGINNERS", создана пользователем Dmitry_177, 16 июн 2007.

  1. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    Подскажите пожалуйста с реализацией TDI драйвера-фильтра.. У меня что-то не получается.. Приведу весь свой код TDI фильтра. Это мой первый драйвер, если что плиз не пинайте сильно..
    Код (Text):
    1. #include <ntddk.h>
    2. #include <tdikrnl.h>
    3.  
    4. PDEVICE_OBJECT
    5.     g_TcpDeviceObject    = NULL,        // \Device\Tcp
    6.     g_TcpOldDeviceObject    = NULL,
    7.     g_DeviceObject        = NULL;        // control device
    8.  
    9.  
    10. NTSTATUS
    11. DeviceDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    12. {
    13.     PIO_STACK_LOCATION    IrpStack    = IoGetCurrentIrpStackLocation(Irp);
    14.  
    15.     if (IrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL)
    16.     {
    17.         switch (IrpStack->MinorFunction)
    18.         {
    19.             case TDI_SEND:
    20.                 if (Irp->MdlAddress)
    21.                 {
    22.                     UCHAR mdlBuffer[IrpStack->Parameters.SendLength];
    23.  
    24.                     mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
    25.                    
    26.                     if (mdlBuffer)
    27.                     {
    28.                         DbgPrint ("TDI_Driver[DROP]: Send: 0x%x\n", mdlBuffer);
    29.                     }
    30.                 }
    31.  
    32.                 break;
    33.  
    34.             //case TDI_RECEIVE:
    35.  
    36.  
    37.             //    break;
    38.         }
    39.     }
    40.    
    41.    
    42.     //    IoSkipCurrentIrpStackLocation(Irp);
    43.     //    return IoCallDriver(g_TcpOldDeviceObject, Irp);
    44.    
    45.    
    46.     Irp->IoStatus.Status = STATUS_SUCCESS;
    47.  
    48.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    49.  
    50.     return STATUS_SUCCESS;
    51. }
    52.  
    53.  
    54. VOID
    55. UnloadRoutine(IN PDRIVER_OBJECT pDriverObject)
    56. {
    57.     #if DBG
    58.         DbgPrint ("TDI_Driver: UnloadRoutine called\n");
    59.     #endif
    60. }
    61.  
    62.  
    63. NTSTATUS
    64. DriverEntry(IN PDRIVER_OBJECT DriverObject,
    65.             IN PUNICODE_STRING RegistryPath)
    66. {
    67.     NTSTATUS            status    = STATUS_SUCCESS;
    68.     int                    i;
    69.     UNICODE_STRING        usDeviceName;
    70.     UNICODE_STRING        usDeviceLinkName;
    71.     UNICODE_STRING        usTcpDeviceName;
    72.  
    73.     RtlInitUnicodeString (&usDeviceName, L"\\Device\\tdifilter");
    74.  
    75.     RtlInitUnicodeString (&usDeviceLinkName, L"\\??\\tdifilter");
    76.  
    77.  
    78.     status = IoCreateDevice (DriverObject,
    79.                              0,        // sizeof(DEVICE_EXTENSION)
    80.                              &usDeviceName,
    81.                              0,        // FILE_DEVICE_UNCNOWN
    82.                              0,
    83.                              TRUE,
    84.                              &g_DeviceObject);
    85.  
    86.     if (!NT_SUCCESS(status))
    87.     {
    88.         #if DBG
    89.             DbgPrint ("DriverEntry: g_DeviceObject IoCreateDevice error\n");
    90.         #endif
    91.        
    92.         return status;
    93.     }
    94.  
    95.  
    96.     status = IoCreateSymbolicLink (&usDeviceLinkName, &usDeviceName);
    97.  
    98.     if (!NT_SUCCESS(status))
    99.     {
    100.         #if DBG
    101.             DbgPrint ("DriverEntry: IoCreateSymbolicLink error\n");
    102.         #endif
    103.  
    104.         IoDeleteDevice (g_DeviceObject);
    105.  
    106.         return status;
    107.     }
    108.  
    109.  
    110.     RtlInitUnicodeString (&usTcpDeviceName, L"\\Device\\Tcp");
    111.  
    112.     status = IoCreateDevice (DriverObject,
    113.                              0,
    114.                              NULL,
    115.                              FILE_DEVICE_UNKNOWN,
    116.                              0,
    117.                              TRUE,    // FALSE
    118.                              &g_TcpDeviceObject);
    119.  
    120.     if (!NT_SUCCESS(status))
    121.     {
    122.         #if DBG
    123.             DbgPrint ("DriverEntry: g_TcpDeviceObject IoCreateDevice error\n");
    124.         #endif
    125.  
    126.         IoDeleteDevice (g_DeviceObject);
    127.        
    128.         return status;
    129.     }
    130.  
    131.  
    132.     g_TcpDeviceObject->Flags |= DO_DIRECT_IO;    // DO_BUFFERED_IO
    133.  
    134.  
    135.     status = IoAttachDevice (g_TcpDeviceObject,
    136.                              &usTcpDeviceName,
    137.                              &g_TcpOldDeviceObject);
    138.  
    139.     if (!NT_SUCCESS(status))
    140.     {
    141.         #if DBG
    142.             DbgPrint ("DriverEntry: g_TcpOldDeviceObject IoAttachDevice error\n");
    143.         #endif
    144.  
    145.         IoDeleteDevice (g_TcpDeviceObject);
    146.         IoDeleteDevice (g_DeviceObject);
    147.  
    148.         return status;
    149.     }
    150.  
    151.  
    152.     for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)    
    153.         DriverObject->MajorFunction[i] = DeviceDispatch;
    154.  
    155.     DriverObject->DriverUnload = UnloadRoutine;
    156.  
    157.  
    158.     return status;
    159. }
    У меня возник ряд вопросов:
    1. Правильная ли сама реализация?
    2. Почему-то компилятор ругается на: UCHAR mdlBuffer[IrpStack->Parameters.SendLength]; по идее в IrpStack->Parameters.SendLength содержится длина..
    3. Как правильно передавать IPR далее по стеку?
    так:
    Код (Text):
    1.     IoSkipCurrentIrpStackLocation(Irp);
    2.     return IoCallDriver(g_TcpOldDeviceObject, Irp);
    или так:
    Код (Text):
    1.     Irp->IoStatus.Status = STATUS_SUCCESS;
    2.  
    3.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    4.  
    5.     return STATUS_SUCCESS;
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    эксперимент покажет ;)
    как почему, ему же неизвестно значение IrpStack->Parameters.SendLength, и он не знает сколько памяти нужно выделить в стеке под локальную переменную.
     
  3. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    Я имел ввиду правильно ли я вообще подключаю свой фильтр к TDI и tcp драйверу чтобы ловить IRP пакеты?

    А какой тогда размер выделять? что-то я не пойму тогда..:dntknw:
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    выделяй динамически.
     
  5. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    А что насчет этого вопроса?
    И еще, в функции выгрузки драйвера UnloadRoutine нужно ли удалять созданные девайсы? и нужно ли удалять символьный линк который я создаю?
     
  6. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    А как еще реализовать динамический массив в драйвере? сделал так:
    Код (Text):
    1. CHAR    *mdlBuffer;
    2.  
    3. mdlBuffer = (CHAR *)malloc (IrpStack->Parameters.SendLength);
    4.  
    5. mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
    6.  
    7. ...
    8.  
    9. free(mdlBuffer);
    компилятор ругается:

    1: 'malloc' undefined; assuming extern returning int
    2: 'SendLength' : is not a member of '_unnamed'
    3: 'free' undefined; assuming extern returning int
     
  7. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    Сделал я, создался у меня драйвер.. Создал программку для его запуска. И.. Полего его загрузки сразуже синий экран выскочил, я даже не успел прочитать что там у меня на экране, как сразу же перезагрузился компьютер.. С тех пор у меня драйвер почему-то больше не запускается.. Ошибка на функции CreateService..
     
  8. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Dmitry_177
    А номер ошибки посмотри... Скорее всего у тебя сервис существует... Открой реестр ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services и удали папку с названием твоего сервиса...
    А чтобы винда не перегружалась открой свойства системы и найди настройки для выпадания в синий экран...
     
  9. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    Разобрался я с запуском драйвера и с перезагрузкой компьютера, спасибо за помощь :)

    Переписал что там было написано на синем экране:

    *** STOP 0x0000007E (0xC0000005, 0xF70C86F6, 0xFA8A17E4, 0xFA8A14E0)
    *** tcpip.sys - Address F70C86F6 base at F70C0000, DateStamp 444775d3


    может что-то и ненужное переписал, например первую строку.. Я же новичек :)

    Я как понимаю мой драйвер как-то неправильно подключается к tcpip драйверу.. Подскажите пожалуйста что я не так делаю.. Код вверху..
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а где код, у тебя ошибка при доступе к памяти.
     
  11. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    Код самого драйвера или ошибки который пишется на синем экране?

    Код драйвера в моем самом первом сообщении в этой теме.. А вот код ошибки я не знаю где пишется, что-то я ничего такого там не нашел..
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    код из первого сообщения в принципе не компилируем.
    как я выше написал 0x0000007E - это AFAIR UNHANDLED_KERNEL_EXEPTION, а 0xC0000005 - ошибка при доступе к памяти.
     
  13. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    Вот код который у меня скомпилировался и вызывает синий экран..
    Код (Text):
    1. #include <ntddk.h>
    2. #include <tdikrnl.h>
    3.  
    4. PDEVICE_OBJECT
    5.     g_TcpDeviceObject       = NULL,     // \Device\Tcp
    6.     g_TcpOldDeviceObject    = NULL,
    7.     //g_udpfltobj               = NULL,     // \Device\Udp
    8.     //g_udpoldobj               = NULL,
    9.     //g_ipfltobj                = NULL,     // \Device\RawIp
    10.     //g_ipoldobj                = NULL,
    11.     g_DeviceObject          = NULL;     // control device
    12.  
    13. //KSPIN_LOCK g_traffic_guard;
    14.  
    15.  
    16. NTSTATUS
    17. DeviceDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    18. {
    19.     PIO_STACK_LOCATION  IrpStack    = IoGetCurrentIrpStackLocation(Irp);
    20.     char                *mdlBuffer  = 0;
    21.     char                usBuffer;
    22.    
    23.     //if (DeviceObject == g_TcpDeviceObject || DeviceObject == g_udpfltobj || DeviceObject == g_ipfltobj)
    24.  
    25.     if (IrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL)
    26.     {
    27.         switch (IrpStack->MinorFunction)
    28.         {
    29.             case TDI_SEND:
    30.                 if (Irp->MdlAddress)
    31.                 {
    32.                     mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
    33.  
    34.                     if (mdlBuffer)
    35.                         RtlCopyMemory (&usBuffer, mdlBuffer, 10); //(ULONG)IrpStack->Parameters.SendLength);
    36.  
    37.                     if (usBuffer)
    38.                     {
    39.                         DbgPrint ("TDI_Driver[DROP]: Send: 0x%x\n", usBuffer);
    40.                     }
    41.                 }
    42.  
    43.                 break;
    44.  
    45.             //case TDI_RECEIVE:
    46.  
    47.  
    48.             //  break;
    49.         }
    50.     }
    51.    
    52.    
    53.     //  IoSkipCurrentIrpStackLocation(Irp);
    54.     //  return IoCallDriver(g_TcpOldDeviceObject, Irp);
    55.    
    56.    
    57.     Irp->IoStatus.Status = STATUS_SUCCESS;
    58.  
    59.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    60.  
    61.     return STATUS_SUCCESS;
    62. }
    63.  
    64.  
    65. VOID
    66. UnloadRoutine(IN PDRIVER_OBJECT pDriverObject)
    67. {
    68.     #if DBG
    69.         DbgPrint ("TDI_Driver: UnloadRoutine called\n");
    70.     #endif
    71. }
    72.  
    73.  
    74. NTSTATUS
    75. DriverEntry(IN PDRIVER_OBJECT DriverObject,
    76.             IN PUNICODE_STRING RegistryPath)
    77. {
    78.     NTSTATUS            status  = STATUS_SUCCESS;
    79.     int                 i;
    80.     UNICODE_STRING      usDeviceName;
    81.     UNICODE_STRING      usDeviceLinkName;
    82.     UNICODE_STRING      usTcpDeviceName;
    83.  
    84.     RtlInitUnicodeString (&usDeviceName, L"\\Device\\tdifilter");
    85.  
    86.     RtlInitUnicodeString (&usDeviceLinkName, L"\\??\\tdifilter");
    87.  
    88.  
    89.     status = IoCreateDevice (DriverObject,
    90.                              0,     // sizeof(DEVICE_EXTENSION)
    91.                              &usDeviceName,
    92.                              0,     // FILE_DEVICE_UNCNOWN
    93.                              0,
    94.                              TRUE,
    95.                              &g_DeviceObject);
    96.  
    97.     if (!NT_SUCCESS(status))
    98.     {
    99.         #if DBG
    100.             DbgPrint ("DriverEntry: g_DeviceObject IoCreateDevice error\n");
    101.         #endif
    102.        
    103.         return status;
    104.     }
    105.  
    106.  
    107.     status = IoCreateSymbolicLink (&usDeviceLinkName, &usDeviceName);
    108.  
    109.     if (!NT_SUCCESS(status))
    110.     {
    111.         #if DBG
    112.             DbgPrint ("DriverEntry: IoCreateSymbolicLink error\n");
    113.         #endif
    114.  
    115.         IoDeleteDevice (g_DeviceObject);
    116.  
    117.         return status;
    118.     }
    119.  
    120.  
    121.     RtlInitUnicodeString (&usTcpDeviceName, L"\\Device\\Tcp");
    122.  
    123.     status = IoCreateDevice (DriverObject,
    124.                              0,
    125.                              NULL,
    126.                              FILE_DEVICE_UNKNOWN,
    127.                              0,
    128.                              TRUE,  // FALSE
    129.                              &g_TcpDeviceObject);
    130.  
    131.     if (!NT_SUCCESS(status))
    132.     {
    133.         #if DBG
    134.             DbgPrint ("DriverEntry: g_TcpDeviceObject IoCreateDevice error\n");
    135.         #endif
    136.  
    137.         IoDeleteDevice (g_DeviceObject);
    138.        
    139.         return status;
    140.     }
    141.  
    142.  
    143.     g_TcpDeviceObject->Flags |= DO_DIRECT_IO;   // DO_BUFFERED_IO
    144.  
    145.  
    146.     status = IoAttachDevice (g_TcpDeviceObject,
    147.                              &usTcpDeviceName,
    148.                              &g_TcpOldDeviceObject);
    149.  
    150.     if (!NT_SUCCESS(status))
    151.     {
    152.         #if DBG
    153.             DbgPrint ("DriverEntry: g_TcpOldDeviceObject IoAttachDevice error\n");
    154.         #endif
    155.  
    156.         IoDeleteDevice (g_TcpDeviceObject);
    157.         IoDeleteDevice (g_DeviceObject);
    158.  
    159.         return status;
    160.     }
    161.  
    162.  
    163.     for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)  
    164.         DriverObject->MajorFunction[i] = DeviceDispatch;
    165.  
    166.     DriverObject->DriverUnload = UnloadRoutine;
    167.  
    168.  
    169.     return status;
    170. }
    Я хотел посмотреть в DebugView хотябы какие-нибудь сообщения, но там ничего не отобразилось, или не успело отобразиться как выскочил синий экран..
     
  14. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    char *mdlBuffer = 0;
    mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
    RtlCopyMemory (&usBuffer, mdlBuffer, 10)

    запись в нулевой указатель?

    не шарю ф сях....
     
  15. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    Я где-то видел что так сделано и у себя так сделал..
     
  16. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Даже если абстрагироваться от теории написания драйверов, то результатом работы данного RtlCopyMemory() будет банальный buffer-overflow, с вероятной перезаписью сохраненного в стеке адреса возврата из DeviceDispatch(). А уж если и не дотянется до сохраненного EIP'a, то вполне себе перезапишет указатели mdlBuffer и IrpStack, что в последующем вызовет крах системы. Компилятор выделяет под переменную типа char 1 байт на стеке(выравнивание не рассматриваем здесь), как можно копировать в нее 10?
     
  17. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    Сделал так:
    Код (Text):
    1. #include <ntddk.h>
    2. #include <tdikrnl.h>
    3.  
    4. PDEVICE_OBJECT
    5.     g_TcpDeviceObject       = NULL,     // \Device\Tcp
    6.     g_TcpOldDeviceObject    = NULL,
    7.     //g_udpfltobj               = NULL,     // \Device\Udp
    8.     //g_udpoldobj               = NULL,
    9.     //g_ipfltobj                = NULL,     // \Device\RawIp
    10.     //g_ipoldobj                = NULL,
    11.     g_DeviceObject          = NULL;     // control device
    12.  
    13. KSPIN_LOCK g_SpinLock;
    14.  
    15.  
    16. NTSTATUS
    17. DeviceDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    18. {
    19.     PIO_STACK_LOCATION  IrpStack    = IoGetCurrentIrpStackLocation(Irp);
    20.     UCHAR               *mdlBuffer;
    21.     UCHAR               usBuffer;
    22.     KIRQL               irql;
    23.    
    24.     KeAcquireSpinLock(&g_SpinLock, &irql);
    25.  
    26.     if (DeviceObject == g_TcpDeviceObject) // || DeviceObject == g_udpfltobj || DeviceObject == g_ipfltobj)
    27.     {
    28.         if (IrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL)
    29.         {
    30.             switch (IrpStack->MinorFunction)
    31.             {
    32.                 case TDI_SEND:
    33.                     if (Irp->MdlAddress)
    34.                     {                  
    35.                         mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
    36.  
    37.                         if (mdlBuffer)
    38.                         {
    39.                             DbgPrint ("tdifilter: Send[DROP]: %x\n", mdlBuffer);
    40.                         }
    41.                     }
    42.  
    43.                     KeReleaseSpinLock(&g_SpinLock, irql);
    44.  
    45.                     Irp->IoStatus.Status = STATUS_SUCCESS;
    46.                     //Irp->IoStatus.Information = 0;
    47.  
    48.                     if (Irp->PendingReturned)
    49.                         IoMarkIrpPending(Irp);
    50.  
    51.                     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    52.  
    53.                     //return IoCallDriver (g_TcpOldDeviceObject, Irp);
    54.  
    55.                     break;
    56.  
    57.                 //case TDI_RECEIVE:
    58.  
    59.  
    60.                 //  break;
    61.             }
    62.         }
    63.     }
    64.  
    65.     KeReleaseSpinLock (&g_SpinLock, irql);
    66.  
    67.     Irp->IoStatus.Status = STATUS_SUCCESS;
    68.  
    69.     //Irp->IoStatus.Information = 0;
    70.  
    71.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    72.  
    73.     return STATUS_SUCCESS;
    74. }
    75.  
    76.  
    77. VOID
    78. UnloadRoutine(IN PDRIVER_OBJECT pDriverObject)
    79. {
    80.     UNICODE_STRING      usDeviceLinkName;
    81.  
    82.     #if DBG
    83.         DbgPrint ("tdifilter: UnloadRoutine called\n");
    84.     #endif
    85.  
    86.     IoDeleteDevice (g_TcpOldDeviceObject);
    87.     IoDeleteDevice (g_TcpDeviceObject);
    88.     RtlInitUnicodeString (&usDeviceLinkName, L"\\??\\tdifilter");
    89.     IoDeleteSymbolicLink(&usDeviceLinkName);
    90.     IoDeleteDevice (g_DeviceObject);
    91.  
    92.     #if DBG
    93.         DbgPrint ("tdifilter: UnloadRoutine successfully comleted\n");
    94.     #endif
    95. }
    96.  
    97.  
    98. NTSTATUS
    99. DriverEntry(IN PDRIVER_OBJECT DriverObject,
    100.             IN PUNICODE_STRING RegistryPath)
    101. {
    102.     NTSTATUS            status  = STATUS_SUCCESS;
    103.     int                 i;
    104.     UNICODE_STRING      usDeviceName;
    105.     UNICODE_STRING      usDeviceLinkName;
    106.     UNICODE_STRING      usTcpDeviceName;
    107.  
    108.     #if DBG
    109.         DbgPrint ("tdifilter: In DriverEntry\n");
    110.         DbgPrint ("tdifilter: RegistryPath = %ws\n", RegistryPath->Buffer);
    111.     #endif
    112.  
    113.  
    114.     DriverObject->DriverUnload = UnloadRoutine;
    115.     for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)  
    116.         DriverObject->MajorFunction[i] = DeviceDispatch;
    117.  
    118.  
    119.     RtlInitUnicodeString (&usDeviceName, L"\\Device\\tdifilter");
    120.  
    121.     status = IoCreateDevice (DriverObject,
    122.                              0, //sizeof(DEVICE_EXTENSION),
    123.                              &usDeviceName,
    124.                              FILE_DEVICE_UNKNOWN,
    125.                              0,
    126.                              TRUE,
    127.                              &g_DeviceObject);
    128.  
    129.     if (!NT_SUCCESS(status))
    130.     {
    131.         #if DBG
    132.             DbgPrint ("tdifilter: g_DeviceObject IoCreateDevice error\n");
    133.         #endif
    134.        
    135.         return status;
    136.     }
    137.  
    138.  
    139.     RtlInitUnicodeString (&usDeviceLinkName, L"\\??\\tdifilter");
    140.  
    141.     status = IoCreateSymbolicLink (&usDeviceLinkName, &usDeviceName);
    142.  
    143.     if (!NT_SUCCESS(status))
    144.     {
    145.         #if DBG
    146.             DbgPrint ("tdifilter: IoCreateSymbolicLink error\n");
    147.         #endif
    148.  
    149.         IoDeleteDevice (g_DeviceObject);
    150.  
    151.         return status;
    152.     }
    153.  
    154.  
    155.     RtlInitUnicodeString (&usTcpDeviceName, L"\\Device\\Tcp");
    156.  
    157.     status = IoCreateDevice (DriverObject,
    158.                              0,
    159.                              NULL,
    160.                              FILE_DEVICE_UNKNOWN,
    161.                              0,
    162.                              FALSE,
    163.                              &g_TcpDeviceObject);
    164.  
    165.     if (!NT_SUCCESS(status))
    166.     {
    167.         #if DBG
    168.             DbgPrint ("tdifilter: g_TcpDeviceObject IoCreateDevice error\n");
    169.         #endif
    170.  
    171.         IoDeleteSymbolicLink(&usDeviceLinkName);   
    172.         IoDeleteDevice (g_DeviceObject);
    173.        
    174.         return status;
    175.     }
    176.  
    177.  
    178.     g_TcpDeviceObject->Flags |= DO_DIRECT_IO; //DO_BUFFERED_IO;
    179.  
    180.  
    181.     status = IoAttachDevice (g_TcpDeviceObject,
    182.                              &usTcpDeviceName,
    183.                              &g_TcpOldDeviceObject);
    184.  
    185.     if (!NT_SUCCESS(status))
    186.     {
    187.         #if DBG
    188.             DbgPrint ("tdifilter: g_TcpOldDeviceObject IoAttachDevice error\n");
    189.         #endif
    190.  
    191.         IoDeleteDevice (g_TcpDeviceObject);
    192.         IoDeleteSymbolicLink(&usDeviceLinkName);
    193.         IoDeleteDevice (g_DeviceObject);
    194.  
    195.         return status;
    196.     }
    197.  
    198.  
    199.     KeInitializeSpinLock(&g_SpinLock);
    200.  
    201.  
    202.     #if DBG
    203.         DbgPrint ("tdifilter: DriverEntry successfully comleted\n");
    204.     #endif
    205.  
    206.  
    207.     return status;
    208. }
    Драйвер запускается, все нормальтно.. Но стоит только зайти на какойнибудь сайт или еще что-то, ну вобщем чтобы TCPIP трафик пошел, как вылетает сразу синий экран..=( Подскажите пожалуйста что не так?
     
  18. lotos_od

    lotos_od New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    Кстати вопрос интересный. Но я бы поставил его по другому: где можно найти реализацию примитивного TDI драйвера фильтра?
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    погугли по TDI firewall, исходник не представляет сложности для изучения.
     
  20. Dmitry_177

    Dmitry_177 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2007
    Сообщения:
    75
    В TDI firewall я поразбирался.. Еще почитал я про физическую и вирткальную память.. Чисто теоретически я представляю себе как прочитать данные, а вот практически, что-то до меня не дойдет как это сделать программно..:dntknw: