You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1925 lines
71 KiB
1925 lines
71 KiB
/***************************************************************************
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
RNDISMP.H
|
|
|
|
Abstract:
|
|
|
|
Header file for Remote NDIS Miniport driver. Sits on top of Remote
|
|
NDIS bus specific layers.
|
|
|
|
Environment:
|
|
|
|
kernel mode only
|
|
|
|
Notes:
|
|
|
|
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
PURPOSE.
|
|
|
|
Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
|
|
|
|
|
|
Revision History:
|
|
|
|
5/6/99 : created
|
|
|
|
Author:
|
|
|
|
Tom Green
|
|
|
|
|
|
****************************************************************************/
|
|
|
|
#ifndef _RNDISMP_H_
|
|
#define _RNDISMP_H_
|
|
|
|
#ifndef OID_GEN_RNDIS_CONFIG_PARAMETER
|
|
#define OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B // Set only
|
|
#endif
|
|
|
|
|
|
//
|
|
// DEBUG stuff
|
|
//
|
|
|
|
#if DBG
|
|
|
|
|
|
//
|
|
// Definitions for all of the Debug macros. If we're in a debug (DBG) mode,
|
|
// these macros will print information to the debug terminal. If the
|
|
// driver is compiled in a free (non-debug) environment the macros become
|
|
// NOPs.
|
|
//
|
|
|
|
VOID
|
|
NTAPI
|
|
DbgBreakPoint(VOID);
|
|
|
|
//
|
|
// DEBUG enable bit definitions
|
|
//
|
|
#define DBG_LEVEL0 0x1000 // Display TRACE0 messages
|
|
#define DBG_LEVEL1 0x0001 // Display TRACE1 messages
|
|
#define DBG_LEVEL2 0x0002 // Display TRACE2 messages
|
|
#define DBG_LEVEL3 0x0004 // Display TRACE3 messages
|
|
#define DBG_OID_LIST 0x0008 // display OID list
|
|
#define DBG_OID_NAME 0x0010 // display name of OID in query and set routines
|
|
#define DBG_DUMP 0x0020 // Display buffer dumps
|
|
#define DBG_LOG_SENDS 0x0100 // Log sent messages.
|
|
|
|
#define TRACE0(S) {if(RndismpDebugFlags & DBG_LEVEL0) {DbgPrint("RNDISMP: "); DbgPrint S;}}
|
|
#define TRACE1(S) {if(RndismpDebugFlags & DBG_LEVEL1) {DbgPrint("RNDISMP: "); DbgPrint S;}}
|
|
#define TRACE2(S) {if(RndismpDebugFlags & DBG_LEVEL2) {DbgPrint("RNDISMP: "); DbgPrint S;}}
|
|
#define TRACE3(S) {if(RndismpDebugFlags & DBG_LEVEL3) {DbgPrint("RNDISMP: "); DbgPrint S;}}
|
|
|
|
#define TRACEDUMP(_s, _buf, _len) {if(RndismpDebugFlags & DBG_DUMP) {DbgPrint("RNDISMP: "); DbgPrint _s; RndisPrintHexDump(_buf, _len);}}
|
|
|
|
#define DISPLAY_OID_LIST(Adapter) DisplayOidList(Adapter)
|
|
|
|
#define GET_OID_NAME(Oid) GetOidName(Oid)
|
|
|
|
#define OID_NAME_TRACE(Oid, s) \
|
|
{ \
|
|
if(RndismpDebugFlags & DBG_OID_NAME) \
|
|
DbgPrint("RNDISMP: %s: (%s) (%08X)\n", s, GET_OID_NAME(Oid), Oid); \
|
|
}
|
|
|
|
#undef ASSERT
|
|
#define ASSERT(exp) \
|
|
{ \
|
|
if(!(exp)) \
|
|
{ \
|
|
DbgPrint("Assertion Failed: %s:%d %s\n", \
|
|
__FILE__,__LINE__,#exp); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
}
|
|
|
|
#define DBGINT(S) \
|
|
{ \
|
|
DbgPrint("%s:%d - ", __FILE__, __LINE__); \
|
|
DbgPrint S; \
|
|
DbgBreakPoint(); \
|
|
}
|
|
|
|
|
|
// check frame for problems
|
|
#define CHECK_VALID_FRAME(Frame) \
|
|
{ \
|
|
ASSERT(Frame); \
|
|
if(Frame) \
|
|
{ \
|
|
if(Frame->Signature != FRAME_SIGNATURE) \
|
|
{ \
|
|
DbgPrint("RNDISMP: Invalid Frame (%p) Signature: %s:%d\n",\
|
|
Frame, __FILE__,__LINE__); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
// check adapter for problems
|
|
#define CHECK_VALID_ADAPTER(Adapter) \
|
|
{ \
|
|
ASSERT(Adapter); \
|
|
if(Adapter) \
|
|
{ \
|
|
if(Adapter->Signature != ADAPTER_SIGNATURE) \
|
|
{ \
|
|
DbgPrint("RNDISMP: Invalid Adapter Signature: %s:%d\n",\
|
|
__FILE__,__LINE__); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
// check block for problems
|
|
#define CHECK_VALID_BLOCK(Block) \
|
|
{ \
|
|
ASSERT(Block); \
|
|
if(Block) \
|
|
{ \
|
|
if(Block->Signature != BLOCK_SIGNATURE) \
|
|
{ \
|
|
DbgPrint("RNDISMP: Invalid Block Signature: %s:%d\n",\
|
|
__FILE__,__LINE__); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
|
|
#define RNDISMP_ASSERT_AT_PASSIVE() \
|
|
{ \
|
|
KIRQL Irql = KeGetCurrentIrql(); \
|
|
if (Irql != PASSIVE_LEVEL) \
|
|
{ \
|
|
DbgPrint("RNDISMP: found IRQL %d instead of passive!\n", Irql); \
|
|
DbgPrint("RNDISMP: at line %d, file %s\n", __LINE__, __FILE__); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
}
|
|
|
|
|
|
#define RNDISMP_ASSERT_AT_DISPATCH() \
|
|
{ \
|
|
KIRQL Irql = KeGetCurrentIrql(); \
|
|
if (Irql != DISPATCH_LEVEL) \
|
|
{ \
|
|
DbgPrint("RNDISMP: found IRQL %d instead of dispatch!\n", Irql); \
|
|
DbgPrint("RNDISMP: at line %d, file %s\n", __LINE__, __FILE__); \
|
|
DbgBreakPoint(); \
|
|
} \
|
|
}
|
|
|
|
|
|
#define DBG_LOG_SEND_MSG(_pAdapter, _pMsgFrame) \
|
|
{ \
|
|
if (RndismpDebugFlags & DBG_LOG_SENDS) \
|
|
{ \
|
|
RndisLogSendMessage(_pAdapter, _pMsgFrame); \
|
|
} \
|
|
}
|
|
|
|
#else // !DBG
|
|
|
|
|
|
#define TRACE0(S)
|
|
#define TRACE1(S)
|
|
#define TRACE2(S)
|
|
#define TRACE3(S)
|
|
#define TRACEDUMP(_s, _buf, _len)
|
|
|
|
#undef ASSERT
|
|
#define ASSERT(exp)
|
|
|
|
#define DBGINT(S)
|
|
|
|
#define CHECK_VALID_FRAME(Frame)
|
|
#define CHECK_VALID_ADAPTER(Adapter)
|
|
#define CHECK_VALID_BLOCK(Block)
|
|
#define DISPLAY_OID_LIST(Adapter)
|
|
#define OID_NAME_TRACE(Oid, s)
|
|
|
|
#define RNDISMP_ASSERT_AT_PASSIVE()
|
|
#define RNDISMP_ASSERT_AT_DISPATCH()
|
|
|
|
#define DBG_LOG_SEND_MSG(_pAdapter, _pMsgFrame)
|
|
#endif //DBG
|
|
|
|
|
|
//
|
|
// Defines
|
|
//
|
|
|
|
#define MINIMUM_ETHERNET_PACKET_SIZE 60
|
|
#define MAXIMUM_ETHERNET_PACKET_SIZE 1514
|
|
#define NUM_BYTES_PROTOCOL_RESERVED_SECTION (4*sizeof(PVOID))
|
|
#define ETHERNET_HEADER_SIZE 14
|
|
|
|
#define INITIAL_RECEIVE_FRAMES 20
|
|
#define MAX_RECEIVE_FRAMES 400
|
|
|
|
// this is the size of the buffer we will use to pass Data packet header data
|
|
// to the remote device.
|
|
#define RNDIS_PACKET_MESSAGE_HEADER_SIZE 128
|
|
|
|
// align all RNDIS packets on 4 byte boundaries
|
|
#define RNDIS_PACKET_MESSAGE_BOUNDARY (4)
|
|
|
|
#define ONE_SECOND 1000 // in milliseconds
|
|
|
|
#define KEEP_ALIVE_TIMER (5 * ONE_SECOND)
|
|
|
|
#define REQUEST_TIMEOUT (10 * ONE_SECOND)
|
|
|
|
#define FRAME_SIGNATURE ((ULONG)('GSRF'))
|
|
#define ADAPTER_SIGNATURE ((ULONG)('GSDA'))
|
|
#define BLOCK_SIGNATURE ((ULONG)('GSLB'))
|
|
|
|
#define RNDISMP_TAG_GEN_ALLOC ((ULONG)(' MNR'))
|
|
#define RNDISMP_TAG_SEND_FRAME ((ULONG)('sMNR'))
|
|
#define RNDISMP_TAG_RECV_DATA_FRAME ((ULONG)('rMNR'))
|
|
|
|
#if DBG
|
|
#define MINIPORT_INIT_TIMEOUT (10 * ONE_SECOND)
|
|
#define MINIPORT_HALT_TIMEOUT (5 * ONE_SECOND)
|
|
#else
|
|
#define MINIPORT_INIT_TIMEOUT (5 * ONE_SECOND)
|
|
#define MINIPORT_HALT_TIMEOUT (2 * ONE_SECOND)
|
|
#endif
|
|
|
|
#ifndef MAX
|
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
|
#endif
|
|
|
|
// flags for driver and device supported OIDs
|
|
#define OID_NOT_SUPPORTED 0x0000
|
|
#define DRIVER_SUPPORTED_OID 0x0001
|
|
#define DEVICE_SUPPORTED_OID 0x0002
|
|
|
|
|
|
//
|
|
// Defines for OID_GEN_MAC_OPTIONS - most of the bits returned
|
|
// in response to this query are driver-specific, however some
|
|
// are device-specific.
|
|
//
|
|
#define RNDIS_DRIVER_MAC_OPTIONS (NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | \
|
|
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND | \
|
|
NDIS_MAC_OPTION_NO_LOOPBACK)
|
|
|
|
#define RNDIS_DEVICE_MAC_OPTIONS_MASK NDIS_MAC_OPTION_8021P_PRIORITY
|
|
|
|
//
|
|
// Data structures
|
|
//
|
|
|
|
typedef NDIS_SPIN_LOCK RNDISMP_SPIN_LOCK;
|
|
|
|
|
|
#ifdef BUILD_WIN9X
|
|
|
|
//
|
|
// Equivalents of types defined for Win9X config mgr.
|
|
//
|
|
typedef ULONG MY_CONFIGRET;
|
|
typedef ULONG MY_DEVNODE;
|
|
typedef ULONG MY_CONFIGFUNC;
|
|
typedef ULONG MY_SUBCONFIGFUNC;
|
|
typedef MY_CONFIGRET (_cdecl *MY_CMCONFIGHANDLER)(MY_CONFIGFUNC, MY_SUBCONFIGFUNC, MY_DEVNODE, ULONG, ULONG);
|
|
|
|
#define MY_CR_SUCCESS 0x00000000
|
|
#define MY_CONFIG_PREREMOVE 0x0000000C
|
|
#define MY_CONFIG_PRESHUTDOWN 0x00000012
|
|
|
|
#endif
|
|
|
|
//
|
|
// This structure contains information about a specific
|
|
// microport the miniport sits on top of. One of these
|
|
// per microport
|
|
//
|
|
typedef struct _DRIVER_BLOCK
|
|
{
|
|
// NDIS wrapper handle from NdisInitializeWrapper
|
|
NDIS_HANDLE NdisWrapperHandle;
|
|
|
|
// The NDIS version we manage to register this miniport instance as.
|
|
UCHAR MajorNdisVersion;
|
|
UCHAR MinorNdisVersion;
|
|
|
|
struct _DRIVER_BLOCK *NextDriverBlock;
|
|
|
|
// pointer to driver object this block is associated with
|
|
PDRIVER_OBJECT DriverObject;
|
|
// intercepted dispatch function for IRP_MJ_PNP
|
|
PDRIVER_DISPATCH SavedPnPDispatch;
|
|
|
|
// Handlers registered by Remote NDIS microport
|
|
RM_DEVICE_INIT_HANDLER RmInitializeHandler;
|
|
RM_DEVICE_INIT_CMPLT_NOTIFY_HANDLER RmInitCompleteNotifyHandler;
|
|
RM_DEVICE_HALT_HANDLER RmHaltHandler;
|
|
RM_SHUTDOWN_HANDLER RmShutdownHandler;
|
|
RM_UNLOAD_HANDLER RmUnloadHandler;
|
|
RM_SEND_MESSAGE_HANDLER RmSendMessageHandler;
|
|
RM_RETURN_MESSAGE_HANDLER RmReturnMessageHandler;
|
|
|
|
// "Global" context for Microport
|
|
PVOID MicroportContext;
|
|
|
|
// list of adapters registered for this Miniport driver.
|
|
struct _RNDISMP_ADAPTER *AdapterList;
|
|
|
|
// number of adapters in use with this driver block
|
|
ULONG NumberAdapters;
|
|
|
|
// sanity check
|
|
ULONG Signature;
|
|
} DRIVER_BLOCK, *PDRIVER_BLOCK;
|
|
|
|
|
|
|
|
typedef
|
|
VOID
|
|
(*PRNDISMP_MSG_COMPLETE_HANDLER) (
|
|
IN struct _RNDISMP_MESSAGE_FRAME * pMsgFrame,
|
|
IN NDIS_STATUS Status
|
|
);
|
|
|
|
|
|
|
|
typedef
|
|
BOOLEAN
|
|
(*PRNDISMP_MSG_HANDLER_FUNC) (
|
|
IN struct _RNDISMP_ADAPTER * pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied
|
|
);
|
|
|
|
//
|
|
// One of these structures for each NDIS_PACKET that we send.
|
|
//
|
|
typedef struct _RNDISMP_PACKET_WRAPPER
|
|
{
|
|
struct _RNDISMP_MESSAGE_FRAME * pMsgFrame;
|
|
PNDIS_PACKET pNdisPacket;
|
|
struct _RNDISMP_VC * pVc;
|
|
|
|
// MDL to describe the RNDIS NdisPacket header:
|
|
PMDL pHeaderMdl;
|
|
|
|
// Last MDL in the list of MDLs describing this RNDIS packet.
|
|
PMDL pTailMdl;
|
|
|
|
// Space for the RNDIS Packet header:
|
|
UCHAR Packet[sizeof(PVOID)];
|
|
} RNDISMP_PACKET_WRAPPER, *PRNDISMP_PACKET_WRAPPER;
|
|
|
|
|
|
//
|
|
// Structure used to overlay the MiniportReserved field
|
|
// of outgoing (sent) packets.
|
|
//
|
|
typedef struct _RNDISMP_SEND_PKT_RESERVED
|
|
{
|
|
// Points to the next packet for multi-packet sends.
|
|
PNDIS_PACKET pNext;
|
|
|
|
// Points to more detailed information about this packet, too much
|
|
// to fit into one PVOID.
|
|
PRNDISMP_PACKET_WRAPPER pPktWrapper;
|
|
} RNDISMP_SEND_PKT_RESERVED, *PRNDISMP_SEND_PKT_RESERVED;
|
|
|
|
|
|
//
|
|
// Structure used to TEMPORARILY overlay the MiniportReserved field
|
|
// of sent packets -- this is used to link packets in a list pending
|
|
// actual transmission from a timeout routine.
|
|
//
|
|
typedef struct _RNDISMP_SEND_PKT_RESERVED_TEMP
|
|
{
|
|
LIST_ENTRY Link;
|
|
} RNDISMP_SEND_PKT_RESERVED_TEMP, *PRNDISMP_SEND_PKT_RESERVED_TEMP;
|
|
|
|
|
|
//
|
|
// Request context - holds information about a pended request (Set or Query)
|
|
//
|
|
typedef struct _RNDISMP_REQUEST_CONTEXT
|
|
{
|
|
PNDIS_REQUEST pNdisRequest;
|
|
struct _RNDISMP_VC * pVc;
|
|
NDIS_OID Oid;
|
|
PVOID InformationBuffer;
|
|
UINT InformationBufferLength;
|
|
PUINT pBytesRead; // for Set
|
|
PUINT pBytesWritten; // for Query
|
|
PUINT pBytesNeeded;
|
|
BOOLEAN bInternal;
|
|
NDIS_STATUS CompletionStatus;
|
|
ULONG RetryCount;
|
|
PNDIS_EVENT pEvent;
|
|
} RNDISMP_REQUEST_CONTEXT, *PRNDISMP_REQUEST_CONTEXT;
|
|
|
|
//
|
|
// Message Frame - generic structure to hold context about all
|
|
// messages sent via the microport.
|
|
//
|
|
typedef struct _RNDISMP_MESSAGE_FRAME
|
|
{
|
|
LIST_ENTRY Link; // used to queue this if
|
|
// a response is expected
|
|
// from the device.
|
|
ULONG RefCount; // Determines when to free
|
|
// this message frame.
|
|
struct _RNDISMP_ADAPTER * pAdapter;
|
|
struct _RNDISMP_VC * pVc;
|
|
union
|
|
{
|
|
PNDIS_PACKET pNdisPacket; // if DATA message
|
|
PRNDISMP_REQUEST_CONTEXT pReqContext; // if Request message
|
|
};
|
|
PMDL pMessageMdl; // what goes to the microport
|
|
UINT32 NdisMessageType;// copied from the RNDIS message
|
|
UINT32 RequestId; // to match requests/responses
|
|
|
|
PRNDISMP_MSG_COMPLETE_HANDLER pCallback; // called on completion of message send
|
|
|
|
ULONG TicksOnQueue;
|
|
ULONG TimeSent;
|
|
#if THROTTLE_MESSAGES
|
|
LIST_ENTRY PendLink; // used to queue this
|
|
// pending send to microport
|
|
#endif
|
|
ULONG Signature;
|
|
} RNDISMP_MESSAGE_FRAME, *PRNDISMP_MESSAGE_FRAME;
|
|
|
|
|
|
|
|
//
|
|
// linked list entry for transport frames (transmit, receive, request)
|
|
//
|
|
typedef struct _RNDISMP_LIST_ENTRY
|
|
{
|
|
LIST_ENTRY Link;
|
|
} RNDISMP_LIST_ENTRY, *PRNDISMP_LIST_ENTRY;
|
|
|
|
|
|
//
|
|
// RNDIS VC states.
|
|
//
|
|
typedef enum
|
|
{
|
|
RNDISMP_VC_ALLOCATED = 0,
|
|
RNDISMP_VC_CREATING,
|
|
RNDISMP_VC_CREATING_ACTIVATE_PENDING,
|
|
RNDISMP_VC_CREATING_DELETE_PENDING,
|
|
RNDISMP_VC_CREATE_FAILURE,
|
|
RNDISMP_VC_CREATED,
|
|
RNDISMP_VC_ACTIVATING,
|
|
RNDISMP_VC_ACTIVATED,
|
|
RNDISMP_VC_DEACTIVATING,
|
|
RNDISMP_VC_DEACTIVATED,
|
|
RNDISMP_VC_DELETING,
|
|
RNDISMP_VC_DELETE_FAIL
|
|
|
|
} RNDISMP_VC_STATE;
|
|
|
|
|
|
//
|
|
// RNDIS Call states.
|
|
//
|
|
typedef enum
|
|
{
|
|
RNDISMP_CALL_IDLE
|
|
// others TBD
|
|
|
|
} RNDISMP_CALL_STATE;
|
|
|
|
|
|
#define NULL_DEVICE_CONTEXT 0
|
|
|
|
|
|
//
|
|
// All information about a single VC/call.
|
|
//
|
|
typedef struct _RNDISMP_VC
|
|
{
|
|
// link to list of VCs on adapter.
|
|
LIST_ENTRY VcList;
|
|
|
|
// owning adapter
|
|
struct _RNDISMP_ADAPTER * pAdapter;
|
|
|
|
// VC handle sent to the device, also our hash lookup key.
|
|
UINT32 VcId;
|
|
|
|
// base VC state
|
|
RNDISMP_VC_STATE VcState;
|
|
|
|
// call state, relevant only for devices that are call managers.
|
|
RNDISMP_CALL_STATE CallState;
|
|
|
|
ULONG RefCount;
|
|
|
|
// NDIS Wrapper's handle for this Vc
|
|
NDIS_HANDLE NdisVcHandle;
|
|
|
|
// remote device's context for this VC
|
|
RNDIS_HANDLE DeviceVcContext;
|
|
|
|
RNDISMP_SPIN_LOCK Lock;
|
|
|
|
// sends on this VC that haven't been completed.
|
|
ULONG PendingSends;
|
|
|
|
// receive indications that haven't been returned to us.
|
|
ULONG PendingReceives;
|
|
|
|
// NDIS requests that haven't been completed.
|
|
ULONG PendingRequests;
|
|
|
|
// VC activation (or call setup) parameters.
|
|
PCO_CALL_PARAMETERS pCallParameters;
|
|
} RNDISMP_VC, *PRNDISMP_VC;
|
|
|
|
|
|
//
|
|
// VC hash table.
|
|
//
|
|
#define RNDISMP_VC_HASH_TABLE_SIZE 41
|
|
|
|
typedef struct _RNDISMP_VC_HASH_TABLE
|
|
{
|
|
ULONG NumEntries;
|
|
LIST_ENTRY HashEntry[RNDISMP_VC_HASH_TABLE_SIZE];
|
|
|
|
} RNDISMP_VC_HASH_TABLE, *PRNDISMP_VC_HASH_TABLE;
|
|
|
|
|
|
#define RNDISMP_HASH_VCID(_VcId) ((_VcId) % RNDISMP_VC_HASH_TABLE_SIZE)
|
|
|
|
|
|
//
|
|
// High and low watermarks for messages pending
|
|
// at the microport
|
|
//
|
|
#define RNDISMP_PENDED_SEND_HIWAT 0xffff
|
|
#define RNDISMP_PENDED_SEND_LOWAT 0xfff
|
|
|
|
|
|
typedef VOID (*RM_MULTIPLE_SEND_HANDLER) ();
|
|
|
|
//
|
|
// This structure contains all the information about a single
|
|
// adapter that this driver is controlling
|
|
//
|
|
typedef struct _RNDISMP_ADAPTER
|
|
{
|
|
// This is the handle given by the wrapper for calling NDIS functions.
|
|
NDIS_HANDLE MiniportAdapterHandle;
|
|
|
|
// pointer to next adapter in list hanging off driver block
|
|
struct _RNDISMP_ADAPTER *NextAdapter;
|
|
|
|
// pointer to driver block for this adapter
|
|
PDRIVER_BLOCK DriverBlock;
|
|
|
|
// Friendly name:
|
|
ANSI_STRING FriendlyNameAnsi;
|
|
UNICODE_STRING FriendlyNameUnicode;
|
|
|
|
#if THROTTLE_MESSAGES
|
|
// Counters for messages pending at the microport
|
|
ULONG HiWatPendedMessages;
|
|
ULONG LoWatPendedMessages;
|
|
ULONG CurPendedMessages;
|
|
|
|
// Messages not yet sent to microport.
|
|
LIST_ENTRY WaitingMessageList;
|
|
BOOLEAN SendInProgress;
|
|
#endif // THROTTLE_MESSAGES
|
|
// Messages sent to microport, awaiting completion
|
|
LIST_ENTRY PendingAtMicroportList;
|
|
BOOLEAN SendProcessInProgress;
|
|
LIST_ENTRY PendingSendProcessList;
|
|
NDIS_TIMER SendProcessTimer;
|
|
|
|
// Pool of RNDISMP_MESSAGE_FRAME structures
|
|
NPAGED_LOOKASIDE_LIST MsgFramePool;
|
|
BOOLEAN MsgFramePoolAlloced;
|
|
|
|
RNDIS_REQUEST_ID RequestId;
|
|
|
|
// Receive Routine Data Area
|
|
NDIS_HANDLE ReceivePacketPool;
|
|
NDIS_HANDLE ReceiveBufferPool;
|
|
ULONG InitialReceiveFrames;
|
|
ULONG MaxReceiveFrames;
|
|
NPAGED_LOOKASIDE_LIST RcvFramePool;
|
|
BOOLEAN RcvFramePoolAlloced;
|
|
BOOLEAN IndicatingReceives;
|
|
// Messages to be processed.
|
|
LIST_ENTRY PendingRcvMessageList;
|
|
NDIS_TIMER IndicateTimer;
|
|
|
|
// handlers registered by Remote NDIS microport
|
|
RM_DEVICE_INIT_HANDLER RmInitializeHandler;
|
|
RM_DEVICE_INIT_CMPLT_NOTIFY_HANDLER RmInitCompleteNotifyHandler;
|
|
RM_DEVICE_HALT_HANDLER RmHaltHandler;
|
|
RM_SHUTDOWN_HANDLER RmShutdownHandler;
|
|
RM_SEND_MESSAGE_HANDLER RmSendMessageHandler;
|
|
RM_RETURN_MESSAGE_HANDLER RmReturnMessageHandler;
|
|
|
|
// handler for DoMultipleSend
|
|
RM_MULTIPLE_SEND_HANDLER MultipleSendFunc;
|
|
|
|
// context for microport adapter
|
|
NDIS_HANDLE MicroportAdapterContext;
|
|
|
|
// pointer to list of OIDs supported
|
|
PNDIS_OID SupportedOIDList;
|
|
|
|
// size of OID list
|
|
UINT SupportedOIDListSize;
|
|
|
|
// pointer to list of flags indicating whether the OID is driver or device supported
|
|
PUINT OIDHandlerList;
|
|
|
|
// size of OID handler list
|
|
UINT OIDHandlerListSize;
|
|
|
|
// pointer to list of Driver OIDs
|
|
PNDIS_OID DriverOIDList;
|
|
|
|
// size of Driver OID list, in OIDs
|
|
UINT NumDriverOIDs;
|
|
|
|
// total number of OIDs we support
|
|
UINT NumOIDSupported;
|
|
|
|
// medium type supported by the device.
|
|
NDIS_MEDIUM Medium;
|
|
|
|
// device flags reported by the device.
|
|
ULONG DeviceFlags;
|
|
|
|
// max NDIS_PACKETs that can be sent in one RNDIS message
|
|
ULONG MaxPacketsPerMessage;
|
|
BOOLEAN bMultiPacketSupported;
|
|
|
|
// max message size supported for receive by the microport
|
|
ULONG MaxReceiveSize;
|
|
|
|
// max message size supported by the device
|
|
ULONG MaxTransferSize;
|
|
|
|
// alignment required by the device
|
|
ULONG AlignmentIncr;
|
|
ULONG AlignmentMask;
|
|
|
|
// list of message frames pending completion by the device
|
|
LIST_ENTRY PendingFrameList;
|
|
|
|
// synchronization
|
|
NDIS_SPIN_LOCK Lock;
|
|
|
|
// timer to see if we need to send a keep alive message
|
|
NDIS_TIMER KeepAliveTimer;
|
|
|
|
BOOLEAN TimerCancelled;
|
|
|
|
// timer tick saved last time a message was received from device
|
|
ULONG LastMessageFromDevice;
|
|
|
|
// used by check for hang handler to determine if the device is in trouble
|
|
BOOLEAN NeedReset;
|
|
|
|
// are we waiting for a response to NdisReset?
|
|
BOOLEAN ResetPending;
|
|
|
|
// used by check for hang handler to determine if the device is in trouble
|
|
BOOLEAN KeepAliveMessagePending;
|
|
|
|
// are we initializing?
|
|
BOOLEAN Initing;
|
|
|
|
// are we halting?
|
|
BOOLEAN Halting;
|
|
|
|
// to wait until we complete sending the Halt message
|
|
NDIS_EVENT HaltWaitEvent;
|
|
|
|
// request ID of last Keepalive message we have sent
|
|
RNDIS_REQUEST_ID KeepAliveMessagePendingId;
|
|
|
|
PRNDIS_INITIALIZE_COMPLETE pInitCompleteMessage;
|
|
|
|
// are we running on Win9x (WinMe)?
|
|
BOOLEAN bRunningOnWin9x;
|
|
|
|
// are we running on Win98 Gold?
|
|
BOOLEAN bRunningOnWin98Gold;
|
|
|
|
// CONDIS - Vc hash table
|
|
PRNDISMP_VC_HASH_TABLE pVcHashTable;
|
|
ULONG LastVcId;
|
|
|
|
// Statistics
|
|
RNDISMP_ADAPTER_STATS Statistics;
|
|
ULONG MaxSendCompleteTime;
|
|
|
|
// FDO for this device.
|
|
PVOID pDeviceObject;
|
|
|
|
// PDO for this device.
|
|
PVOID pPhysDeviceObject;
|
|
|
|
// MAC options
|
|
ULONG MacOptions;
|
|
|
|
// Max frame size
|
|
ULONG MaximumFrameSize;
|
|
|
|
// Max multicast list size
|
|
ULONG MaxMulticastListSize;
|
|
|
|
// Current 802.3 address
|
|
UCHAR MacAddress[ETH_LENGTH_OF_ADDRESS];
|
|
|
|
// sanity check
|
|
ULONG Signature;
|
|
|
|
#ifdef BUILD_WIN9X
|
|
MY_CMCONFIGHANDLER NdisCmConfigHandler;
|
|
MY_DEVNODE DevNode;
|
|
ULONG WrapContextOffset;
|
|
#endif
|
|
#if DBG
|
|
ULONG MicroportReceivesOutstanding;
|
|
PUCHAR pSendLogBuffer;
|
|
ULONG LogBufferSize;
|
|
PUCHAR pSendLogWrite;
|
|
#endif // DBG
|
|
|
|
|
|
} RNDISMP_ADAPTER, *PRNDISMP_ADAPTER;
|
|
|
|
typedef
|
|
VOID
|
|
(*RM_MULTIPLE_SEND_HANDLER) (
|
|
IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PPNDIS_PACKET PacketArray,
|
|
IN UINT NumberofPackets);
|
|
|
|
//
|
|
// Structure to keep context about a single received RNDIS message.
|
|
//
|
|
typedef struct _RNDISMP_RECV_MSG_CONTEXT
|
|
{
|
|
LIST_ENTRY Link;
|
|
NDIS_HANDLE MicroportMessageContext;
|
|
PMDL pMdl;
|
|
ULONG TotalLength;
|
|
PRNDIS_MESSAGE pMessage;
|
|
NDIS_STATUS ReceiveStatus;
|
|
BOOLEAN bMessageCopied;
|
|
RM_CHANNEL_TYPE ChannelType;
|
|
|
|
} RNDISMP_RECV_MSG_CONTEXT, *PRNDISMP_RECV_MSG_CONTEXT;
|
|
|
|
|
|
//
|
|
// Structure to keep context about a single received RNDIS_PACKET -message-.
|
|
// Note that this can contain more than one packet. We store a pointer to
|
|
// this structure in our reserved section of each received NDIS_PACKET.
|
|
//
|
|
typedef struct _RNDISMP_RECV_DATA_FRAME
|
|
{
|
|
NDIS_HANDLE MicroportMessageContext;
|
|
union {
|
|
PMDL pMicroportMdl;
|
|
PRNDIS_MESSAGE pLocalMessageCopy;
|
|
};
|
|
ULONG ReturnsPending;
|
|
BOOLEAN bMessageCopy; // did we make a copy?
|
|
} RNDISMP_RECV_DATA_FRAME, *PRNDISMP_RECV_DATA_FRAME;
|
|
|
|
|
|
//
|
|
// Per NDIS_PACKET context for received packets. This goes into MiniportReserved.
|
|
//
|
|
typedef struct _RNDISMP_RECV_PKT_RESERVED
|
|
{
|
|
PRNDISMP_RECV_DATA_FRAME pRcvFrame;
|
|
PRNDISMP_VC pVc;
|
|
} RNDISMP_RECV_PKT_RESERVED, *PRNDISMP_RECV_PKT_RESERVED;
|
|
|
|
|
|
//
|
|
// Used to overlay ProtocolReserved in a packet queued for indicating up.
|
|
//
|
|
typedef struct _RNDISMP_RECV_PKT_LINKAGE
|
|
{
|
|
LIST_ENTRY Link;
|
|
} RNDISMP_RECV_PKT_LINKAGE, *PRNDISMP_RECV_PKT_LINKAGE;
|
|
|
|
|
|
//
|
|
// Global Data
|
|
//
|
|
extern DRIVER_BLOCK RndismpMiniportBlockListHead;
|
|
|
|
extern UINT RndismpNumMicroports;
|
|
|
|
extern NDIS_SPIN_LOCK RndismpGlobalLock;
|
|
|
|
extern NDIS_OID RndismpSupportedOids[];
|
|
|
|
extern UINT RndismpSupportedOidsNum;
|
|
|
|
extern NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;
|
|
|
|
#if DBG
|
|
|
|
extern UINT RndismpDebugFlags;
|
|
|
|
#endif
|
|
|
|
|
|
//
|
|
// Macros
|
|
//
|
|
|
|
// Given a request message type value, return its completion message type
|
|
#define RNDIS_COMPLETION(_Type) ((_Type) | 0x80000000)
|
|
|
|
|
|
// Convert an RNdisMediumXXX value to its NdisMediumXXX equivalent
|
|
#define RNDIS_TO_NDIS_MEDIUM(_RndisMedium) ((NDIS_MEDIUM)(_RndisMedium))
|
|
|
|
#define RNDISMP_GET_ALIGNED_LENGTH(_AlignedLength, _InputLen, _pAdapter) \
|
|
{ \
|
|
ULONG _Length = _InputLen; \
|
|
if (_Length == 0) \
|
|
(_AlignedLength) = 0; \
|
|
else \
|
|
(_AlignedLength) = ((_Length + (_pAdapter)->AlignmentIncr) & \
|
|
(_pAdapter)->AlignmentMask); \
|
|
}
|
|
|
|
// The minimum MessageLength expected in an RNDIS message of a given type.
|
|
#define RNDISMP_MIN_MESSAGE_LENGTH(_MsgTypeField) \
|
|
FIELD_OFFSET(RNDIS_MESSAGE, Message) + sizeof(((PRNDIS_MESSAGE)0)->Message._MsgTypeField##)
|
|
|
|
// memory move macro
|
|
#define RNDISMP_MOVE_MEM(dest,src,size) NdisMoveMemory(dest,src,size)
|
|
|
|
// Macros to extract high and low bytes of a word.
|
|
#define MSB(Value) ((UCHAR)((((ULONG)Value) >> 8) & 0xff))
|
|
#define LSB(Value) ((UCHAR)(((ULONG)Value) & 0xff))
|
|
|
|
|
|
// Acquire the adapter lock
|
|
#define RNDISMP_ACQUIRE_ADAPTER_LOCK(_pAdapter) \
|
|
NdisAcquireSpinLock(&(_pAdapter)->Lock);
|
|
|
|
// Release the adapter lock
|
|
#define RNDISMP_RELEASE_ADAPTER_LOCK(_pAdapter) \
|
|
NdisReleaseSpinLock(&(_pAdapter)->Lock);
|
|
|
|
// Increment adapter statistics.
|
|
#define RNDISMP_INCR_STAT(_pAdapter, _StatsCount) \
|
|
NdisInterlockedIncrement(&(_pAdapter)->Statistics._StatsCount)
|
|
|
|
// Get adapter statistics
|
|
#define RNDISMP_GET_ADAPTER_STATS(_pAdapter, _StatsCount) \
|
|
((_pAdapter)->Statistics._StatsCount)
|
|
|
|
// Get the send packet reserved field
|
|
#define PRNDISMP_RESERVED_FROM_SEND_PACKET(_Packet) \
|
|
((PRNDISMP_SEND_PKT_RESERVED)((_Packet)->MiniportReserved))
|
|
|
|
#define PRNDISMP_RESERVED_TEMP_FROM_SEND_PACKET(_Packet) \
|
|
((PRNDISMP_SEND_PKT_RESERVED_TEMP)((_Packet)->MiniportReserved))
|
|
|
|
#define PRNDISMP_RESERVED_FROM_RECV_PACKET(_Packet) \
|
|
((PRNDISMP_RECV_PKT_RESERVED)((_Packet)->MiniportReserved))
|
|
|
|
// store receive frame context in miniport reserved field
|
|
#define RECEIVE_FRAME_TO_NDIS_PACKET(_Packet, _ReceiveFrame) \
|
|
{ \
|
|
PRNDISMP_RECEIVE_FRAME *TmpPtr; \
|
|
TmpPtr = (PRNDISMP_RECEIVE_FRAME *) \
|
|
&(_Packet->MiniportReserved); \
|
|
*TmpPtr = _ReceiveFrame; \
|
|
}
|
|
|
|
|
|
// Get adapter context from handle passed in NDIS routines
|
|
#define PRNDISMP_ADAPTER_FROM_CONTEXT_HANDLE(_Handle) \
|
|
((PRNDISMP_ADAPTER)(_Handle))
|
|
|
|
// Get miniport context handle from adapter context
|
|
#define CONTEXT_HANDLE_FROM_PRNDISMP_ADAPTER(_Ptr) \
|
|
((NDIS_HANDLE)(_Ptr))
|
|
|
|
// Get VC context from handle passed in from NDIS
|
|
#define PRNDISMP_VC_FROM_CONTEXT_HANDLE(_Handle) \
|
|
((PRNDISMP_VC)(_Handle))
|
|
|
|
// Get miniport context from VC
|
|
#define CONTEXT_HANDLE_FROM_PRNDISMP_VC(_pVc) \
|
|
((NDIS_HANDLE)(_Vc))
|
|
|
|
// Get message frame from message handle
|
|
#define MESSAGE_FRAME_FROM_HANDLE(_Handle) \
|
|
((PRNDISMP_MESSAGE_FRAME)(_Handle))
|
|
|
|
// Get a pointer to the data buff in an RNDIS_PACKET
|
|
#define GET_PTR_TO_RNDIS_DATA_BUFF(_Message) \
|
|
((PVOID) ((PUCHAR)(_Message) + _Message->DataOffset))
|
|
|
|
// Get a pointer to the OOBD data in an RNDIS_PACKET
|
|
#define GET_PTR_TO_OOB_DATA(_Message) \
|
|
((PVOID) ((PUCHAR)(_Message) + _Message->OOBDataOffset))
|
|
|
|
// Get a pointer to the per packet info in an RNDIS_PACKET
|
|
#define GET_PTR_TO_PER_PACKET_INFO(_Message) \
|
|
((PVOID) ((PUCHAR)(_Message) + _Message->PerPacketInfoOffset))
|
|
|
|
// Get an offset to the data buff in an RNDIS_PACKET
|
|
#define GET_OFFSET_TO_RNDIS_DATA_BUFF(_Message) \
|
|
(sizeof(RNDIS_PACKET))
|
|
|
|
// Get an offset to the OOBD data in an RNDIS_PACKET
|
|
#define GET_OFFSET_TO_OOB_DATA(_Message) \
|
|
(sizeof(RNDIS_PACKET) + Message->DataLength)
|
|
|
|
// Get an offset to the per packet info in an RNDIS_PACKET
|
|
#define GET_OFFSET_TO_PER_PACKET_INFO(_Message) \
|
|
(sizeof(RNDIS_PACKET) + _Message->DataLength + _Message->OOBDataLength)
|
|
|
|
#define RNDISMP_GET_INFO_BUFFER_FROM_QUERY_MSG(_Message) \
|
|
((PUCHAR)(_Message) + (_Message)->InformationBufferOffset)
|
|
|
|
#define MIN(x,y) ((x > y) ? y : x)
|
|
|
|
|
|
// Return the virtual address for a received message MDL.
|
|
#if defined(BUILD_WIN9X) || defined(BUILD_WIN2K)
|
|
#define RNDISMP_GET_MDL_ADDRESS(_pMdl) MmGetSystemAddressForMdl(_pMdl)
|
|
#else
|
|
#define RNDISMP_GET_MDL_ADDRESS(_pMdl) MmGetSystemAddressForMdlSafe(_pMdl, NormalPagePriority)
|
|
#endif
|
|
|
|
// Return the MDL chained to this MDL
|
|
#define RNDISMP_GET_MDL_NEXT(_pMdl) ((_pMdl)->Next)
|
|
|
|
// Return the MDL length
|
|
#define RNDISMP_GET_MDL_LENGTH(_pMdl) MmGetMdlByteCount(_pMdl)
|
|
|
|
// Access the RNDIS message from our Message Frame structure.
|
|
#define RNDISMP_GET_MSG_FROM_FRAME(_pMsgFrame) \
|
|
RNDISMP_GET_MDL_ADDRESS(_pMsgFrame->pMessageMdl)
|
|
|
|
// Return an RNDIS message back to the microport.
|
|
#if DBG
|
|
|
|
#define RNDISMP_RETURN_TO_MICROPORT(_pAdapter, _pMdl, _MicroportMsgContext) \
|
|
{ \
|
|
NdisInterlockedDecrement(&(_pAdapter)->MicroportReceivesOutstanding); \
|
|
(_pAdapter)->RmReturnMessageHandler((_pAdapter)->MicroportAdapterContext,\
|
|
(_pMdl), \
|
|
(_MicroportMsgContext)); \
|
|
}
|
|
|
|
#else
|
|
|
|
#define RNDISMP_RETURN_TO_MICROPORT(_pAdapter, _pMdl, _MicroportMsgContext) \
|
|
(_pAdapter)->RmReturnMessageHandler((_pAdapter)->MicroportAdapterContext,\
|
|
(_pMdl), \
|
|
(_MicroportMsgContext))
|
|
#endif // DBG
|
|
|
|
// Send an RNDIS message to the microport.
|
|
#if THROTTLE_MESSAGES
|
|
#define RNDISMP_SEND_TO_MICROPORT(_pAdapter, _pMsgFrame, _bQueueForResponse, _CallbackFunc) \
|
|
{ \
|
|
TRACE2(("Send: Adapter %x, MsgFrame %x, Mdl %x\n", \
|
|
_pAdapter, _pMsgFrame, _pMsgFrame->pMessageMdl)); \
|
|
(_pMsgFrame)->pCallback = _CallbackFunc; \
|
|
QueueMessageToMicroport(_pAdapter, _pMsgFrame, _bQueueForResponse); \
|
|
}
|
|
#else
|
|
#define RNDISMP_SEND_TO_MICROPORT(_pAdapter, _pMsgFrame, _bQueueForResponse, _CallbackFunc) \
|
|
{ \
|
|
(_pMsgFrame)->pCallback = _CallbackFunc; \
|
|
if (_bQueueForResponse) \
|
|
{ \
|
|
RNDISMP_ACQUIRE_ADAPTER_LOCK(_pAdapter); \
|
|
InsertTailList(&(_pAdapter)->PendingFrameList, &(_pMsgFrame)->Link);\
|
|
RNDISMP_RELEASE_ADAPTER_LOCK(_pAdapter); \
|
|
} \
|
|
(_pAdapter)->RmSendMessageHandler((_pAdapter)->MicroportAdapterContext, \
|
|
(_pMsgFrame)->pMessageMdl, \
|
|
(_pMsgFrame)); \
|
|
}
|
|
#endif // THROTTLE_MESSAGES
|
|
|
|
// Return the handler function for a given message type.
|
|
#define RNDISMP_GET_MSG_HANDLER(_pMsgHandlerFunc, _MessageType) \
|
|
{ \
|
|
switch (_MessageType) \
|
|
{ \
|
|
case REMOTE_NDIS_HALT_MSG: \
|
|
_pMsgHandlerFunc = HaltMessage; \
|
|
break; \
|
|
case REMOTE_NDIS_PACKET_MSG: \
|
|
_pMsgHandlerFunc = ReceivePacketMessage; \
|
|
break; \
|
|
case REMOTE_NDIS_INDICATE_STATUS_MSG: \
|
|
_pMsgHandlerFunc = IndicateStatusMessage; \
|
|
break; \
|
|
case REMOTE_NDIS_QUERY_CMPLT: \
|
|
case REMOTE_NDIS_SET_CMPLT: \
|
|
_pMsgHandlerFunc = QuerySetCompletionMessage; \
|
|
break; \
|
|
case REMOTE_NDIS_KEEPALIVE_MSG: \
|
|
_pMsgHandlerFunc = KeepAliveMessage; \
|
|
break; \
|
|
case REMOTE_NDIS_KEEPALIVE_CMPLT: \
|
|
_pMsgHandlerFunc = KeepAliveCompletionMessage; \
|
|
break; \
|
|
case REMOTE_NDIS_RESET_CMPLT: \
|
|
_pMsgHandlerFunc = ResetCompletionMessage; \
|
|
break; \
|
|
case REMOTE_NDIS_INITIALIZE_CMPLT: \
|
|
_pMsgHandlerFunc = InitCompletionMessage; \
|
|
break; \
|
|
case REMOTE_CONDIS_MP_CREATE_VC_CMPLT: \
|
|
_pMsgHandlerFunc = ReceiveCreateVcComplete; \
|
|
break; \
|
|
case REMOTE_CONDIS_MP_DELETE_VC_CMPLT: \
|
|
_pMsgHandlerFunc = ReceiveDeleteVcComplete; \
|
|
break; \
|
|
case REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT: \
|
|
_pMsgHandlerFunc = ReceiveActivateVcComplete; \
|
|
break; \
|
|
case REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT: \
|
|
_pMsgHandlerFunc = ReceiveDeactivateVcComplete; \
|
|
break; \
|
|
default: \
|
|
_pMsgHandlerFunc = UnknownMessage; \
|
|
break; \
|
|
} \
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Look up a message frame on the adapter given a request ID. If found,
|
|
// remove it from the pending list and return it.
|
|
//
|
|
#define RNDISMP_LOOKUP_PENDING_MESSAGE(_pMsgFrame, _pAdapter, _ReqId) \
|
|
{ \
|
|
PLIST_ENTRY _pEnt; \
|
|
PRNDISMP_MESSAGE_FRAME _pFrame; \
|
|
\
|
|
(_pMsgFrame) = NULL; \
|
|
RNDISMP_ACQUIRE_ADAPTER_LOCK(_pAdapter); \
|
|
for (_pEnt = (_pAdapter)->PendingFrameList.Flink; \
|
|
_pEnt != &(_pAdapter)->PendingFrameList; \
|
|
_pEnt = _pEnt->Flink) \
|
|
{ \
|
|
_pFrame = CONTAINING_RECORD(_pEnt, RNDISMP_MESSAGE_FRAME, Link); \
|
|
if (_pFrame->RequestId == (_ReqId)) \
|
|
{ \
|
|
RemoveEntryList(_pEnt); \
|
|
(_pMsgFrame) = _pFrame; \
|
|
break; \
|
|
} \
|
|
} \
|
|
RNDISMP_RELEASE_ADAPTER_LOCK(_pAdapter); \
|
|
}
|
|
|
|
|
|
#if DBG_TIME_STAMPS
|
|
#define RNDISMP_GET_TIME_STAMP(_pTs) \
|
|
{ \
|
|
LONGLONG systime_usec; \
|
|
NdisGetCurrentSystemTime((PVOID)&systime_usec); \
|
|
*_pTs = (ULONG)((*(PULONG)&systime_usec)/1000); \
|
|
}
|
|
#else
|
|
#define RNDISMP_GET_TIME_STAMP(_pTs)
|
|
#endif
|
|
|
|
#define RNDISMP_INIT_LOCK(_pLock) \
|
|
NdisAllocateSpinLock((_pLock));
|
|
|
|
#define RNDISMP_ACQUIRE_LOCK(_pLock) \
|
|
NdisAcquireSpinLock((_pLock));
|
|
|
|
#define RNDISMP_RELEASE_LOCK(_pLock) \
|
|
NdisReleaseSpinLock((_pLock));
|
|
|
|
#define RNDISMP_ACQUIRE_LOCK_DPC(_pLock) \
|
|
NdisDprAcquireSpinLock((_pLock));
|
|
|
|
#define RNDISMP_RELEASE_LOCK_DPC(_pLock) \
|
|
NdisDprReleaseSpinLock((_pLock));
|
|
|
|
|
|
#define RNDISMP_INIT_VC_LOCK(_pVc) \
|
|
RNDISMP_INIT_LOCK(&((_pVc)->Lock))
|
|
|
|
#define RNDISMP_ACQUIRE_VC_LOCK(_pVc) \
|
|
RNDISMP_ACQUIRE_LOCK(&((_pVc))->Lock)
|
|
|
|
#define RNDISMP_RELEASE_VC_LOCK(_pVc) \
|
|
RNDISMP_RELEASE_LOCK(&((_pVc))->Lock)
|
|
|
|
#define RNDISMP_ACQUIRE_VC_LOCK_DPC(_pVc) \
|
|
RNDISMP_ACQUIRE_LOCK_DPC(&((_pVc))->Lock)
|
|
|
|
#define RNDISMP_RELEASE_VC_LOCK_DPC(_pVc) \
|
|
RNDISMP_RELEASE_LOCK_DPC(&((_pVc))->Lock)
|
|
|
|
|
|
#define RNDISMP_REF_VC(_pVc) \
|
|
NdisInterlockedIncrement(&(_pVc)->RefCount);
|
|
|
|
#define RNDISMP_DEREF_VC(_pVc, _pRefCount) \
|
|
{ \
|
|
ULONG _RefCount; \
|
|
\
|
|
RNDISMP_ACQUIRE_VC_LOCK(_pVc); \
|
|
\
|
|
RNDISMP_DEREF_VC_LOCKED(_pVc, &_RefCount); \
|
|
*(_pRefCount) = _RefCount; \
|
|
if (_RefCount != 0) \
|
|
{ \
|
|
RNDISMP_RELEASE_VC_LOCK(_pVc); \
|
|
} \
|
|
}
|
|
|
|
#define RNDISMP_DEREF_VC_LOCKED(_pVc, _pRefCount) \
|
|
{ \
|
|
ULONG __RefCount; \
|
|
NDIS_HANDLE __NdisVcHandle; \
|
|
\
|
|
__RefCount = NdisInterlockedDecrement(&(_pVc)->RefCount); \
|
|
*(_pRefCount) = __RefCount; \
|
|
if (__RefCount == 0) \
|
|
{ \
|
|
RNDISMP_RELEASE_VC_LOCK(_pVc); \
|
|
DeallocateVc(_pVc); \
|
|
} \
|
|
else \
|
|
{ \
|
|
if ((__RefCount == 1) && \
|
|
((_pVc)->VcState == RNDISMP_VC_DEACTIVATED)) \
|
|
{ \
|
|
__NdisVcHandle = (_pVc)->NdisVcHandle; \
|
|
(_pVc)->VcState = RNDISMP_VC_CREATED; \
|
|
NdisInterlockedIncrement(&(_pVc)->RefCount); \
|
|
\
|
|
RNDISMP_RELEASE_VC_LOCK(_pVc); \
|
|
\
|
|
NdisMCoDeactivateVcComplete(NDIS_STATUS_SUCCESS, \
|
|
__NdisVcHandle); \
|
|
\
|
|
RNDISMP_ACQUIRE_VC_LOCK(_pVc); \
|
|
\
|
|
__RefCount = NdisInterlockedDecrement(&(_pVc)->RefCount); \
|
|
*(_pRefCount) = __RefCount; \
|
|
if (__RefCount == 0) \
|
|
{ \
|
|
RNDISMP_RELEASE_VC_LOCK(_pVc); \
|
|
DeallocateVc(_pVc); \
|
|
} \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
//
|
|
// Prototypes for functions in rndismp.c
|
|
//
|
|
|
|
NTSTATUS
|
|
DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
|
|
|
|
|
|
NDIS_STATUS
|
|
RndisMInitializeWrapper(OUT PNDIS_HANDLE pNdisWrapperHandle,
|
|
IN PVOID MicroportContext,
|
|
IN PVOID DriverObject,
|
|
IN PVOID RegistryPath,
|
|
IN PRNDIS_MICROPORT_CHARACTERISTICS pCharacteristics);
|
|
|
|
VOID
|
|
RndismpUnload(IN PDRIVER_OBJECT pDriverObject);
|
|
|
|
NTSTATUS
|
|
DllUnload(VOID);
|
|
|
|
VOID
|
|
RndismpHalt(IN NDIS_HANDLE MiniportAdapterContext);
|
|
|
|
VOID
|
|
RndismpInternalHalt(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN BOOLEAN bCalledFromHalt);
|
|
|
|
NDIS_STATUS
|
|
RndismpReconfigure(OUT PNDIS_STATUS pStatus,
|
|
IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_HANDLE ConfigContext);
|
|
|
|
NDIS_STATUS
|
|
RndismpReset(OUT PBOOLEAN AddressingReset,
|
|
IN NDIS_HANDLE MiniportAdapterContext);
|
|
|
|
BOOLEAN
|
|
RndismpCheckForHang(IN NDIS_HANDLE MiniportAdapterContext);
|
|
|
|
NDIS_STATUS
|
|
RndismpInitialize(OUT PNDIS_STATUS OpenErrorStatus,
|
|
OUT PUINT SelectedMediumIndex,
|
|
IN PNDIS_MEDIUM MediumArray,
|
|
IN UINT MediumArraySize,
|
|
IN NDIS_HANDLE MiniportAdapterHandle,
|
|
IN NDIS_HANDLE ConfigurationHandle);
|
|
|
|
VOID
|
|
RndisMSendComplete(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_HANDLE RndisMessageHandle,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
|
|
BOOLEAN
|
|
InitCompletionMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
HaltMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
ResetCompletionMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
KeepAliveCompletionMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
|
|
BOOLEAN
|
|
KeepAliveMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
VOID
|
|
RndismpShutdownHandler(IN NDIS_HANDLE MiniportAdapterContext);
|
|
|
|
VOID
|
|
RndismpDisableInterrupt(IN NDIS_HANDLE MiniportAdapterContext);
|
|
|
|
VOID
|
|
RndismpEnableInterrupt(IN NDIS_HANDLE MiniportAdapterContext);
|
|
|
|
VOID
|
|
RndismpHandleInterrupt(IN NDIS_HANDLE MiniportAdapterContext);
|
|
|
|
VOID
|
|
RndismpIsr(OUT PBOOLEAN InterruptRecognized,
|
|
OUT PBOOLEAN QueueDpc,
|
|
IN PVOID Context);
|
|
VOID
|
|
CompleteSendInit(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
VOID
|
|
CompleteSendHalt(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
VOID
|
|
CompleteSendReset(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
VOID
|
|
CompleteMiniportReset(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN NDIS_STATUS ResetStatus,
|
|
IN BOOLEAN AddressingReset);
|
|
|
|
NDIS_STATUS
|
|
ReadAndSetRegistryParameters(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN NDIS_HANDLE ConfigurationContext);
|
|
|
|
NDIS_STATUS
|
|
SendConfiguredParameter(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN NDIS_HANDLE ConfigHandle,
|
|
IN PNDIS_STRING pParameterName,
|
|
IN PNDIS_STRING pParameterType);
|
|
|
|
VOID
|
|
RndismpPnPEventNotify(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_DEVICE_PNP_EVENT EventCode,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength);
|
|
|
|
//
|
|
// Prototypes for functions in init.c
|
|
//
|
|
|
|
NDIS_STATUS
|
|
SetupSendQueues(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
NDIS_STATUS
|
|
SetupReceiveQueues(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
NDIS_STATUS
|
|
AllocateTransportResources(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
VOID
|
|
FreeTransportResources(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
VOID
|
|
FreeSendResources(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
VOID
|
|
FreeReceiveResources(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
|
|
//
|
|
// Prototypes for functions in receive.c
|
|
//
|
|
|
|
VOID
|
|
RndismpReturnPacket(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN PNDIS_PACKET Packet);
|
|
|
|
VOID
|
|
DereferenceRcvFrame(IN PRNDISMP_RECV_DATA_FRAME pRcvFrame,
|
|
IN PRNDISMP_ADAPTER pAdapter);
|
|
|
|
VOID
|
|
RndisMIndicateReceive(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN PMDL pMessageHead,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN RM_CHANNEL_TYPE ChannelType,
|
|
IN NDIS_STATUS ReceiveStatus);
|
|
VOID
|
|
IndicateReceive(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PRNDISMP_RECV_DATA_FRAME pRcvFrame,
|
|
IN PPNDIS_PACKET PacketArray,
|
|
IN ULONG NumberOfPackets,
|
|
IN NDIS_STATUS ReceiveStatus);
|
|
|
|
PRNDIS_MESSAGE
|
|
CoalesceMultiMdlMessage(IN PMDL pMdl,
|
|
IN ULONG TotalLength);
|
|
|
|
VOID
|
|
FreeRcvMessageCopy(IN PRNDIS_MESSAGE pMessage);
|
|
|
|
BOOLEAN
|
|
ReceivePacketMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
ReceivePacketMessageRaw(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
IndicateStatusMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
UnknownMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
PRNDISMP_RECV_DATA_FRAME
|
|
AllocateReceiveFrame(IN PRNDISMP_ADAPTER pAdapter);
|
|
|
|
VOID
|
|
FreeReceiveFrame(IN PRNDISMP_RECV_DATA_FRAME pRcvFrame,
|
|
IN PRNDISMP_ADAPTER pAdapter);
|
|
|
|
VOID
|
|
IndicateTimeout(IN PVOID SystemSpecific1,
|
|
IN PVOID Context,
|
|
IN PVOID SystemSpecific2,
|
|
IN PVOID SystemSpecific3);
|
|
|
|
//
|
|
// Prototypes for functions in send.c
|
|
//
|
|
|
|
VOID
|
|
RndismpMultipleSend(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN PPNDIS_PACKET PacketArray,
|
|
IN UINT NumberOfPackets);
|
|
|
|
VOID
|
|
DoMultipleSend(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PPNDIS_PACKET PacketArray,
|
|
IN UINT NumberOfPackets);
|
|
|
|
VOID
|
|
DoMultipleSendRaw(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PPNDIS_PACKET PacketArray,
|
|
IN UINT NumberOfPackets);
|
|
|
|
PRNDISMP_PACKET_WRAPPER
|
|
PrepareDataMessage(IN PNDIS_PACKET pNdisPacket,
|
|
IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN OUT PULONG pTotalMessageLength);
|
|
|
|
PRNDISMP_PACKET_WRAPPER
|
|
PrepareDataMessageRaw(IN PNDIS_PACKET pNdisPacket,
|
|
IN PRNDISMP_ADAPTER pAdapter,
|
|
IN OUT PULONG pTotalMessageLength);
|
|
|
|
PRNDISMP_PACKET_WRAPPER
|
|
AllocatePacketMsgWrapper(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN ULONG MsgHeaderLength);
|
|
|
|
VOID
|
|
FreePacketMsgWrapper(IN PRNDISMP_PACKET_WRAPPER pPktWrapper);
|
|
|
|
VOID
|
|
CompleteSendData(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
VOID
|
|
FreeMsgAfterSend(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
#if THROTTLE_MESSAGES
|
|
VOID
|
|
QueueMessageToMicroport(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN BOOLEAN bQueueMessageForResponse);
|
|
VOID
|
|
FlushPendingMessages(IN PRNDISMP_ADAPTER pAdapter);
|
|
#endif
|
|
|
|
VOID
|
|
SendProcessTimeout(IN PVOID SystemSpecific1,
|
|
IN PVOID Context,
|
|
IN PVOID SystemSpecific2,
|
|
IN PVOID SystemSpecific3);
|
|
|
|
//
|
|
// Prototypes for functions in request.c
|
|
//
|
|
|
|
NDIS_STATUS
|
|
RndismpQueryInformation(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG pBytesWritten,
|
|
OUT PULONG pBytesNeeded);
|
|
NDIS_STATUS
|
|
ProcessQueryInformation(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc,
|
|
IN PNDIS_REQUEST pRequest,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG pBytesWritten,
|
|
OUT PULONG pBytesNeeded);
|
|
|
|
NDIS_STATUS
|
|
RndismpSetInformation(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG pBytesRead,
|
|
OUT PULONG pBytesNeeded);
|
|
|
|
NDIS_STATUS
|
|
ProcessSetInformation(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PNDIS_REQUEST pRequest OPTIONAL,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG pBytesRead,
|
|
OUT PULONG pBytesNeeded);
|
|
|
|
NDIS_STATUS
|
|
DriverQueryInformation(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PNDIS_REQUEST pRequest OPTIONAL,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG pBytesWritten,
|
|
OUT PULONG pBytesNeeded);
|
|
|
|
NDIS_STATUS
|
|
DeviceQueryInformation(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PNDIS_REQUEST pRequest OPTIONAL,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG pBytesWritten,
|
|
OUT PULONG pBytesNeeded);
|
|
|
|
NDIS_STATUS
|
|
DriverSetInformation(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PNDIS_REQUEST pRequest OPTIONAL,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG pBytesRead,
|
|
OUT PULONG pBytesNeeded);
|
|
|
|
NDIS_STATUS
|
|
DeviceSetInformation(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc OPTIONAL,
|
|
IN PNDIS_REQUEST pRequest OPTIONAL,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength,
|
|
OUT PULONG pBytesRead,
|
|
OUT PULONG pBytesNeeded);
|
|
|
|
BOOLEAN
|
|
QuerySetCompletionMessage(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
VOID
|
|
CompleteSendDeviceRequest(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
#ifdef BUILD_WIN9X
|
|
|
|
VOID
|
|
CompleteSendDiscardDeviceRequest(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
#endif // BUILD_WIN9X
|
|
|
|
|
|
NDIS_STATUS
|
|
BuildOIDLists(IN PRNDISMP_ADAPTER Adapter,
|
|
IN PNDIS_OID DeviceOIDList,
|
|
IN UINT NumDeviceOID,
|
|
IN PNDIS_OID DriverOIDList,
|
|
IN UINT NumDriverOID);
|
|
|
|
UINT
|
|
GetOIDSupport(IN PRNDISMP_ADAPTER Adapter, IN NDIS_OID Oid);
|
|
|
|
VOID
|
|
FreeOIDLists(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
PRNDISMP_REQUEST_CONTEXT
|
|
AllocateRequestContext(IN PRNDISMP_ADAPTER pAdapter);
|
|
|
|
VOID
|
|
FreeRequestContext(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_REQUEST_CONTEXT pReqContext);
|
|
|
|
NDIS_STATUS
|
|
SyncQueryDevice(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN NDIS_OID Oid,
|
|
IN OUT PUCHAR InformationBuffer,
|
|
IN ULONG InformationBufferLength);
|
|
|
|
//
|
|
// Prototypes for functions in util.c
|
|
//
|
|
|
|
NDIS_STATUS
|
|
MemAlloc(OUT PVOID *Buffer, IN UINT Length);
|
|
|
|
VOID
|
|
MemFree(IN PVOID Buffer, IN UINT Length);
|
|
|
|
VOID
|
|
AddAdapter(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
VOID
|
|
RemoveAdapter(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
VOID
|
|
DeviceObjectToAdapterAndDriverBlock(IN PDEVICE_OBJECT pDeviceObject,
|
|
OUT PRNDISMP_ADAPTER * ppAdapter,
|
|
OUT PDRIVER_BLOCK * ppDriverBlock);
|
|
|
|
VOID
|
|
AddDriverBlock(IN PDRIVER_BLOCK Head, IN PDRIVER_BLOCK Item);
|
|
|
|
VOID
|
|
RemoveDriverBlock(IN PDRIVER_BLOCK BlockHead, IN PDRIVER_BLOCK Item);
|
|
|
|
PDRIVER_BLOCK
|
|
DeviceObjectToDriverBlock(IN PDRIVER_BLOCK Head,
|
|
IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
PDRIVER_BLOCK
|
|
DriverObjectToDriverBlock(IN PDRIVER_BLOCK Head,
|
|
IN PDRIVER_OBJECT DriverObject);
|
|
|
|
PRNDISMP_MESSAGE_FRAME
|
|
AllocateMsgFrame(IN PRNDISMP_ADAPTER pAdapter);
|
|
|
|
VOID
|
|
DereferenceMsgFrame(IN PRNDISMP_MESSAGE_FRAME pMsgFrame);
|
|
|
|
VOID
|
|
ReferenceMsgFrame(IN PRNDISMP_MESSAGE_FRAME pMsgFrame);
|
|
|
|
VOID
|
|
EnqueueNDISPacket(IN PRNDISMP_ADAPTER Adapter, IN PNDIS_PACKET Packet);
|
|
|
|
PNDIS_PACKET
|
|
DequeueNDISPacket(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
VOID
|
|
KeepAliveTimerHandler(IN PVOID SystemSpecific1,
|
|
IN PVOID Context,
|
|
IN PVOID SystemSpecific2,
|
|
IN PVOID SystemSpecific3);
|
|
|
|
VOID
|
|
CompleteSendKeepAlive(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
PRNDISMP_MESSAGE_FRAME
|
|
BuildRndisMessageCommon(IN PRNDISMP_ADAPTER Adapter,
|
|
IN PRNDISMP_VC pVc,
|
|
IN UINT NdisMessageType,
|
|
IN NDIS_OID Oid,
|
|
IN PVOID InformationBuffer,
|
|
IN ULONG InformationBufferLength);
|
|
|
|
|
|
PRNDISMP_MESSAGE_FRAME
|
|
AllocateMessageAndFrame(IN PRNDISMP_ADAPTER Adapter,
|
|
IN UINT MessageSize);
|
|
|
|
VOID
|
|
FreeAdapter(IN PRNDISMP_ADAPTER pAdapter);
|
|
|
|
PRNDISMP_VC
|
|
AllocateVc(IN PRNDISMP_ADAPTER pAdapter);
|
|
|
|
VOID
|
|
DeallocateVc(IN PRNDISMP_VC pVc);
|
|
|
|
PRNDISMP_VC
|
|
LookupVcId(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN UINT32 VcId);
|
|
|
|
VOID
|
|
EnterVcIntoHashTable(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc);
|
|
|
|
VOID
|
|
RemoveVcFromHashTable(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc);
|
|
|
|
//
|
|
// Prototypes for functions in comini.c
|
|
//
|
|
NDIS_STATUS
|
|
RndismpCoCreateVc(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_HANDLE NdisVcHandle,
|
|
IN PNDIS_HANDLE pMiniportVcContext);
|
|
|
|
VOID
|
|
CompleteSendCoCreateVc(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
VOID
|
|
HandleCoCreateVcFailure(IN PRNDISMP_VC pVc,
|
|
IN NDIS_STATUS Status);
|
|
|
|
NDIS_STATUS
|
|
RndismpCoDeleteVc(IN NDIS_HANDLE MiniportVcContext);
|
|
|
|
NDIS_STATUS
|
|
StartVcDeletion(IN PRNDISMP_VC pVc);
|
|
|
|
VOID
|
|
CompleteSendCoDeleteVc(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
VOID
|
|
HandleCoDeleteVcFailure(IN PRNDISMP_VC pVc,
|
|
IN NDIS_STATUS Status);
|
|
|
|
NDIS_STATUS
|
|
RndismpCoActivateVc(IN NDIS_HANDLE MiniportVcContext,
|
|
IN PCO_CALL_PARAMETERS pCallParameters);
|
|
|
|
NDIS_STATUS
|
|
StartVcActivation(IN PRNDISMP_VC pVc);
|
|
|
|
VOID
|
|
CompleteSendCoActivateVc(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
NDIS_STATUS
|
|
RndismpCoDeactivateVc(IN NDIS_HANDLE MiniportVcContext);
|
|
|
|
VOID
|
|
CompleteSendCoDeactivateVc(IN PRNDISMP_MESSAGE_FRAME pMsgFrame,
|
|
IN NDIS_STATUS SendStatus);
|
|
|
|
NDIS_STATUS
|
|
RndismpCoRequest(IN NDIS_HANDLE MiniportAdapterContext,
|
|
IN NDIS_HANDLE MiniportVcContext,
|
|
IN OUT PNDIS_REQUEST pRequest);
|
|
|
|
VOID
|
|
RndismpCoSendPackets(IN NDIS_HANDLE MiniportVcContext,
|
|
IN PNDIS_PACKET * PacketArray,
|
|
IN UINT NumberOfPackets);
|
|
|
|
BOOLEAN
|
|
ReceiveCreateVcComplete(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
ReceiveActivateVcComplete(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
ReceiveDeleteVcComplete(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
BOOLEAN
|
|
ReceiveDeactivateVcComplete(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDIS_MESSAGE pMessage,
|
|
IN PMDL pMdl,
|
|
IN ULONG TotalLength,
|
|
IN NDIS_HANDLE MicroportMessageContext,
|
|
IN NDIS_STATUS ReceiveStatus,
|
|
IN BOOLEAN bMessageCopied);
|
|
|
|
PRNDISMP_MESSAGE_FRAME
|
|
BuildRndisMessageCoMiniport(IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_VC pVc,
|
|
IN UINT NdisMessageType,
|
|
IN PCO_CALL_PARAMETERS pCallParameters OPTIONAL);
|
|
|
|
VOID
|
|
CompleteSendDataOnVc(IN PRNDISMP_VC pVc,
|
|
IN PNDIS_PACKET pNdisPacket,
|
|
IN NDIS_STATUS Status);
|
|
|
|
VOID
|
|
IndicateReceiveDataOnVc(IN PRNDISMP_VC pVc,
|
|
IN PNDIS_PACKET * PacketArray,
|
|
IN UINT NumberOfPackets);
|
|
|
|
//
|
|
// Prototypes for functions in wdmutil.c
|
|
//
|
|
|
|
PDRIVER_OBJECT
|
|
DeviceObjectToDriverObject(IN PDEVICE_OBJECT DeviceObject);
|
|
|
|
NTSTATUS
|
|
GetDeviceFriendlyName(IN PDEVICE_OBJECT pDeviceObject,
|
|
OUT PANSI_STRING pAnsiString,
|
|
OUT PUNICODE_STRING pUnicodeString);
|
|
|
|
VOID
|
|
HookPnpDispatchRoutine(IN PDRIVER_BLOCK DriverBlock);
|
|
|
|
NTSTATUS
|
|
PnPDispatch(IN PDEVICE_OBJECT pDeviceObject,
|
|
IN PIRP pIrp);
|
|
|
|
#ifdef BUILD_WIN9X
|
|
|
|
VOID
|
|
HookNtKernCMHandler(IN PRNDISMP_ADAPTER pAdapter);
|
|
|
|
VOID
|
|
UnHookNtKernCMHandler(IN PRNDISMP_ADAPTER pAdapter);
|
|
MY_CONFIGRET __cdecl
|
|
RndisCMHandler(IN MY_CONFIGFUNC cfFuncName,
|
|
IN MY_SUBCONFIGFUNC cfSubFuncName,
|
|
IN MY_DEVNODE cfDevNode,
|
|
IN ULONG dwRefData,
|
|
IN ULONG ulFlags);
|
|
|
|
#endif
|
|
|
|
#if DBG
|
|
|
|
//
|
|
// Prototypes for functions in debug.c
|
|
//
|
|
|
|
PCHAR
|
|
GetOidName(IN NDIS_OID Oid);
|
|
|
|
VOID
|
|
DisplayOidList(IN PRNDISMP_ADAPTER Adapter);
|
|
|
|
VOID
|
|
RndisPrintHexDump(PVOID Pointer,
|
|
ULONG Length);
|
|
|
|
VOID
|
|
RndisLogSendMessage(
|
|
IN PRNDISMP_ADAPTER pAdapter,
|
|
IN PRNDISMP_MESSAGE_FRAME pMsgFrame);
|
|
|
|
#endif
|
|
|
|
|
|
#endif // _RNDISMP_H_
|
|
|