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

206 lines
2.7 KiB
C

#ifndef MISC_H_INCLUDED
#define MISC_H_INCLUDED
//
// Endian-conversion routines
//
// begin_ntddk
//
// Bit Scan Reverse - 0x00010100 -> bit set at 16
//
__inline LONG
NTAPI
RtlGetMostSigBitSet(
IN LONG Value
)
{
ULONG Mask = 0x80000000;
UINT Index = 31;
while ((Value & Mask) == 0)
{
Index--;
Value <<= 1;
}
return Index;
}
//
// Bit Scan Forward - 0x00010100 -> bit set at 9
//
__inline LONG
NTAPI
RtlGetLeastSigBitSet(
IN LONG Value
)
{
ULONG Mask = 0x00000001;
UINT Index = 0;
while ((Value & Mask) == 0)
{
Index++;
Value >>= 1;
}
return Index;
}
#if (defined(MIDL_PASS) || defined(__cplusplus) || !defined(_M_IX86))
//
// Short integer conversion - 0xABCD -> 0xCDAB
//
__inline SHORT
NTAPI
RtlConvertEndianShort(
IN SHORT Value
)
{
return (((Value) & 0xFF00) >> 8) | ((UCHAR)(Value) << 8);
}
//
// Long integer conversion - 0x1234ABCD -> 0xCDAB3412
//
__inline LONG
NTAPI
RtlConvertEndianLong(
IN LONG Value
)
{
return (((Value) & 0xFF000000) >> 24) |
(((Value) & 0x00FF0000) >> 8) |
(((Value) & 0x0000FF00) << 8) |
(((UCHAR)(Value)) << 24);
}
//
// Bit Scan Reverse - 0x00010100 -> bit set at 16
//
__inline LONG
NTAPI
RtlGetMostSigBitSetEx(
IN LONG Value
)
{
ULONG Mask = 0x80000000;
UINT Index = 31;
while ((Value & Mask) == 0)
{
Index--;
Value <<= 1;
}
return Index;
}
//
// Bit Scan Forward - 0x00010100 -> bit set at 9
//
__inline LONG
NTAPI
RtlGetLeastSigBitSetEx(
IN LONG Value
)
{
ULONG Mask = 0x00000001;
UINT Index = 0;
while ((Value & Mask) == 0)
{
Index++;
Value >>= 1;
}
return Index;
}
#else
#pragma warning(disable:4035) // re-enable below
//
// Short integer conversion - 0xABCD -> 0xCDAB
//
__inline SHORT
NTAPI
RtlConvertEndianShort(
IN SHORT Value
)
{
__asm {
mov ax, Value
xchg ah, al
}
}
//
// Long integer conversion - 0x1234ABCD -> 0xCDAB3412
//
__inline LONG
NTAPI
RtlConvertEndianLong(
IN LONG Value
)
{
__asm {
mov eax, Value
bswap eax
}
}
//
// Bit Scan Reverse - 0x00010100 -> bit set at 16
//
__inline LONG
NTAPI
RtlGetMostSigBitSetEx(
IN LONG Value
)
{
__asm {
bsr eax, Value
}
}
//
// Bit Scan Forward - 0x00010100 -> bit set at 9
//
__inline LONG
NTAPI
RtlGetLeastSigBitSetEx(
IN LONG Value
)
{
__asm {
bsf eax, Value
}
}
#pragma warning(default:4035)
#endif
// end_ntddk
#endif // MISC_H_INCLUDED