3 Copyright (c) 1992-2000 Microsoft Corporation
\r
11 Ndis Intermediate Miniport driver sample. This is a passthru driver.
\r
23 #ifdef NDIS51_MINIPORT
\r
24 #define PASSTHRU_MAJOR_NDIS_VERSION 5
\r
25 #define PASSTHRU_MINOR_NDIS_VERSION 1
\r
27 #define PASSTHRU_MAJOR_NDIS_VERSION 4
\r
28 #define PASSTHRU_MINOR_NDIS_VERSION 0
\r
32 #define PASSTHRU_PROT_MAJOR_NDIS_VERSION 5
\r
33 #define PASSTHRU_PROT_MINOR_NDIS_VERSION 0
\r
35 #define PASSTHRU_PROT_MAJOR_NDIS_VERSION 4
\r
36 #define PASSTHRU_PROT_MINOR_NDIS_VERSION 0
\r
39 #define MAX_BUNDLEID_LENGTH 50
\r
42 #define WAIT_INFINITE 0
\r
46 //advance declaration
\r
47 typedef struct _ADAPT ADAPT, *PADAPT;
\r
49 DRIVER_INITIALIZE DriverEntry;
\r
53 IN PDRIVER_OBJECT DriverObject,
\r
54 IN PUNICODE_STRING RegistryPath
\r
57 DRIVER_DISPATCH PtDispatch;
\r
60 IN PDEVICE_OBJECT DeviceObject,
\r
64 DRIVER_DISPATCH DevIoControl;
\r
67 IN PDEVICE_OBJECT pDeviceObject,
\r
81 DRIVER_UNLOAD PtUnload;
\r
88 // Protocol proto-types
\r
92 PtOpenAdapterComplete(
\r
93 IN NDIS_HANDLE ProtocolBindingContext,
\r
94 IN NDIS_STATUS Status,
\r
95 IN NDIS_STATUS OpenErrorStatus
\r
100 PtCloseAdapterComplete(
\r
101 IN NDIS_HANDLE ProtocolBindingContext,
\r
102 IN NDIS_STATUS Status
\r
108 IN NDIS_HANDLE ProtocolBindingContext,
\r
109 IN NDIS_STATUS Status
\r
115 IN NDIS_HANDLE ProtocolBindingContext,
\r
116 IN PNDIS_REQUEST NdisRequest,
\r
117 IN NDIS_STATUS Status
\r
123 IN NDIS_HANDLE ProtocolBindingContext,
\r
124 IN NDIS_STATUS GeneralStatus,
\r
125 IN PVOID StatusBuffer,
\r
126 IN UINT StatusBufferSize
\r
132 IN NDIS_HANDLE ProtocolBindingContext
\r
138 IN NDIS_HANDLE ProtocolBindingContext,
\r
139 IN PNDIS_PACKET Packet,
\r
140 IN NDIS_STATUS Status
\r
145 PtTransferDataComplete(
\r
146 IN NDIS_HANDLE ProtocolBindingContext,
\r
147 IN PNDIS_PACKET Packet,
\r
148 IN NDIS_STATUS Status,
\r
149 IN UINT BytesTransferred
\r
155 IN NDIS_HANDLE ProtocolBindingContext,
\r
156 IN NDIS_HANDLE MacReceiveContext,
\r
157 IN PVOID HeaderBuffer,
\r
158 IN UINT HeaderBufferSize,
\r
159 IN PVOID LookAheadBuffer,
\r
160 IN UINT LookaheadBufferSize,
\r
167 IN NDIS_HANDLE ProtocolBindingContext
\r
173 IN NDIS_HANDLE ProtocolBindingContext,
\r
174 IN PNDIS_PACKET Packet
\r
180 OUT PNDIS_STATUS Status,
\r
181 IN NDIS_HANDLE BindContext,
\r
182 IN PNDIS_STRING DeviceName,
\r
183 IN PVOID SystemSpecific1,
\r
184 IN PVOID SystemSpecific2
\r
190 OUT PNDIS_STATUS Status,
\r
191 IN NDIS_HANDLE ProtocolBindingContext,
\r
192 IN NDIS_HANDLE UnbindContext
\r
197 IN PDRIVER_OBJECT DriverObject
\r
205 IN NDIS_HANDLE ProtocolBindingContext,
\r
206 IN PNET_PNP_EVENT pNetPnPEvent
\r
213 PtPnPNetEventReconfigure(
\r
215 IN PNET_PNP_EVENT pNetPnPEvent
\r
219 PtPnPNetEventSetPower (
\r
221 IN PNET_PNP_EVENT pNetPnPEvent
\r
226 // Miniport proto-types
\r
230 OUT PNDIS_STATUS OpenErrorStatus,
\r
231 OUT PUINT SelectedMediumIndex,
\r
232 IN PNDIS_MEDIUM MediumArray,
\r
233 IN UINT MediumArraySize,
\r
234 IN NDIS_HANDLE MiniportAdapterHandle,
\r
235 IN NDIS_HANDLE WrapperConfigurationContext
\r
240 IN NDIS_HANDLE MiniportAdapterContext,
\r
241 IN PPNDIS_PACKET PacketArray,
\r
242 IN UINT NumberOfPackets
\r
247 IN NDIS_HANDLE MiniportAdapterContext,
\r
248 IN PNDIS_PACKET Packet,
\r
253 MPQueryInformation(
\r
254 IN NDIS_HANDLE MiniportAdapterContext,
\r
256 IN PVOID InformationBuffer,
\r
257 IN ULONG InformationBufferLength,
\r
258 OUT PULONG BytesWritten,
\r
259 OUT PULONG BytesNeeded
\r
264 IN NDIS_HANDLE MiniportAdapterContext,
\r
266 __in_bcount(InformationBufferLength) IN PVOID InformationBuffer,
\r
267 IN ULONG InformationBufferLength,
\r
268 OUT PULONG BytesRead,
\r
269 OUT PULONG BytesNeeded
\r
274 IN NDIS_HANDLE MiniportAdapterContext,
\r
275 IN PNDIS_PACKET Packet
\r
280 OUT PNDIS_PACKET Packet,
\r
281 OUT PUINT BytesTransferred,
\r
282 IN NDIS_HANDLE MiniportAdapterContext,
\r
283 IN NDIS_HANDLE MiniportReceiveContext,
\r
284 IN UINT ByteOffset,
\r
285 IN UINT BytesToTransfer
\r
290 IN NDIS_HANDLE MiniportAdapterContext
\r
295 MPQueryPNPCapabilities(
\r
296 OUT PADAPT MiniportProtocolContext,
\r
297 OUT PNDIS_STATUS Status
\r
301 #ifdef NDIS51_MINIPORT
\r
304 MPCancelSendPackets(
\r
305 IN NDIS_HANDLE MiniportAdapterContext,
\r
311 IN NDIS_HANDLE MiniportAdapterContext
\r
316 IN NDIS_HANDLE MiniportAdapterContext,
\r
317 IN NDIS_DEVICE_PNP_EVENT DevicePnPEvent,
\r
318 IN PVOID InformationBuffer,
\r
319 IN ULONG InformationBufferLength
\r
322 #endif // NDIS51_MINIPORT
\r
325 MPFreeAllPacketPools(
\r
331 MPProcessSetPowerOid(
\r
332 IN OUT PNDIS_STATUS pNdisStatus,
\r
334 __in_bcount(InformationBufferLength) IN PVOID InformationBuffer,
\r
335 IN ULONG InformationBufferLength,
\r
336 OUT PULONG BytesRead,
\r
337 OUT PULONG BytesNeeded
\r
346 PtDereferenceAdapt(
\r
351 // There should be no DbgPrint's in the Free version of the driver
\r
355 #define DBGPRINT(Fmt) \
\r
357 DbgPrint("Passthru: "); \
363 #define DBGPRINT(Fmt)
\r
367 #define NUM_PKTS_IN_POOL 256
\r
371 // Protocol reserved part of a sent packet that is allocated by us.
\r
373 typedef struct _SEND_RSVD
\r
375 PNDIS_PACKET OriginalPkt;
\r
376 struct mbuf* pMbuf; // IPFW extension, reference to the mbuf
\r
377 } SEND_RSVD, *PSEND_RSVD;
\r
380 // Miniport reserved part of a received packet that is allocated by
\r
381 // us. Note that this should fit into the MiniportReserved space
\r
382 // in an NDIS_PACKET.
\r
384 typedef struct _RECV_RSVD
\r
386 PNDIS_PACKET OriginalPkt;
\r
387 struct mbuf* pMbuf; // IPFW extension, reference to the mbuf
\r
388 } RECV_RSVD, *PRECV_RSVD;
\r
390 C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved));
\r
393 // Event Codes related to the PassthruEvent Structure
\r
402 } PASSSTHRU_EVENT_CODE, *PPASTHRU_EVENT_CODE;
\r
405 // Passthru Event with a code to state why they have been state
\r
408 typedef struct _PASSTHRU_EVENT
\r
411 PASSSTHRU_EVENT_CODE Code;
\r
413 } PASSTHRU_EVENT, *PPASSTHRU_EVENT;
\r
417 // Structure used by both the miniport as well as the protocol part of the intermediate driver
\r
418 // to represent an adapter and its corres. lower bindings
\r
420 typedef struct _ADAPT
\r
422 struct _ADAPT * Next;
\r
424 NDIS_HANDLE BindingHandle; // To the lower miniport
\r
425 NDIS_HANDLE MiniportHandle; // NDIS Handle to for miniport up-calls
\r
426 NDIS_HANDLE SendPacketPoolHandle;
\r
427 NDIS_HANDLE RecvPacketPoolHandle;
\r
428 NDIS_STATUS Status; // Open Status
\r
429 NDIS_EVENT Event; // Used by bind/halt for Open/Close Adapter synch.
\r
430 NDIS_MEDIUM Medium;
\r
431 NDIS_REQUEST Request; // This is used to wrap a request coming down
\r
432 // to us. This exploits the fact that requests
\r
433 // are serialized down to us.
\r
434 PULONG BytesNeeded;
\r
435 PULONG BytesReadOrWritten;
\r
436 BOOLEAN ReceivedIndicationFlags[32];
\r
438 BOOLEAN OutstandingRequests; // TRUE iff a request is pending
\r
439 // at the miniport below
\r
440 BOOLEAN QueuedRequest; // TRUE iff a request is queued at
\r
441 // this IM miniport
\r
443 BOOLEAN StandingBy; // True - When the miniport or protocol is transitioning from a D0 to Standby (>D0) State
\r
444 BOOLEAN UnbindingInProcess;
\r
445 NDIS_SPIN_LOCK Lock;
\r
446 // False - At all other times, - Flag is cleared after a transition to D0
\r
448 NDIS_DEVICE_POWER_STATE MPDeviceState; // Miniport's Device State
\r
449 NDIS_DEVICE_POWER_STATE PTDeviceState; // Protocol's Device State
\r
450 NDIS_STRING DeviceName; // For initializing the miniport edge
\r
451 NDIS_EVENT MiniportInitEvent; // For blocking UnbindAdapter while
\r
452 // an IM Init is in progress.
\r
453 BOOLEAN MiniportInitPending; // TRUE iff IMInit in progress
\r
454 NDIS_STATUS LastIndicatedStatus; // The last indicated media status
\r
455 NDIS_STATUS LatestUnIndicateStatus; // The latest suppressed media status
\r
456 ULONG OutstandingSends;
\r
458 BOOLEAN MiniportIsHalted;
\r
461 extern NDIS_HANDLE ProtHandle, DriverHandle;
\r
462 extern NDIS_MEDIUM MediumArray[4];
\r
463 extern PADAPT pAdaptList;
\r
464 extern NDIS_SPIN_LOCK GlobalLock;
\r
467 #define ADAPT_MINIPORT_HANDLE(_pAdapt) ((_pAdapt)->MiniportHandle)
\r
468 #define ADAPT_DECR_PENDING_SENDS(_pAdapt) \
\r
470 NdisAcquireSpinLock(&(_pAdapt)->Lock); \
\r
471 (_pAdapt)->OutstandingSends--; \
\r
472 NdisReleaseSpinLock(&(_pAdapt)->Lock); \
\r
476 // Custom Macros to be used by the passthru driver
\r
485 #define IsIMDeviceStateOn(_pP) ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 )
\r
487 #include "winmissing.h"
\r
489 int ipfw_module_init(void);
\r
490 void ipfw_module_exit(void);
\r
491 int ipfw2_qhandler_w32(PNDIS_PACKET pNdisPacket, int direction,
\r
492 NDIS_HANDLE Context);
\r
493 int ipfw2_qhandler_w32_oldstyle(int direction, NDIS_HANDLE ProtocolBindingContext,
\r
494 unsigned char* HeaderBuffer, unsigned int HeaderBufferSize,
\r
495 unsigned char* LookAheadBuffer, unsigned int LookAheadBufferSize,
\r
496 unsigned int PacketSize);
\r
497 void CleanupReinjected(PNDIS_PACKET Packet, struct mbuf* m, PADAPT pAdapt);
\r
498 void hexdump(PUCHAR,int, const char *);
\r