From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/ntos/ndis/ndis30/wrapper.h | 473 +++++++++++++++++++++++++++++++++++++ 1 file changed, 473 insertions(+) create mode 100644 private/ntos/ndis/ndis30/wrapper.h (limited to 'private/ntos/ndis/ndis30/wrapper.h') diff --git a/private/ntos/ndis/ndis30/wrapper.h b/private/ntos/ndis/ndis30/wrapper.h new file mode 100644 index 000000000..8885bd800 --- /dev/null +++ b/private/ntos/ndis/ndis30/wrapper.h @@ -0,0 +1,473 @@ +#include +#include +#include +#include + + +#if defined(BUILD_FOR_3_5) || defined(BUILD_FOR_3_1) + +#define Increment(a,b) ExInterlockedIncrementLong(a,b) +#define Decrement(a,b) ExInterlockedDecrementLong(a,b) + +#else + +#define Increment(a,b) InterlockedIncrement(a) +#define Decrement(a,b) InterlockedDecrement(a) + +#endif + +#if defined(BUILD_FOR_3_1) + +#define FASTCALL + +#define MmLockPagableImageSection(a) NULL +#define MmUnlockPagableImageSection(a) + +#define COMPUTE_PAGES_SPANNED(Va, Size) \ + ((((ULONG)Va & (PAGE_SIZE -1)) + (Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT) + +#define Int32x32To64(a,b) RtlEnlargedIntegerMultiply((a),(b)).QuadPart + +#define ExAllocatePoolWithTag(a,b,c) ExAllocatePool((a),(b)) + +NTSTATUS +NTAPI +RtlCharToInteger ( + PCSZ String, + ULONG Base, + PULONG Value + ); + +#endif + +#if defined(BUILD_FOR_3_5) +#define MmLockPagableCodeSection(x) MmLockPagableImageSection(x) +#endif + +#define ACQUIRE_SPIN_LOCK(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql) +#define RELEASE_SPIN_LOCK(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock, (_SpinLock)->OldIrql) +#define ACQUIRE_SPIN_LOCK_DPC(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock) +#define RELEASE_SPIN_LOCK_DPC(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock) + + +#if DBG +#define NDISDBG 0 +#endif +#if !defined(NDISDBG) +#define NDISDBG 0 +#endif + +#if NDISDBG + +#if defined(MEMPRINT) +#include "memprint.h" //DavidTr's memprint program at ntos\srv +#endif // MEMPRINT + +extern int NdisMsgLevel; +extern BOOLEAN NdisChkErrorFlag; + +#define TRACE_NONE 0x0000 +#define TRACE_IMPT 0x0001 +#define TRACE_ALL 0x0002 + +#define IF_TRACE(level) if ( NdisMsgLevel >= (level) ) //for tracing + +#define IF_ERROR_CHK if (NdisChkErrorFlag) // for parameter checking + +#define DbgIsNonPaged(_Address) \ + ( MmIsNonPagedSystemAddressValid((PVOID)(_Address)) ) + +#define DbgIsPacket(_Packet) \ + ( ((_Packet)->Private.Pool->PacketLength) > sizeof(_Packet) ) + +#define DbgIsNull(_Ptr) ( ((PVOID)(_Ptr)) == NULL ) + +#define NdisPrint1(fmt) DbgPrint(fmt) +#define NdisPrint2(fmt,v1) DbgPrint(fmt,v1) +#define NdisPrint3(fmt,v1,v2) DbgPrint(fmt,v1,v2) +#define NdisPrint4(fmt,v1,v2,v3) DbgPrint(fmt,v1,v2,v3) +#define NdisPrint5(fmt,v1,v2,v3,v4) DbgPrint(fmt,v1,v2,v3,v4) + +#else // NDISDBG + +#define IF_TRACE(level) if (FALSE) +#define IF_ERROR_CHK if (FALSE) + +#define DbgIsNonPaged(_Address) TRUE +#define DbgIsPacket(_Packet) TRUE +#define DbgIsNull(_Ptr) FALSE + +#define NdisPrint1(fmt) +#define NdisPrint2(fmt,v1) +#define NdisPrint3(fmt,v1,v2) +#define NdisPrint4(fmt,v1,v2,v3) +#define NdisPrint5(fmt,v1,v2,v3,v4) + +#endif // NDISDBG + + +#if DBG +#define MINIPORT_AT_DPC_LEVEL (KeGetCurrentIrql() == DISPATCH_LEVEL) +#else +#define MINIPORT_AT_DPC_LEVEL 1 +#endif + + +// +// This is the number of extra OIDs that ARCnet with Ethernet encapsulation +// supports. +// +#define ARC_NUMBER_OF_EXTRA_OIDS 2 + + + +// +// Internal wrapper data structures. +// + +// +// NDIS_WRAPPER_CONTEXT +// +// This data structure contains internal data items for use by the wrapper. +// + +typedef struct _NDIS_WRAPPER_CONTEXT { + + // + // Mac/miniport defined shutdown context. + // + + PVOID ShutdownContext; + + // + // Mac/miniport registered shutdown handler. + // + + ADAPTER_SHUTDOWN_HANDLER ShutdownHandler; + +#if !defined(BUILD_FOR_3_1) + // + // Kernel bugcheck record for bugcheck handling. + // + + KBUGCHECK_CALLBACK_RECORD BugcheckCallbackRecord; +#endif + + // + // Miniport assigned resources for PCI, PCMCIA, EISA, etc. + // + + PCM_RESOURCE_LIST AssignedSlotResources; + + // + // HAL common buffer cache. + // + + PVOID SharedMemoryPage[2]; + ULONG SharedMemoryLeft[2]; + NDIS_PHYSICAL_ADDRESS SharedMemoryAddress[2]; + +} NDIS_WRAPPER_CONTEXT, *PNDIS_WRAPPER_CONTEXT; + +// +// Lock/unlock miniport macros. +// + +#define LOCK_MINIPORT(_M_, _L) \ +{ \ + if (_M_->LockAcquired) { \ + _L = FALSE; \ + } else { \ + _L = TRUE; \ + _M_->LockAcquired = TRUE; \ + } \ +} + +#define UNLOCK_MINIPORT(_M_, _L) \ +{ \ + if (_L) { \ + _M_->LockAcquired = FALSE; \ + } \ +} + + +NDIS_STATUS +NdisInitialInit( + PDRIVER_OBJECT Driver OPTIONAL + ); + +VOID +FASTCALL +MiniportProcessDeferred( + PNDIS_MINIPORT_BLOCK Miniport + ); + +NDIS_STATUS +NdisMTransferDataSync( + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + IN OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred + ); + +#define MINIPORT_DISABLE_INTERRUPT(_M_) \ +{ \ + ASSERT(_M_->DriverHandle->MiniportCharacteristics.DisableInterruptHandler != NULL); \ + (_M_->DriverHandle->MiniportCharacteristics.DisableInterruptHandler)( \ + _M_->MiniportAdapterContext \ + ); \ +} + +#define MINIPORT_SYNC_DISABLE_INTERRUPT(_M_) \ +{ \ + if (_M_->DriverHandle->MiniportCharacteristics.DisableInterruptHandler != NULL) { \ + KeSynchronizeExecution( \ + (_M_)->Interrupt->InterruptObject, \ + (PKSYNCHRONIZE_ROUTINE)(_M_->DriverHandle->MiniportCharacteristics.DisableInterruptHandler),\ + _M_->MiniportAdapterContext \ + ); \ + } \ +} + +#define CHECK_FOR_NORMAL_INTERRUPTS(_Miniport) \ + _Miniport->NormalInterrupts = (BOOLEAN)(!_Miniport->HaltingMiniport && \ + !_Miniport->InInitialize && \ + (_Miniport->Interrupt != NULL) && \ + !_Miniport->Interrupt->IsrRequested && \ + !_Miniport->Interrupt->SharedInterrupt) + +// +// general reference/dereference functions +// + +BOOLEAN +NdisReferenceRef( + IN PREFERENCE RefP + ); + + +BOOLEAN +NdisDereferenceRef( + PREFERENCE RefP + ); + + +VOID +NdisInitializeRef( + PREFERENCE RefP + ); + + +BOOLEAN +NdisCloseRef( + PREFERENCE RefP + ); + + +/*++ +BOOLEAN +NdisReferenceProtocol( + IN PNDIS_PROTOCOL_BLOCK ProtP + ); +--*/ + +#define NdisReferenceProtocol(ProtP) \ + NdisReferenceRef(&(ProtP)->Ref) + + + +BOOLEAN +QueueOpenOnProtocol( + IN PNDIS_OPEN_BLOCK OpenP, + IN PNDIS_PROTOCOL_BLOCK ProtP + ); + + +/*++ +VOID +NdisDereferenceProtocol( + PNDIS_PROTOCOL_BLOCK ProtP + ); +--*/ +#define NdisDereferenceProtocol(ProtP) { \ + if (NdisDereferenceRef(&(ProtP)->Ref)) { \ + ExFreePool((PVOID)(ProtP)); \ + } \ +} + + + +VOID +NdisDeQueueOpenOnProtocol( + PNDIS_OPEN_BLOCK OpenP, + PNDIS_PROTOCOL_BLOCK ProtP + ); + + +BOOLEAN +NdisFinishOpen( + PNDIS_OPEN_BLOCK OpenP + ); + + +VOID +NdisKillOpenAndNotifyProtocol( + PNDIS_OPEN_BLOCK OldOpenP + ); + + +BOOLEAN +NdisKillOpen( + PNDIS_OPEN_BLOCK OldOpenP + ); + +/*++ +BOOLEAN +NdisReferenceMac( + IN PNDIS_MAC_BLOCK MacP + ); +--*/ +#define NdisReferenceMac(MacP) \ + NdisReferenceRef(&(MacP)->Ref) + +static +VOID +NdisDereferenceMac( + PNDIS_MAC_BLOCK MacP + ); + +BOOLEAN +NdisQueueAdapterOnMac( + PNDIS_ADAPTER_BLOCK AdaptP, + PNDIS_MAC_BLOCK MacP + ); + +VOID +NdisDeQueueAdapterOnMac( + PNDIS_ADAPTER_BLOCK AdaptP, + PNDIS_MAC_BLOCK MacP + ); + +/*++ +BOOLEAN +NdisReferenceAdapter( + IN PNDIS_ADAPTER_BLOCK AdaptP + ); +--*/ +#define NdisReferenceAdapter(AdaptP) \ + NdisReferenceRef(&(AdaptP)->Ref) + + +BOOLEAN +NdisQueueOpenOnAdapter( + PNDIS_OPEN_BLOCK OpenP, + PNDIS_ADAPTER_BLOCK AdaptP + ); + +VOID +NdisKillAdapter( + PNDIS_ADAPTER_BLOCK OldAdaptP + ); + +VOID +NdisDereferenceAdapter( + PNDIS_ADAPTER_BLOCK AdaptP + ); + +VOID +NdisDeQueueOpenOnAdapter( + PNDIS_OPEN_BLOCK OpenP, + PNDIS_ADAPTER_BLOCK AdaptP + ); + +NDIS_STATUS +NdisCallDriverAddAdapter( + IN PNDIS_MAC_BLOCK NewMacP + ); + +/*++ +BOOLEAN +NdisReferenceDriver( + IN PNDIS_M_DRIVER_BLOCK DriverP + ); +--*/ +#define NdisReferenceDriver(DriverP) \ + NdisReferenceRef(&(DriverP)->Ref) + + +VOID +NdisDereferenceDriver( + PNDIS_M_DRIVER_BLOCK DriverP + ); + +BOOLEAN +NdisQueueMiniportOnDriver( + PNDIS_MINIPORT_BLOCK MiniportP, + PNDIS_M_DRIVER_BLOCK DriverP + ); + +VOID +NdisDequeueMiniportOnDriver( + PNDIS_MINIPORT_BLOCK MiniportP, + PNDIS_M_DRIVER_BLOCK DriverP + ); + +BOOLEAN +NdisQueueOpenOnMiniport( + PNDIS_M_OPEN_BLOCK OpenP, + PNDIS_MINIPORT_BLOCK MiniportP + ); + +VOID +NdisKillMiniport( + PNDIS_MINIPORT_BLOCK OldMiniportP + ); + +/*++ +BOOLEAN +NdisReferenceMiniport( + IN PNDIS_MINIPORT_BLOCK MiniportP + ); +--*/ +#define NdisReferenceMiniport(MiniportP) \ + NdisReferenceRef(&(MiniportP)->Ref) + +VOID +NdisDereferenceMiniport( + PNDIS_MINIPORT_BLOCK MiniportP + ); + +VOID +NdisDeQueueOpenOnMiniport( + PNDIS_M_OPEN_BLOCK OpenP, + PNDIS_MINIPORT_BLOCK MiniportP + ); + +VOID +MiniportInitializePackage( + VOID + ); + +VOID +MiniportReferencePackage( + VOID + ); + +VOID +MiniportDereferencePackage( + VOID + ); + +NDIS_STATUS ArcConvertOidListToEthernet( + IN PNDIS_OID pOidList, + IN PULONG pcbOidList, + IN PNDIS_OID pTmpBuffer +); + +VOID +NdisBugcheckHandler( + IN PNDIS_WRAPPER_CONTEXT WrapperContext, + IN ULONG Size + ); -- cgit v1.2.3