Здравствуйте, 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.