Forum Replies Created

Viewing 7 posts - 31 through 37 (of 37 total)
  • Author
    Posts
  • in reply to: TDI FILTER driver #6286
    Dmitry_177
    Participant

    Спасибо за разъяснение…

    Я уже спрашивал, так правильно будет перехватывать?

    OldClientEventReceive = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler;
    if (OldClientEventReceive)
    {
       ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler = HookedClientEventReceive;
    }

    Ну и соответственно и контекст еще так же присвоить…

    А еще, подскажете пожалуйста как в драйвере хранить список? Вроде как на уровне ядра подругому все, другие функции и т.д…

    З.Ы. я не так давно изучаю ring0, многого еще не знаю.. 😳

    in reply to: TDI FILTER driver #6284
    Dmitry_177
    Participant

    Что-то я не пойму.. а как тогда хранить для каждого address object свой оригинал callback функции? и потом еще в самой callback функции определять какой оригинал вызывать..

    tdi_fw-а я смотрел исходники..

    in reply to: TDI FILTER driver #6282
    Dmitry_177
    Participant

    Нужно перехватывать регистрацию TDI_EVENT_RECEIVE event’а и менять указатель на свой…

    Ловим:

    MajorFunction=IRP_INTERNAL_DEVICE_CONTROL
    MinorFunction=TDI_SET_EVENT_HANDLER
    Parameters->EventType=TDI_EVENT_RECEIVE

    Из DDK я как понял в Parameters->EventHandler будет указатель на callback функцию ClientEventReceive, но как его поменять на свой? может так?:

    OldClientEventReceive = ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler;
    if (OldClientEventReceive)
    {
       ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler =
    
    HookedClientEventReceive;
    }

    А еще тогда в HookedClientEventReceive нужно вызывать оригинал:

    return OldClientEventReceive(TdiEventContext,
                        ConnectionContext,
                        ReceiveFlags,
                        BytesIndicated,
                        BytesAvailable,
                        BytesTaken,
                        Tsdu,
                        IoRequestPacket);

    Как тогда все оригинальные адреса callback функций сохранять для разных потоков вызвавших TDI_SET_EVENT_HANDLER чтобы потом их вызывать в HookedClientEventReceive? Или может есть какойнибудь способ передавать этот адрес в саму функцию HookedClientEventReceive?

    in reply to: TDI FILTER driver #6281
    Dmitry_177
    Participant

    В HookedTcpDeviceControl делаю так:

    if (irpStack->MinorFunction == TDI_SET_EVENT_HANDLER)
    {
       if (((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventType == TDI_EVENT_RECEIVE)
       {
          .....
       }
    }

    Вот где точки, там в ((PTDI_REQUEST_KERNEL_SET_EVENT)&irpStack->Parameters)->EventHandler по идее содержится адрес callback функции ClientEventReceive. В ней на сколько я понял в параметре Tsdu содержатся принятые данные.. Как можно их вытащить от туда? Подскажите пожалуйста..

    in reply to: TDI FILTER driver #6280
    Dmitry_177
    Participant

    По поводу первого я уже сам догадался.. и попробовал вызывать оригинальную функцию в начале, а потом уже смотреть в IRP TDI_RECEIVE..=) Но всеравно и так не работает..

    Спасибо за наводку, буду разбираться..

    in reply to: TDI FILTER driver #6278
    Dmitry_177
    Participant

    Собственно сам перехват:

    в *.h файле:

    PFILE_OBJECT pFile_tcp;
    PDEVICE_OBJECT pDev_tcp;
    PDRIVER_OBJECT pDrv_tcpip;
    
    typedef NTSTATUS (*OLDTCPIRPMJDEVICECONTROL)(IN PDEVICE_OBJECT, IN PIRP);
    OLDTCPIRPMJDEVICECONTROL OldTcpIrpMjDeviceControl;

    в *.с файле:

    UNICODE_STRING deviceTCPUnicodeString;
    WCHAR deviceTCPNameBuffer[]  = L"\\Device\\Tcp";
    
    RtlInitUnicodeString (&deviceTCPUnicodeString, deviceTCPNameBuffer);
    ntStatus = IoGetDeviceObjectPointer(&deviceTCPUnicodeString, FILE_READ_DATA, &pFile_tcp, &pDev_tcp);
    if(!NT_SUCCESS(ntStatus))
       return ntStatus;
    pDrv_tcpip = pDev_tcp->DriverObject;
    
    OldTcpIrpMjDeviceControl = pDrv_tcpip->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL];
    
    if (OldTcpIrpMjDeviceControl)
       InterlockedExchange ((PLONG)&pDrv_tcpip->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL], (LONG)HookedTcpDeviceControl);
    
    ...
    
    NTSTATUS HookedTcpDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    {
        PIO_STACK_LOCATION      irpStack;
        UCHAR         *mdlBuffer;
    
        irpStack = IoGetCurrentIrpStackLocation (Irp);
        switch (irpStack->MajorFunction)
       {
           case IRP_MJ_INTERNAL_DEVICE_CONTROL:
             if (irpStack->MinorFunction == TDI_SEND)
             {
                DbgPrint("tdifilter TDI_SEND");
    
                mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
    
                DbgPrint (mdlBuffer);
             }
    
             if (irpStack->MinorFunction == TDI_RECEIVE)
             {
                DbgPrint("tdifilter TDI_RECEIVE");
    
                mdlBuffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, LowPagePriority);
    
                DbgPrint (mdlBuffer);
             }
    
           break;
          
           default:
           break;
           }
    
        return OldTcpIrpMjDeviceControl(DeviceObject, Irp);
    }

    по идее все должно ловиться и TDI_RECEIVE тоже.. Но почему-то этого не происходит.. Если я захожу на какойнибудь сайт, по идее там должны быть http-пакеты и html страничка.. Но этого почему-то нету..=(

    in reply to: NDIS IM #6258
    Dmitry_177
    Participant

    Обязательность или опционально сть обработчиков в NDIS_PROTOCOL_CHARACTERISTICS и NDIS_MINIPORT_CHARACTERISTICS описана в DDK, большинство из них нужны.

    Подскажи пожалуйста в каком разделе в DDK это можно почитать?

    лучше из отдельного потока работающего на IRQL_PASSIVE_LEVEL

    т.е. лучше создавать свой поток в драйвере при сохранении? какойнибудь там ZwCreateThread функцией?

Viewing 7 posts - 31 through 37 (of 37 total)