206 lines
2.7 KiB
C
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
|
||
|
|