windows-nt/Source/XPSP1/NT/net/tcpip/driver/inc/oscfg.h
2020-09-26 16:20:57 +08:00

170 lines
3.7 KiB
C

/********************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1990-2000 **/
/********************************************************************/
/* :ts=4 */
#ifndef OSCFG_INCLUDED
#define OSCFG_INCLUDED
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
// My binary compatible definition for compiling an Millennium tcpip.sys
#if MILLEN
#include "wdm.h"
#define KdPrintEx(_x_)
#else // MILLEN
#include <ntosp.h>
#include <zwapi.h>
#endif // !MILLEN
#define BEGIN_INIT
#define END_INIT
#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))
typedef struct CACHE_ALIGN _CACHE_LINE_KSPIN_LOCK {
KSPIN_LOCK Lock;
} CACHE_LINE_KSPIN_LOCK;
C_ASSERT(sizeof(CACHE_LINE_KSPIN_LOCK) % MAX_CACHE_LINE_SIZE == 0);
C_ASSERT(__alignof(CACHE_LINE_KSPIN_LOCK) == MAX_CACHE_LINE_SIZE);
typedef struct CACHE_ALIGN _CACHE_LINE_SLIST_HEADER {
SLIST_HEADER SListHead;
} CACHE_LINE_SLIST_HEADER;
C_ASSERT(sizeof(CACHE_LINE_SLIST_HEADER) % MAX_CACHE_LINE_SIZE == 0);
C_ASSERT(__alignof(CACHE_LINE_SLIST_HEADER) == MAX_CACHE_LINE_SIZE);
typedef struct CACHE_ALIGN _CACHE_LINE_ULONG {
ULONG Value;
} CACHE_LINE_ULONG;
C_ASSERT(sizeof(CACHE_LINE_ULONG) % MAX_CACHE_LINE_SIZE == 0);
C_ASSERT(__alignof(CACHE_LINE_ULONG) == MAX_CACHE_LINE_SIZE);
#if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || ((defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
#define net_short(_x) _byteswap_ushort((USHORT)(_x))
#define net_long(_x) _byteswap_ulong(_x)
#else
__inline
USHORT
FASTCALL
net_short(
ULONG NaturalData)
{
USHORT ShortData = (USHORT)NaturalData;
return (ShortData << 8) | (ShortData >> 8);
}
// if x is aabbccdd (where aa, bb, cc, dd are hex bytes)
// we want net_long(x) to be ddccbbaa. A small and fast way to do this is
// to first byteswap it to get bbaaddcc and then swap high and low words.
//
__inline
ULONG
FASTCALL
net_long(
ULONG NaturalData)
{
ULONG ByteSwapped;
ByteSwapped = ((NaturalData & 0x00ff00ff) << 8) |
((NaturalData & 0xff00ff00) >> 8);
return (ByteSwapped << 16) | (ByteSwapped >> 16);
}
#endif
__inline
BOOLEAN
IsPowerOfTwo(
ULONG Value
)
{
return (Value & (Value - 1)) == 0;
}
// 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;
}
// Find the highest power of two, in the form of its shift, that is greater
// than or equal to the Value.
//
__inline
ULONG
ComputeShiftForLargerOrEqualPowerOfTwo(
ULONG Value
)
{
ULONG Shift;
ULONG Temp;
for (Temp = 1, Shift = 0; Temp < Value; Temp <<= 1, Shift++);
return Shift;
}
__inline
VOID
FASTCALL
CTEGetLockAtIrql (
IN PKSPIN_LOCK SpinLock,
IN KIRQL OrigIrql,
OUT PKIRQL OldIrql)
{
#if !MILLEN
if (DISPATCH_LEVEL == OrigIrql) {
ASSERT(DISPATCH_LEVEL == KeGetCurrentIrql());
ExAcquireSpinLockAtDpcLevel(SpinLock);
*OldIrql = DISPATCH_LEVEL;
} else {
ExAcquireSpinLock(SpinLock, OldIrql);
}
#else
*OldIrql = 0;
#endif
}
__inline
VOID
FASTCALL
CTEFreeLockAtIrql (
IN PKSPIN_LOCK SpinLock,
IN KIRQL OrigIrql,
IN KIRQL NewIrql)
{
#if !MILLEN
if (DISPATCH_LEVEL == OrigIrql) {
ASSERT(DISPATCH_LEVEL == NewIrql);
ASSERT(DISPATCH_LEVEL == KeGetCurrentIrql());
ExReleaseSpinLockFromDpcLevel(SpinLock);
} else {
ExReleaseSpinLock(SpinLock, NewIrql);
}
#endif
}
#endif // OSCFG_INCLUDED