|
|
/*++
Copyright (c) 1992-2000 Microsoft Corporation
Module Name:
passthru.h
Abstract:
Ndis Intermediate Miniport driver sample. This is a passthru driver.
Author:
Environment:
Revision History:
--*/
#ifdef NDIS51_MINIPORT
#define PASSTHRU_MAJOR_NDIS_VERSION 5
#define PASSTHRU_MINOR_NDIS_VERSION 1
#else
#define PASSTHRU_MAJOR_NDIS_VERSION 4
#define PASSTHRU_MINOR_NDIS_VERSION 0
#endif
#ifdef NDIS51
#define PASSTHRU_PROT_MAJOR_NDIS_VERSION 5
#define PASSTHRU_PROT_MINOR_NDIS_VERSION 0
#else
#define PASSTHRU_PROT_MAJOR_NDIS_VERSION 4
#define PASSTHRU_PROT_MINOR_NDIS_VERSION 0
#endif
#define MAX_BUNDLEID_LENGTH 50
#define TAG 'ImPa'
#define WAIT_INFINITE 0
//advance declaration
typedef struct _ADAPT ADAPT, *PADAPT;
extern NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath );
NTSTATUS PtDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NDIS_STATUS PtRegisterDevice( VOID );
NDIS_STATUS PtDeregisterDevice( VOID );
VOID PtUnloadProtocol( VOID );
//
// Protocol proto-types
//
extern VOID PtOpenAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status, IN NDIS_STATUS OpenErrorStatus );
extern VOID PtCloseAdapterComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status );
extern VOID PtResetComplete( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS Status );
extern VOID PtRequestComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_REQUEST NdisRequest, IN NDIS_STATUS Status );
extern VOID PtStatus( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_STATUS GeneralStatus, IN PVOID StatusBuffer, IN UINT StatusBufferSize );
extern VOID PtStatusComplete( IN NDIS_HANDLE ProtocolBindingContext );
extern VOID PtSendComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status );
extern VOID PtTransferDataComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred );
extern 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 );
extern VOID PtReceiveComplete( IN NDIS_HANDLE ProtocolBindingContext );
extern INT PtReceivePacket( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet );
extern VOID PtBindAdapter( OUT PNDIS_STATUS Status, IN NDIS_HANDLE BindContext, IN PNDIS_STRING DeviceName, IN PVOID SystemSpecific1, IN PVOID SystemSpecific2 );
extern VOID PtUnbindAdapter( OUT PNDIS_STATUS Status, IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE UnbindContext ); VOID PtUnload( IN PDRIVER_OBJECT DriverObject );
extern NDIS_STATUS PtPNPHandler( IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent );
NDIS_STATUS PtPnPNetEventReconfigure( IN PADAPT pAdapt, IN PNET_PNP_EVENT pNetPnPEvent );
NDIS_STATUS PtPnPNetEventSetPower ( IN PADAPT pAdapt, IN PNET_PNP_EVENT pNetPnPEvent );
//
// Miniport proto-types
//
NDIS_STATUS MPInitialize( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediumIndex, IN PNDIS_MEDIUM MediumArray, IN UINT MediumArraySize, IN NDIS_HANDLE MiniportAdapterHandle, IN NDIS_HANDLE WrapperConfigurationContext );
VOID MPSendPackets( IN NDIS_HANDLE MiniportAdapterContext, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets );
NDIS_STATUS MPSend( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags );
NDIS_STATUS MPQueryInformation( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, IN ULONG InformationBufferLength, OUT PULONG BytesWritten, OUT PULONG BytesNeeded );
NDIS_STATUS MPSetInformation( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_OID Oid, IN PVOID InformationBuffer, IN ULONG InformationBufferLength, OUT PULONG BytesRead, OUT PULONG BytesNeeded );
VOID MPReturnPacket( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet );
NDIS_STATUS MPTransferData( OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred, IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_HANDLE MiniportReceiveContext, IN UINT ByteOffset, IN UINT BytesToTransfer );
VOID MPHalt( IN NDIS_HANDLE MiniportAdapterContext );
VOID MPQueryPNPCapabilities( OUT PADAPT MiniportProtocolContext, OUT PNDIS_STATUS Status );
NDIS_STATUS MPSetMiniportSecondary ( IN PADAPT Secondary, IN PADAPT Primary );
#ifdef NDIS51_MINIPORT
VOID MPCancelSendPackets( IN NDIS_HANDLE MiniportAdapterContext, IN PVOID CancelId );
VOID MPAdapterShutdown( IN NDIS_HANDLE MiniportAdapterContext );
VOID MPDevicePnPEvent( IN NDIS_HANDLE MiniportAdapterContext, IN NDIS_DEVICE_PNP_EVENT DevicePnPEvent, IN PVOID InformationBuffer, IN ULONG InformationBufferLength );
#endif // NDIS51_MINIPORT
VOID MPFreeAllPacketPools( IN PADAPT pAdapt );
NDIS_STATUS MPPromoteSecondary ( IN PADAPT pAdapt );
NDIS_STATUS MPBundleSearchAndSetSecondary ( IN PADAPT pAdapt );
VOID MPProcessSetPowerOid( IN OUT PNDIS_STATUS pNdisStatus, IN PADAPT pAdapt, IN PVOID InformationBuffer, IN ULONG InformationBufferLength, OUT PULONG BytesRead, OUT PULONG BytesNeeded );
//
// There should be no DbgPrint's in the Free version of the driver
//
#if DBG
#define DBGPRINT(Fmt) \
{ \ DbgPrint("Passthru: "); \ DbgPrint Fmt; \ }
#else // if DBG
#define DBGPRINT(Fmt)
#endif // if DBG
#define NUM_PKTS_IN_POOL 256
//
// Protocol reserved part of a sent packet that is allocated by us.
//
typedef struct _SEND_RSVD { PNDIS_PACKET OriginalPkt; } SEND_RSVD, *PSEND_RSVD;
//
// Miniport reserved part of a received packet that is allocated by
// us. Note that this should fit into the MiniportReserved space
// in an NDIS_PACKET.
//
typedef struct _RECV_RSVD { PNDIS_PACKET OriginalPkt; } RECV_RSVD, *PRECV_RSVD;
C_ASSERT(sizeof(RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved));
//
// Event Codes related to the PassthruEvent Structure
//
typedef enum { Passthru_Invalid, Passthru_SetPower, Passthru_Unbind
} PASSSTHRU_EVENT_CODE, *PPASTHRU_EVENT_CODE;
//
// Passthru Event with a code to state why they have been state
//
typedef struct _PASSTHRU_EVENT { NDIS_EVENT Event; PASSSTHRU_EVENT_CODE Code;
} PASSTHRU_EVENT, *PPASSTHRU_EVENT;
//
// Structure used by both the miniport as well as the protocol part of the intermediate driver
// to represent an adapter and its corres. lower bindings
//
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;
} ADAPT, *PADAPT;
extern NDIS_HANDLE ProtHandle, DriverHandle; extern NDIS_MEDIUM MediumArray[4]; extern PADAPT pAdaptList; extern NDIS_SPIN_LOCK GlobalLock;
#define ADAPT_MINIPORT_HANDLE(_pAdapt) ((_pAdapt)->MiniportHandle)
#define ADAPT_DECR_PENDING_SENDS(_pAdapt) \
{ \ NdisAcquireSpinLock(&(_pAdapt)->Lock); \ (_pAdapt)->OutstandingSends--; \ NdisReleaseSpinLock(&(_pAdapt)->Lock); \ }
//
// Custom Macros to be used by the passthru driver
//
/*
BOOLEAN IsIMDeviceStateOn( PADAPT )
*/ #define IsIMDeviceStateOn(_pP) ((_pP)->MPDeviceState == NdisDeviceStateD0 && (_pP)->PTDeviceState == NdisDeviceStateD0 )
|