Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

251 lines
6.4 KiB

/*++
Copyright (c) 1990-1995 Microsoft Corporation
Module Name:
mini.h
Abstract:
NDIS miniport wrapper definitions
Author:
Environment:
Kernel mode, FSD
Revision History:
Jun-95 Jameel Hyder Split up from a monolithic file
--*/
#ifndef __MINI_H
#define __MINI_H
//
// Macros for setting, clearing, and testing bits in the Miniport Flags.
//
#define MINIPORT_SET_FLAG(m, f) ((m)->Flags |= (f))
#define MINIPORT_CLEAR_FLAG(m, f) ((m)->Flags &= ~(f))
#define MINIPORT_TEST_FLAG(m, f) (((m)->Flags & (f)) != 0)
#define MINIPORT_SET_SEND_FLAG(m, f) ((m)->SendFlags |= (f))
#define MINIPORT_CLEAR_SEND_FLAG(m, f) ((m)->SendFlags &= ~(f))
#define MINIPORT_TEST_SEND_FLAG(m, f) (((m)->SendFlags & (f)) != 0)
//
// Flags for packet information.
//
#define MINIPORT_SET_PACKET_FLAG(p, f) ((p)->Private.NdisPacketFlags |= (f))
#define MINIPORT_CLEAR_PACKET_FLAG(p, f) ((p)->Private.NdisPacketFlags &= ~(f))
#define MINIPORT_TEST_PACKET_FLAG(p, f) (((p)->Private.NdisPacketFlags & (f)) != 0)
#define fPACKET_HAS_BEEN_LOOPED_BACK 0x01
#define fPACKET_HAS_TIMED_OUT 0x02
#define fPACKET_IS_IN_NDIS 0x04
#define NDIS_STATISTICS_HEADER_SIZE FIELD_OFFSET(NDIS_STATISTICS_VALUE,Data[0])
//
// Timeout values
//
#define NDIS_MINIPORT_WAKEUP_TIMEOUT 2000 // Wakeup DPC
#define NDIS_MINIPORT_DEFERRED_TIMEOUT 15 // Deferred timer
#define NDIS_MINIPORT_TR_RESET_TIMEOUT 15 // Number of WakeUps per reset attempt
//
// Internal definitions
//
typedef struct _NDIS_PACKET_RESERVED
{
PNDIS_PACKET Next;
PNDIS_M_OPEN_BLOCK Open;
} NDIS_PACKET_RESERVED, *PNDIS_PACKET_RESERVED;
#define PNDIS_RESERVED_FROM_PNDIS_PACKET(_packet) \
((PNDIS_PACKET_RESERVED)((_packet)->WrapperReserved))
//
// This structure is used by IndicatePacket/ReturnPacket code
// to keep track of references.
//
typedef struct _NDIS_PACKET_REFERENCE
{
PNDIS_MINIPORT_BLOCK Miniport;
union
{
UINT RefCount;
PNDIS_PACKET NextPacket;
};
} NDIS_PACKET_REFERENCE, *PNDIS_PACKET_REFERENCE;
#define PNDIS_REFERENCE_FROM_PNDIS_PACKET(_packet) \
((PNDIS_PACKET_REFERENCE)((_packet)->WrapperReserved))
//
// Used by the NdisCoRequest api to keep context information in the Request->NdisReserved
//
typedef struct _NDIS_COREQ_RESERVED
{
union
{
REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
CO_REQUEST_COMPLETE_HANDLER CoRequestCompleteHandler;
};
NDIS_HANDLE VcContext;
union
{
NDIS_HANDLE AfContext;
PNDIS_M_OPEN_BLOCK Open;
};
NDIS_HANDLE PartyContext;
ULONG Flags;
PNDIS_REQUEST RealRequest;
} NDIS_COREQ_RESERVED, *PNDIS_COREQ_RESERVED;
#define COREQ_DOWNLEVEL 0x00000001
#define COREQ_GLOBAL_REQ 0x00000002
#define COREQ_QUERY_OIDS 0x00000004
#define COREQ_QUERY_STATS 0x00000008
#define COREQ_QUERY_SET 0x00000010
#define PNDIS_COREQ_RESERVED_FROM_REQUEST(_request) \
(PNDIS_COREQ_RESERVED)((_request)->NdisReserved)
#define MINIPORT_ENABLE_INTERRUPT(_M_) \
{ \
if ((_M_)->EnableInterruptHandler != NULL) \
{ \
((_M_)->EnableInterruptHandler)((_M_)->MiniportAdapterContext); \
} \
}
#define MINIPORT_SYNC_ENABLE_INTERRUPT(_M_) \
{ \
if ((_M_)->EnableInterruptHandler != NULL) \
{ \
SYNC_WITH_ISR(((_M_))->Interrupt->InterruptObject, \
((_M_)->EnableInterruptHandler), \
(_M_)->MiniportAdapterContext); \
} \
}
#define MINIPORT_DISABLE_INTERRUPT(_M_) \
{ \
ASSERT((_M_)->DisableInterruptHandler != NULL); \
((_M_)->DriverHandle->MiniportCharacteristics.DisableInterruptHandler)( \
(_M_)->MiniportAdapterContext); \
}
#define MINIPORT_SYNC_DISABLE_INTERRUPT(_M_) \
{ \
if ((_M_)->DisableInterruptHandler != NULL) \
{ \
SYNC_WITH_ISR(((_M_))->Interrupt->InterruptObject, \
((_M_)->DisableInterruptHandler), \
(_M_)->MiniportAdapterContext); \
} \
}
#define CHECK_FOR_NORMAL_INTERRUPTS(_M_) \
if ((((_M_)->Flags & (fMINIPORT_HALTING | fMINIPORT_IN_INITIALIZE)) == 0)&& \
((_M_)->Interrupt != NULL) && \
!(_M_)->Interrupt->IsrRequested && \
!(_M_)->Interrupt->SharedInterrupt) \
{ \
(_M_)->Flags |= fMINIPORT_NORMAL_INTERRUPTS; \
} \
else \
{ \
(_M_)->Flags &= ~fMINIPORT_NORMAL_INTERRUPTS; \
}
#define EXPERIMENTAL_SIZE 4
extern PNDIS_M_DRIVER_BLOCK ndisMiniDriverList;
extern KSPIN_LOCK ndisDriverListLock;
extern NDIS_MEDIUM * ndisMediumArray,
ndisMediumBuffer[NdisMediumMax + EXPERIMENTAL_SIZE];
extern UINT ndisMediumArraySize, ndisMediumArrayMaxSize;
//
// Filter package callback handlers
//
#define PNDIS_M_OPEN_FROM_BINDING_HANDLE(_handle) ((PNDIS_M_OPEN_BLOCK)(_handle))
typedef
NDIS_STATUS
(*WAN_RECEIVE_HANDLER) (
IN NDIS_HANDLE NdisLinkContext,
IN PUCHAR Packet,
IN ULONG PacketSize
);
typedef
NDIS_STATUS
(*PNDIS_M_WAN_SEND)(
IN NDIS_HANDLE NdisBindingHandle,
IN NDIS_HANDLE NdisLinkHandle,
IN PVOID Packet
);
VOID
ndisLastCountRemovedFunction(
IN struct _KDPC *Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
);
typedef struct _AsyncWorkItem
{
WORK_QUEUE_ITEM ExWorkItem;
PNDIS_MINIPORT_BLOCK Miniport;
ULONG Length;
BOOLEAN Cached;
PVOID VAddr;
PVOID Context;
NDIS_PHYSICAL_ADDRESS PhyAddr;
} ASYNC_WORKITEM, *PASYNC_WORKITEM;
VOID
ndisMQueuedAllocateSharedHandler(
IN PASYNC_WORKITEM pWorkItem
);
VOID
ndisMQueuedFreeSharedHandler(
IN PASYNC_WORKITEM pWorkItem
);
//
// Macro for the deferred send handler.
//
#define NDISM_START_SENDS(_M) (_M)->DeferredSendHandler((_M))
#define NDISM_DEFER_PROCESS_DEFERRED(_M) NdisSetTimer((_M)->DeferredTimer, NDIS_MINIPORT_DEFERRED_TIMEOUT);
//
// A list of registered address families are maintained here.
//
typedef struct _NDIS_AF_LIST
{
struct _NDIS_AF_LIST *NextGlobal; // Global. Head at ndisAfList;
struct _NDIS_AF_LIST *NextOpen; // For this miniport Head at NDIS_MINIPORT_BLOCK
PNDIS_M_OPEN_BLOCK Open; // Back pointer to the open-block
NDIS_AF AddressFamily;
NDIS_CALL_MANAGER_CHARACTERISTICS CmChars;
} NDIS_AF_LIST, *PNDIS_AF_LIST;
extern PNDIS_AF_LIST ndisAfList;
#endif // __MINI_H