|
|
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
//
// Copyright (c) 1985-2000 Microsoft Corporation
//
// This file is part of the Microsoft Research IPv6 Network Protocol Stack.
// You should have received a copy of the Microsoft End-User License Agreement
// for this software along with this release; see the file "license.txt".
// If not, please see http://www.research.microsoft.com/msripv6/license.htm,
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
//
// Abstract:
//
// General include file for definitions we want everywhere.
//
#ifndef OSCFG_INCLUDED
#define OSCFG_INCLUDED
//
// We want to cast pointer l-values for use with the += operator.
//
#pragma warning(disable:4213) // cast on l-value
#pragma warning(disable:4152) // function/data pointer conversion in expression
#pragma warning(disable:4200) // zero-sized array in struct/union
//
// We often use int rather than BOOLEAN since the assembly is often more
// efficient.
//
#pragma warning(disable:4244) // conversion from 'int' to 'BOOLEAN'
//
// Temporarily disable 4127 which is hit by PAGED_CODE(), KeQueryTickCount(),
// etc.
//
#pragma warning(disable:4127) // conditional expression is constant
#if defined (_WIN64)
#define MAX_CACHE_LINE_SIZE 128
#else
#define MAX_CACHE_LINE_SIZE 64
#endif
#define CACHE_ALIGN __declspec(align(MAX_CACHE_LINE_SIZE))
//
// Common types.
//
typedef unsigned long ulong; typedef unsigned short ushort; typedef unsigned char uchar; typedef unsigned int uint;
//
// Network byte-order is big-endian.
// NT runs in little-endian mode on all supported architectures.
//
__inline ushort net_short(ushort x) { return (((x & 0xff) << 8) | ((x & 0xff00) >> 8)); }
__inline ulong net_long(ulong x) { return (((x & 0xffL) << 24) | ((x & 0xff00L) << 8) | ((x & 0xff0000L) >> 8) | ((x &0xff000000L) >> 24)); }
//
// Find the highest power of two that is greater
// than or equal to the Value.
//
__inline ulong ComputeLargerOrEqualPowerOfTwo( ulong Value ) { ulong Temp;
for (Temp = 1; Temp < Value; Temp <<= 1);
return Temp; }
//
// Helpfull macros.
//
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
//
// NT specific definitions.
//
#include <ntosp.h>
#include <zwapi.h>
#define BEGIN_INIT
#define END_INIT
#include <ndis.h>
//
// Used to report an error from an API that we've called.
// For example, ExAllocatePool failed.
//
#define DPFLTR_NTOS_ERROR DPFLTR_INFO_LEVEL
//
// Used to report an error in an incoming packet.
// For example, a malformed packet header.
//
#define DPFLTR_BAD_PACKET DPFLTR_WARNING_LEVEL
//
// Used to report an error in a user's system call or ioctl.
// For example, an illegal argument.
//
#define DPFLTR_USER_ERROR DPFLTR_WARNING_LEVEL
//
// Used to report an internal error.
// For example, RouteToDestination failed.
//
#define DPFLTR_INTERNAL_ERROR DPFLTR_WARNING_LEVEL
//
// Used to report an internal unusual occurrence.
// For example, a rare race happened.
//
#define DPFLTR_INFO_RARE DPFLTR_INFO_LEVEL
//
// Used to report routine but unusual occurrences,
// which often indicate network configuration problem or packet loss.
// For example, fragmentation reassembly timeout.
//
#define DPFLTR_NET_ERROR DPFLTR_TRACE_LEVEL
//
// Used to report routine state changes,
// which do not happen too frequently.
// For example, creating/deleting an interface or address.
//
#define DPFLTR_INFO_STATE DPFLTR_INFO_LEVEL
//
// Used under IPSEC_DEBUG.
//
#define DPFLTR_INFO_IPSEC DPFLTR_INFO_LEVEL
//
// Used under IF_TCPDBG.
//
#define DPFLTR_INFO_TCPDBG DPFLTR_INFO_LEVEL
//
// NdisGetFirstBufferFromPacket is bad in two ways:
// It uses MmGetMdlVirtualAddress instead of MmGetSystemAddressForMdlSafe.
// It scans over all the buffers adding up the total length,
// even if you don't want it.
//
__inline PNDIS_BUFFER NdisFirstBuffer(PNDIS_PACKET Packet) { return Packet->Private.Head; }
//
// Use the function versions of these Ndis APIs,
// so that we are immune to changes in internal NDIS structures.
//
#undef NdisRequest
VOID NdisRequest( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNDIS_REQUEST NdisRequest );
#undef NdisSend
VOID NdisSend( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN PNDIS_PACKET Packet );
#undef NdisTransferData
VOID NdisTransferData( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisBindingHandle, IN NDIS_HANDLE MacReceiveContext, IN UINT ByteOffset, IN UINT BytesToTransfer, IN OUT PNDIS_PACKET Packet, OUT PUINT BytesTransferred );
#ifdef _X86_
//
// The Whistler build environment renames
// ExInterlockedPopEntrySList and
// ExInterlockedPushEntrySList to remove the Ex.
// Whistler ntoskrnl.exe exposes both entry points,
// Win2k ntoskrnl.exe only has the Ex entrypoints.
// We use the older entrypoints so that we run on Win2k.
//
#undef ExInterlockedPopEntrySList
NTKERNELAPI PSLIST_ENTRY FASTCALL ExInterlockedPopEntrySList ( IN PSLIST_HEADER ListHead, IN PKSPIN_LOCK Lock );
#undef ExInterlockedPushEntrySList
NTKERNELAPI PSLIST_ENTRY FASTCALL ExInterlockedPushEntrySList ( IN PSLIST_HEADER ListHead, IN PSLIST_ENTRY ListEntry, IN PKSPIN_LOCK Lock ); #endif // _X86_
//
// Support for tagging memory allocations.
//
#define IP6_TAG '6vPI'
#ifdef POOL_TAGGING
#ifdef ExAllocatePool
#undef ExAllocatePool
#endif
#define ExAllocatePool(type, size) ExAllocatePoolWithTag(type, size, IP6_TAG)
#endif // POOL_TAGGING
#if DBG
//
// Support for debug event log.
//
// The debug event log allows for "real time" logging of events
// in a circular queue kept in non-pageable memory. Each event consists
// of an id number and a arbitrary 32 bit value. The LogDebugEvent
// function adds a 64 bit timestamp to the event and adds it to the log.
//
// DEBUG_LOG_SIZE must be a power of 2 for wrap around to work properly.
#define DEBUG_LOG_SIZE (8 * 1024) // Number of debug log entries.
struct DebugLogEntry { LARGE_INTEGER Time; // When.
uint Event; // What.
int Arg; // How/Who/Where/Why?
};
void LogDebugEvent(uint Event, int Arg); #else
#define LogDebugEvent(Event, Arg)
#endif // DBG
#ifndef COUNTING_MALLOC
#define COUNTING_MALLOC DBG
#endif
#if COUNTING_MALLOC
#if defined(ExFreePool)
#undef ExFreePool
#endif
#define ExAllocatePoolWithTag(poolType, size, tag) CountingExAllocatePoolWithTag((poolType),(size),(tag), __FILE__, __LINE__)
#define ExFreePool(p) CountingExFreePool((p))
VOID * CountingExAllocatePoolWithTag( IN POOL_TYPE PoolType, IN ULONG NumberOfBytes, IN ULONG Tag, IN PCHAR File, IN ULONG Line);
VOID CountingExFreePool( PVOID p);
VOID InitCountingMalloc(void);
VOID DumpCountingMallocStats(void);
VOID UnloadCountingMalloc(void);
#endif // COUNTING_MALLOC
#endif // OSCFG_INCLUDED
|