Re: Динамическое связывание протокольного драйвера
От: Dimatec  
Дата: 31.08.08 14:54
Оценка:
Здравствуйте, Gevara, Вы писали:

G>У меня есть протокольный ндис драйвер. Необхордимо слушать трафик со всех адаптеров. Можно, конечно, запустить бесконечный цикл и периодически опрашивать подключенные адаптеры и вызывать для каждого NdisOpenAdapter, но, помойму, это не совсем разумно. Насколько я понимаю, нужно ловить сообщения обработчика ProtocolPnPEvent. это так? и если да, то каким образом узнать имя включаемого адаптера?


А помоему должно быть так.

Если употреблять "термины" DDK-шного Passthru то, когда придет пакет, у тебя вызовется, в зависимости какая сетевая карта у тебя, одна из функций:


NDIS_STATUS
PtReceive(
    IN  NDIS_HANDLE         ProtocolBindingContext,
    IN  NDIS_HANDLE         MacReceiveContext,
    IN  PVOID               HeaderBuffer,
    IN  UINT                HeaderBufferSize,
    IN  PVOID               LookAheadBuffer,
    IN  UINT                LookAheadBufferSize,
    IN  UINT                PacketSize
    )

INT
PtReceivePacket(
    IN NDIS_HANDLE            ProtocolBindingContext,
    IN PNDIS_PACKET           Packet
    )


Варианты как минимум такие:

1.( не проверял правда )



typedef struct _ADAPT
{
    struct _ADAPT *                Next;
    
    NDIS_HANDLE                    BindingHandle;    // To the lower miniport
    NDIS_HANDLE                    MiniportHandle;    // NDIS Handle to for miniport up-calls
    NDIS_HANDLE                    SendPacketPoolHandle;
    NDIS_HANDLE                    RecvPacketPoolHandle;
    NDIS_STATUS                    Status;            // Open Status
    NDIS_EVENT                     Event;            // Used by bind/halt for Open/Close Adapter synch.
    NDIS_MEDIUM                    Medium;
    NDIS_REQUEST                   Request;        // This is used to wrap a request coming down
                                                // to us. This exploits the fact that requests
                                                // are serialized down to us.
    PULONG                         BytesNeeded;
    PULONG                         BytesReadOrWritten;
    BOOLEAN                        IndicateRcvComplete;
    
    BOOLEAN                        OutstandingRequests;      // TRUE iff a request is pending
                                                        // at the miniport below
    BOOLEAN                        QueuedRequest;            // TRUE iff a request is queued at
                                                        // this IM miniport

    BOOLEAN                        StandingBy;                // True - When the miniport or protocol is transitioning from a D0 to Standby (>D0) State
    BOOLEAN                        UnbindingInProcess;
    NDIS_SPIN_LOCK                 Lock;
                                                        // False - At all other times, - Flag is cleared after a transition to D0

    NDIS_DEVICE_POWER_STATE        MPDeviceState;            // Miniport's Device State 
    NDIS_DEVICE_POWER_STATE        PTDeviceState;            // Protocol's Device State 
    NDIS_STRING                    DeviceName;                // For initializing the miniport edge
    NDIS_EVENT                     MiniportInitEvent;        // For blocking UnbindAdapter while
                                                        // an IM Init is in progress.
    BOOLEAN                        MiniportInitPending;    // TRUE iff IMInit in progress
    NDIS_STATUS                    LastIndicatedStatus;    // The last indicated media status
    NDIS_STATUS                    LatestUnIndicateStatus; // The latest suppressed media status
    ULONG                          OutstandingSends;
    PNDIS_PACKET                   ReceivedPackets[MAX_RECEIVE_PACKET_ARRAY_SIZE];
    ULONG                          ReceivedPacketCount;
    

} ADAPT, *PADAPT;

pAdapt =(PADAPT)ProtocolBindingContext;

pAdapt->DeviceName - даст тебе имя твоей сетевухи.



2.
( Это работает )
Можно составить табличку MAC-адресов твоих сетевух,
тогда в случае функции PtReceive MAC-адрес вытащишь из HeaderBuffer.
В случае с PtReceivePacket MAC-адрес вытаскиваешь из Packet.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.