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
74 DRIVER_UNLOAD PtUnload;
\r
81 // Protocol proto-types
\r
85 PtOpenAdapterComplete(
\r
86 IN NDIS_HANDLE ProtocolBindingContext,
\r
87 IN NDIS_STATUS Status,
\r
88 IN NDIS_STATUS OpenErrorStatus
\r
93 PtCloseAdapterComplete(
\r
94 IN NDIS_HANDLE ProtocolBindingContext,
\r
95 IN NDIS_STATUS Status
\r
101 IN NDIS_HANDLE ProtocolBindingContext,
\r
102 IN NDIS_STATUS Status
\r
108 IN NDIS_HANDLE ProtocolBindingContext,
\r
109 IN PNDIS_REQUEST NdisRequest,
\r
110 IN NDIS_STATUS Status
\r
116 IN NDIS_HANDLE ProtocolBindingContext,
\r
117 IN NDIS_STATUS GeneralStatus,
\r
118 IN PVOID StatusBuffer,
\r
119 IN UINT StatusBufferSize
\r
125 IN NDIS_HANDLE ProtocolBindingContext
\r
131 IN NDIS_HANDLE ProtocolBindingContext,
\r
132 IN PNDIS_PACKET Packet,
\r
133 IN NDIS_STATUS Status
\r
138 PtTransferDataComplete(
\r
139 IN NDIS_HANDLE ProtocolBindingContext,
\r
140 IN PNDIS_PACKET Packet,
\r
141 IN NDIS_STATUS Status,
\r
142 IN UINT BytesTransferred
\r
148 IN NDIS_HANDLE ProtocolBindingContext,
\r
149 IN NDIS_HANDLE MacReceiveContext,
\r
150 IN PVOID HeaderBuffer,
\r
151 IN UINT HeaderBufferSize,
\r
152 IN PVOID LookAheadBuffer,
\r
153 IN UINT LookaheadBufferSize,
\r
160 IN NDIS_HANDLE ProtocolBindingContext
\r
166 IN NDIS_HANDLE ProtocolBindingContext,
\r
167 IN PNDIS_PACKET Packet
\r
173 OUT PNDIS_STATUS Status,
\r
174 IN NDIS_HANDLE BindContext,
\r
175 IN PNDIS_STRING DeviceName,
\r
176 IN PVOID SystemSpecific1,
\r
177 IN PVOID SystemSpecific2
\r
183 OUT PNDIS_STATUS Status,
\r
184 IN NDIS_HANDLE ProtocolBindingContext,
\r
185 IN NDIS_HANDLE UnbindContext
\r
190 IN PDRIVER_OBJECT DriverObject
\r
198 IN NDIS_HANDLE ProtocolBindingContext,
\r
199 IN PNET_PNP_EVENT pNetPnPEvent
\r
206 PtPnPNetEventReconfigure(
\r
208 IN PNET_PNP_EVENT pNetPnPEvent
\r
212 PtPnPNetEventSetPower (
\r
214 IN PNET_PNP_EVENT pNetPnPEvent
\r
219 // Miniport proto-types
\r
223 OUT PNDIS_STATUS OpenErrorStatus,
\r
224 OUT PUINT SelectedMediumIndex,
\r
225 IN PNDIS_MEDIUM MediumArray,
\r
226 IN UINT MediumArraySize,
\r
227 IN NDIS_HANDLE MiniportAdapterHandle,
\r
228 IN NDIS_HANDLE WrapperConfigurationContext
\r
233 IN NDIS_HANDLE MiniportAdapterContext,
\r
234 IN PPNDIS_PACKET PacketArray,
\r
235 IN UINT NumberOfPackets
\r
240 IN NDIS_HANDLE MiniportAdapterContext,
\r
241 IN PNDIS_PACKET Packet,
\r
246 MPQueryInformation(
\r
247 IN NDIS_HANDLE MiniportAdapterContext,
\r
249 IN PVOID InformationBuffer,
\r
250 IN ULONG InformationBufferLength,
\r
251 OUT PULONG BytesWritten,
\r
252 OUT PULONG BytesNeeded
\r
257 IN NDIS_HANDLE MiniportAdapterContext,
\r
259 __in_bcount(InformationBufferLength) IN PVOID InformationBuffer,
\r
260 IN ULONG InformationBufferLength,
\r
261 OUT PULONG BytesRead,
\r
262 OUT PULONG BytesNeeded
\r
267 IN NDIS_HANDLE MiniportAdapterContext,
\r
268 IN PNDIS_PACKET Packet
\r
273 OUT PNDIS_PACKET Packet,
\r
274 OUT PUINT BytesTransferred,
\r
275 IN NDIS_HANDLE MiniportAdapterContext,
\r
276 IN NDIS_HANDLE MiniportReceiveContext,
\r
277 IN UINT ByteOffset,
\r
278 IN UINT BytesToTransfer
\r
283 IN NDIS_HANDLE MiniportAdapterContext
\r
288 MPQueryPNPCapabilities(
\r
289 OUT PADAPT MiniportProtocolContext,
\r
290 OUT PNDIS_STATUS Status
\r
294 #ifdef NDIS51_MINIPORT
\r
297 MPCancelSendPackets(
\r
298 IN NDIS_HANDLE MiniportAdapterContext,
\r
304 IN NDIS_HANDLE MiniportAdapterContext
\r
309 IN NDIS_HANDLE MiniportAdapterContext,
\r
310 IN NDIS_DEVICE_PNP_EVENT DevicePnPEvent,
\r
311 IN PVOID InformationBuffer,
\r
312 IN ULONG InformationBufferLength
\r
315 #endif // NDIS51_MINIPORT
\r
318 MPFreeAllPacketPools(
\r
324 MPProcessSetPowerOid(
\r
325 IN OUT PNDIS_STATUS pNdisStatus,
\r
327 __in_bcount(InformationBufferLength) IN PVOID InformationBuffer,
\r
328 IN ULONG InformationBufferLength,
\r
329 OUT PULONG BytesRead,
\r
330 OUT PULONG BytesNeeded
\r
339 PtDereferenceAdapt(
\r
344 // There should be no DbgPrint's in the Free version of the driver
\r
348 #define DBGPRINT(Fmt) \
\r
350 DbgPrint("Passthru: "); \
\r
356 #define DBGPRINT(Fmt)
\r
360 #define NUM_PKTS_IN_POOL 256
\r
364 // Protocol reserved part of a sent packet that is allocated by us.
\r
366 typedef struct _SEND_RSVD
\r
368 PNDIS_PACKET OriginalPkt;
\r
369 } SEND_RSVD, *PSEND_RSVD;
\r
372 // Miniport reserved part of a received packet that is allocated by
\r
373 // us. Note that this should fit into the MiniportReserved space
\r
374 // in an NDIS_PACKET.
\r
376 typedef struct _RECV_RSVD
\r
378 PNDIS_PACKET OriginalPkt;
\r
379 } RECV_RSVD, *PRECV_RSVD;
\r
381 C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved));
\r
384 // Event Codes related to the PassthruEvent Structure
\r
393 } PASSSTHRU_EVENT_CODE, *PPASTHRU_EVENT_CODE;
\r
396 // Passthru Event with a code to state why they have been state
\r
399 typedef struct _PASSTHRU_EVENT
\r
402 PASSSTHRU_EVENT_CODE Code;
\r
404 } PASSTHRU_EVENT, *PPASSTHRU_EVENT;
\r
408 // Structure used by both the miniport as well as the protocol part of the intermediate driver
\r
409 // to represent an adapter and its corres. lower bindings
\r
411 typedef struct _ADAPT
\r
413 struct _ADAPT * Next;
\r
415 NDIS_HANDLE BindingHandle; // To the lower miniport
\r
416 NDIS_HANDLE MiniportHandle; // NDIS Handle to for miniport up-calls
\r
417 NDIS_HANDLE SendPacketPoolHandle;
\r
418 NDIS_HANDLE RecvPacketPoolHandle;
\r
419 NDIS_STATUS Status; // Open Status
\r
420 NDIS_EVENT Event; // Used by bind/halt for Open/Close Adapter synch.
\r
421 NDIS_MEDIUM Medium;
\r
422 NDIS_REQUEST Request; // This is used to wrap a request coming down
\r
423 // to us. This exploits the fact that requests
\r
424 // are serialized down to us.
\r
425 PULONG BytesNeeded;
\r
426 PULONG BytesReadOrWritten;
\r
427 BOOLEAN ReceivedIndicationFlags[32];
\r
429 BOOLEAN OutstandingRequests; // TRUE iff a request is pending
\r
430 // at the miniport below
\r
431 BOOLEAN QueuedRequest; // TRUE iff a request is queued at
\r
432 // this IM miniport
\r
434 BOOLEAN StandingBy; // True - When the miniport or protocol is transitioning from a D0 to Standby (>D0) State
\r
435 BOOLEAN UnbindingInProcess;
\r
436 NDIS_SPIN_LOCK Lock;
\r
437 // False - At all other times, - Flag is cleared after a transition to D0
\r
439 NDIS_DEVICE_POWER_STATE MPDeviceState; // Miniport's Device State
\r
440 NDIS_DEVICE_POWER_STATE PTDeviceState; // Protocol's Device State
\r
441 NDIS_STRING DeviceName; // For initializing the miniport edge
\r
442 NDIS_EVENT MiniportInitEvent; // For blocking UnbindAdapter while
\r
443 // an IM Init is in progress.
\r
444 BOOLEAN MiniportInitPending; // TRUE iff IMInit in progress
\r
445 NDIS_STATUS LastIndicatedStatus; // The last indicated media status
\r
446 NDIS_STATUS LatestUnIndicateStatus; // The latest suppressed media status
\r
447 ULONG OutstandingSends;
\r
449 BOOLEAN MiniportIsHalted;
\r
452 extern NDIS_HANDLE ProtHandle, DriverHandle;
\r
453 extern NDIS_MEDIUM MediumArray[4];
\r
454 extern PADAPT pAdaptList;
\r
455 extern NDIS_SPIN_LOCK GlobalLock;
\r
458 #define ADAPT_MINIPORT_HANDLE(_pAdapt) ((_pAdapt)->MiniportHandle)
\r
459 #define ADAPT_DECR_PENDING_SENDS(_pAdapt) \
\r
461 NdisAcquireSpinLock(&(_pAdapt)->Lock); \
\r
462 (_pAdapt)->OutstandingSends--; \
\r
463 NdisReleaseSpinLock(&(_pAdapt)->Lock); \
\r
467 // Custom Macros to be used by the passthru driver
\r
476 #define IsIMDeviceStateOn(_pP) ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 )
\r