mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
Move bitmap functions to the shared rtl library.
svn path=/trunk/; revision=10472
This commit is contained in:
parent
bfa54c3f9a
commit
8f674bc02f
5 changed files with 4 additions and 1649 deletions
|
@ -1,4 +1,4 @@
|
|||
# $Id: makefile,v 1.107 2004/08/09 18:17:22 jimtabor Exp $
|
||||
# $Id: makefile,v 1.108 2004/08/10 12:03:29 ekohl Exp $
|
||||
|
||||
PATH_TO_TOP = ../..
|
||||
|
||||
|
@ -39,7 +39,6 @@ DBG_OBJECTS = \
|
|||
dbg/brkpoint.o \
|
||||
dbg/debug.o \
|
||||
dbg/print.o
|
||||
# dbg/winedbg.o
|
||||
|
||||
LDR_OBJECTS = \
|
||||
ldr/entry.o \
|
||||
|
@ -64,11 +63,10 @@ RTL_OBJECTS = \
|
|||
rtl/access.o \
|
||||
rtl/apc.o \
|
||||
rtl/atom.o \
|
||||
rtl/dbgbuffer.o \
|
||||
rtl/bitmap.o \
|
||||
rtl/callback.o \
|
||||
rtl/crc32.o \
|
||||
rtl/critical.o \
|
||||
rtl/dbgbuffer.o \
|
||||
rtl/exception.o \
|
||||
rtl/handle.o \
|
||||
rtl/intrlck.o \
|
||||
|
@ -87,6 +85,7 @@ RTL_OBJECTS = \
|
|||
rtl/timerqueue.o \
|
||||
rtl/libsupp.o
|
||||
|
||||
|
||||
STDIO_OBJECTS = \
|
||||
stdio/sprintf.o \
|
||||
stdio/sscanf.o \
|
||||
|
|
|
@ -1,788 +0,0 @@
|
|||
/* $Id: bitmap.c,v 1.7 2004/02/02 13:34:01 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: lib/ntdll/rtl/bitmap.c
|
||||
* PURPOSE: Bitmap functions
|
||||
* UPDATE HISTORY:
|
||||
* 20/08/99 Created by Eric Kohl
|
||||
*/
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
|
||||
|
||||
#define NDEBUG
|
||||
#include <ntdll/ntdll.h>
|
||||
|
||||
#define ALIGN(x,align) (((x)+(align)-1) / (align))
|
||||
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlInitializeBitMap (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG BitMapBuffer,
|
||||
ULONG SizeOfBitMap
|
||||
)
|
||||
{
|
||||
BitMapHeader->SizeOfBitMap = SizeOfBitMap;
|
||||
BitMapHeader->Buffer = BitMapBuffer;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
BOOLEAN
|
||||
STDCALL
|
||||
RtlAreBitsClear (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG StartingIndex,
|
||||
ULONG Length
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Shift;
|
||||
ULONG Count;
|
||||
PUCHAR Ptr;
|
||||
|
||||
if (StartingIndex >= Size ||
|
||||
!Length ||
|
||||
(StartingIndex + Length > Size))
|
||||
return FALSE;
|
||||
|
||||
Ptr = (PUCHAR)BitMapHeader->Buffer + (StartingIndex / 8);
|
||||
while (Length)
|
||||
{
|
||||
/* get bit shift in current byte */
|
||||
Shift = StartingIndex & 7;
|
||||
|
||||
/* get number of bits to check in current byte */
|
||||
Count = (Length > 8 - Shift) ? 8 - Shift : Length;
|
||||
|
||||
/* check byte */
|
||||
if (*Ptr & (~(0xFF << Count) << Shift))
|
||||
return FALSE;
|
||||
|
||||
Ptr++;
|
||||
Length -= Count;
|
||||
StartingIndex += Count;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
BOOLEAN
|
||||
STDCALL
|
||||
RtlAreBitsSet (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG StartingIndex,
|
||||
ULONG Length
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Shift;
|
||||
ULONG Count;
|
||||
PUCHAR Ptr;
|
||||
UCHAR Check;
|
||||
|
||||
if (StartingIndex >= Size ||
|
||||
!Length ||
|
||||
(StartingIndex + Length > Size))
|
||||
return FALSE;
|
||||
|
||||
Ptr = (PUCHAR)BitMapHeader->Buffer + (StartingIndex / 8);
|
||||
while (Length)
|
||||
{
|
||||
/* get bit shift in current byte */
|
||||
Shift = StartingIndex & 7;
|
||||
|
||||
/* get number of bits to check in current byte */
|
||||
Count = (Length > 8 - Shift) ? 8 - Shift : Length;
|
||||
|
||||
/* bulid check byte */
|
||||
Check = ~(0xFF << Count) << Shift;
|
||||
|
||||
/* check byte */
|
||||
if ((*Ptr & Check) != Check)
|
||||
return FALSE;
|
||||
|
||||
Ptr++;
|
||||
Length -= Count;
|
||||
StartingIndex += Count;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlClearAllBits (
|
||||
IN OUT PRTL_BITMAP BitMapHeader
|
||||
)
|
||||
{
|
||||
memset (BitMapHeader->Buffer,
|
||||
0x00,
|
||||
ALIGN(BitMapHeader->SizeOfBitMap, 8));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlClearBits (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG StartingIndex,
|
||||
ULONG NumberToClear
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Count;
|
||||
ULONG Shift;
|
||||
PCHAR Ptr;
|
||||
|
||||
if (StartingIndex >= Size || NumberToClear == 0)
|
||||
return;
|
||||
|
||||
if (StartingIndex + NumberToClear > Size)
|
||||
NumberToClear = Size - StartingIndex;
|
||||
|
||||
Ptr = (PCHAR)(BitMapHeader->Buffer + (StartingIndex / 8));
|
||||
while (NumberToClear)
|
||||
{
|
||||
/* bit shift in current byte */
|
||||
Shift = StartingIndex & 7;
|
||||
|
||||
/* number of bits to change in current byte */
|
||||
Count = (NumberToClear > 8 - Shift ) ? 8 - Shift : NumberToClear;
|
||||
|
||||
/* adjust byte */
|
||||
*Ptr &= ~(~(0xFF << Count) << Shift);
|
||||
|
||||
Ptr++;
|
||||
NumberToClear -= Count;
|
||||
StartingIndex += Count;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindClearBits (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG NumberToFind,
|
||||
ULONG HintIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
PCHAR Ptr;
|
||||
CHAR Mask;
|
||||
|
||||
if (NumberToFind > Size || NumberToFind == 0)
|
||||
return -1;
|
||||
|
||||
if (HintIndex >= Size)
|
||||
HintIndex = 0;
|
||||
|
||||
Index = HintIndex;
|
||||
Ptr = (PCHAR)BitMapHeader->Buffer + (Index / 8);
|
||||
Mask = 1 << (Index & 7);
|
||||
|
||||
while (HintIndex < Size)
|
||||
{
|
||||
/* count clear bits */
|
||||
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
if (++Count >= NumberToFind)
|
||||
return HintIndex;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip set bits */
|
||||
for (; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
HintIndex = Index;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindClearBitsAndSet (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG NumberToFind,
|
||||
ULONG HintIndex
|
||||
)
|
||||
{
|
||||
ULONG Index;
|
||||
|
||||
Index = RtlFindClearBits (BitMapHeader,
|
||||
NumberToFind,
|
||||
HintIndex);
|
||||
if (Index != (ULONG)-1)
|
||||
RtlSetBits (BitMapHeader,
|
||||
Index,
|
||||
NumberToFind);
|
||||
|
||||
return Index;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
ULONG STDCALL
|
||||
RtlFindClearRuns (PRTL_BITMAP BitMapHeader,
|
||||
PRTL_BITMAP_RUN RunArray,
|
||||
ULONG SizeOfRunArray,
|
||||
BOOLEAN LocateLongestRuns)
|
||||
{
|
||||
return (ULONG)-1;
|
||||
}
|
||||
|
||||
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindFirstRunClear (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG StartingIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
PCHAR Ptr;
|
||||
CHAR Mask;
|
||||
|
||||
if (*StartingIndex > Size)
|
||||
{
|
||||
*StartingIndex = (ULONG)-1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Index = *StartingIndex;
|
||||
Ptr = (PCHAR)BitMapHeader->Buffer + (Index / 8);
|
||||
Mask = 1 << (Index & 7);
|
||||
|
||||
/* skip set bits */
|
||||
for (; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* return index of first clear bit */
|
||||
if (Index >= Size)
|
||||
{
|
||||
*StartingIndex = (ULONG)-1;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
*StartingIndex = Index;
|
||||
|
||||
/* count clear bits */
|
||||
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Count++;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindFirstRunSet (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG StartingIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
PCHAR Ptr;
|
||||
CHAR Mask;
|
||||
|
||||
if (*StartingIndex > Size)
|
||||
{
|
||||
*StartingIndex = (ULONG)-1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Index = *StartingIndex;
|
||||
Ptr = (PCHAR)BitMapHeader->Buffer + (Index / 8);
|
||||
Mask = 1 << (Index & 7);
|
||||
|
||||
/* skip clear bits */
|
||||
for (; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* return index of first set bit */
|
||||
if (Index >= Size)
|
||||
{
|
||||
*StartingIndex = (ULONG)-1;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
*StartingIndex = Index;
|
||||
|
||||
/* count set bits */
|
||||
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Count++;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
ULONG STDCALL
|
||||
RtlFindLastBackwardRunClear (IN PRTL_BITMAP BitMapHeader,
|
||||
IN ULONG FromIndex,
|
||||
IN PULONG StartingRunIndex)
|
||||
{
|
||||
return (ULONG)-1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindLongestRunClear (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG StartingIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
PCHAR Ptr = (PCHAR)BitMapHeader->Buffer;
|
||||
ULONG Index = 0;
|
||||
ULONG Count;
|
||||
ULONG Max = 0;
|
||||
ULONG Start;
|
||||
ULONG Maxstart = 0;
|
||||
CHAR Mask = 1;
|
||||
|
||||
while (Index < Size)
|
||||
{
|
||||
Start = Index;
|
||||
|
||||
/* count clear bits */
|
||||
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Count++;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip set bits */
|
||||
for (; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
if (Count > Max)
|
||||
{
|
||||
Max = Count;
|
||||
Maxstart = Start;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingIndex)
|
||||
*StartingIndex = Maxstart;
|
||||
|
||||
return Max;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindLongestRunSet (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG StartingIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
PCHAR Ptr = (PCHAR)BitMapHeader->Buffer;
|
||||
ULONG Index = 0;
|
||||
ULONG Count;
|
||||
ULONG Max = 0;
|
||||
ULONG Start;
|
||||
ULONG Maxstart = 0;
|
||||
CHAR Mask = 1;
|
||||
|
||||
while (Index < Size)
|
||||
{
|
||||
Start = Index;
|
||||
|
||||
/* count set bits */
|
||||
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Count++;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip clear bits */
|
||||
for (; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
if (Count > Max)
|
||||
{
|
||||
Max = Count;
|
||||
Maxstart = Start;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingIndex)
|
||||
*StartingIndex = Maxstart;
|
||||
|
||||
return Max;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
ULONG STDCALL
|
||||
RtlFindNextForwardRunClear (IN PRTL_BITMAP BitMapHeader,
|
||||
IN ULONG FromIndex,
|
||||
IN PULONG StartingRunIndex)
|
||||
{
|
||||
return (ULONG)-1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindSetBits (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG NumberToFind,
|
||||
ULONG HintIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
PCHAR Ptr;
|
||||
CHAR Mask;
|
||||
|
||||
if (NumberToFind > Size || NumberToFind == 0)
|
||||
return (ULONG)-1;
|
||||
|
||||
if (HintIndex >= Size)
|
||||
HintIndex = 0;
|
||||
|
||||
Index = HintIndex;
|
||||
Ptr = (PCHAR)BitMapHeader->Buffer + (Index / 8);
|
||||
Mask = 1 << (Index & 7);
|
||||
|
||||
while (HintIndex < Size)
|
||||
{
|
||||
/* count set bits */
|
||||
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
if (++Count >= NumberToFind)
|
||||
return HintIndex;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip clear bits */
|
||||
for (; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
HintIndex = Index;
|
||||
}
|
||||
|
||||
return (ULONG)-1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindSetBitsAndClear (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG NumberToFind,
|
||||
ULONG HintIndex
|
||||
)
|
||||
{
|
||||
ULONG Index;
|
||||
|
||||
Index = RtlFindSetBits (BitMapHeader,
|
||||
NumberToFind,
|
||||
HintIndex);
|
||||
if (Index != (ULONG)-1)
|
||||
RtlClearBits (BitMapHeader,
|
||||
Index,
|
||||
NumberToFind);
|
||||
|
||||
return Index;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlNumberOfClearBits (
|
||||
PRTL_BITMAP BitMapHeader
|
||||
)
|
||||
{
|
||||
PCHAR Ptr = (PCHAR)BitMapHeader->Buffer;
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
CHAR Mask;
|
||||
|
||||
for (Mask = 1, Index = 0, Count = 0; Index < Size; Index++)
|
||||
{
|
||||
if (~*Ptr & Mask)
|
||||
Count++;
|
||||
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlNumberOfSetBits (
|
||||
PRTL_BITMAP BitMapHeader
|
||||
)
|
||||
{
|
||||
PCHAR Ptr = (PCHAR)BitMapHeader->Buffer;
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
CHAR Mask;
|
||||
|
||||
for (Mask = 1, Index = 0, Count = 0; Index < Size; Index++)
|
||||
{
|
||||
if (*Ptr & Mask)
|
||||
Count++;
|
||||
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlSetAllBits (
|
||||
IN OUT PRTL_BITMAP BitMapHeader
|
||||
)
|
||||
{
|
||||
memset (BitMapHeader->Buffer,
|
||||
0xFF,
|
||||
ALIGN(BitMapHeader->SizeOfBitMap, 8));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlSetBits (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG StartingIndex,
|
||||
ULONG NumberToSet
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Count;
|
||||
ULONG Shift;
|
||||
PCHAR Ptr;
|
||||
|
||||
if (StartingIndex >= Size || NumberToSet == 0)
|
||||
return;
|
||||
|
||||
if (StartingIndex + NumberToSet > Size)
|
||||
NumberToSet = Size - StartingIndex;
|
||||
|
||||
Ptr = (PCHAR)BitMapHeader->Buffer + (StartingIndex / 8);
|
||||
while (NumberToSet)
|
||||
{
|
||||
/* bit shift in current byte */
|
||||
Shift = StartingIndex & 7;
|
||||
|
||||
/* number of bits to change in current byte */
|
||||
Count = (NumberToSet > 8 - Shift) ? 8 - Shift : NumberToSet;
|
||||
|
||||
/* adjust byte */
|
||||
*Ptr |= ~(0xFF << Count) << Shift;
|
||||
|
||||
Ptr++;
|
||||
NumberToSet -= Count;
|
||||
StartingIndex += Count;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
CCHAR STDCALL
|
||||
RtlFindLeastSignificantBit (IN ULONGLONG Set)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (Set == 0ULL)
|
||||
return -1;
|
||||
|
||||
for (i = 0; i < 64; i++)
|
||||
{
|
||||
if (Set & (1 << i))
|
||||
return (CCHAR)i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
CCHAR STDCALL
|
||||
RtlFindMostSignificantBit (IN ULONGLONG Set)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (Set == 0ULL)
|
||||
return -1;
|
||||
|
||||
for (i = 63; i >= 0; i--)
|
||||
{
|
||||
if (Set & (1 << i))
|
||||
return (CCHAR)i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -1,4 +1,4 @@
|
|||
# $Id: Makefile,v 1.136 2004/08/04 02:27:07 navaraf Exp $
|
||||
# $Id: Makefile,v 1.137 2004/08/10 12:05:20 ekohl Exp $
|
||||
#
|
||||
# ReactOS Operating System
|
||||
#
|
||||
|
@ -110,8 +110,6 @@ OBJECTS_NT = \
|
|||
# Run-Time Library (Rtl)
|
||||
OBJECTS_RTL = \
|
||||
rtl/atom.o \
|
||||
rtl/bit.o \
|
||||
rtl/bitmap.o \
|
||||
rtl/capture.o \
|
||||
rtl/ctype.o \
|
||||
rtl/handle.o \
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
/*
|
||||
* ReactOS kernel
|
||||
* Copyright (C) 2004 ReactOS Team
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: bit.c,v 1.2 2004/08/07 19:13:27 ion Exp $
|
||||
*
|
||||
* PROJECT: ReactOS kernel
|
||||
* PURPOSE: Runtime code
|
||||
* FILE: ntoskrnl/rtl/bit.c
|
||||
* PROGRAMER: Eric Kohl
|
||||
*/
|
||||
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
CCHAR STDCALL
|
||||
RtlFindLeastSignificantBit (IN ULONGLONG Set)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (Set == 0ULL)
|
||||
return -1;
|
||||
|
||||
for (i = 0; i < 64; i++)
|
||||
{
|
||||
if (Set & (1 << i))
|
||||
return (CCHAR)i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
CCHAR STDCALL
|
||||
RtlFindMostSignificantBit (IN ULONGLONG Set)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (Set == 0ULL)
|
||||
return -1;
|
||||
|
||||
for (i = 63; i >= 0; i--)
|
||||
{
|
||||
if (Set & (1 << i))
|
||||
return (CCHAR)i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -1,780 +0,0 @@
|
|||
/* $Id: bitmap.c,v 1.10 2004/08/05 18:17:37 ion Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: ntoskrnl/rtl/bitmap.c
|
||||
* PURPOSE: Bitmap functions
|
||||
* UPDATE HISTORY:
|
||||
* 20/08/99 Created by Eric Kohl
|
||||
*/
|
||||
|
||||
#include <ddk/ntddk.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
#define ALIGN(x,align) (((x)+(align)-1) / (align))
|
||||
|
||||
#define MASK(Count, Shift) ((Count) == 32 ? 0xFFFFFFFF : ~(0xFFFFFFFF << (Count)) << (Shift))
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlInitializeBitMap (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG BitMapBuffer,
|
||||
ULONG SizeOfBitMap
|
||||
)
|
||||
{
|
||||
BitMapHeader->SizeOfBitMap = SizeOfBitMap;
|
||||
BitMapHeader->Buffer = BitMapBuffer;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
BOOLEAN
|
||||
STDCALL
|
||||
RtlAreBitsClear (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG StartingIndex,
|
||||
ULONG Length
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Shift;
|
||||
ULONG Count;
|
||||
PULONG Ptr;
|
||||
|
||||
if (StartingIndex >= Size ||
|
||||
!Length ||
|
||||
(StartingIndex + Length > Size))
|
||||
return FALSE;
|
||||
|
||||
Ptr = (PULONG)BitMapHeader->Buffer + (StartingIndex / 32);
|
||||
while (Length)
|
||||
{
|
||||
/* get bit shift in current dword */
|
||||
Shift = StartingIndex & 0x1F;
|
||||
|
||||
/* get number of bits to check in current dword */
|
||||
Count = (Length > 32 - Shift) ? 32 - Shift : Length;
|
||||
|
||||
/* check dword */
|
||||
if (*Ptr++ & MASK(Count, Shift))
|
||||
return FALSE;
|
||||
|
||||
Length -= Count;
|
||||
StartingIndex += Count;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
BOOLEAN
|
||||
STDCALL
|
||||
RtlAreBitsSet (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG StartingIndex,
|
||||
ULONG Length
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Shift;
|
||||
ULONG Count;
|
||||
PULONG Ptr;
|
||||
|
||||
if (StartingIndex >= Size ||
|
||||
!Length ||
|
||||
(StartingIndex + Length > Size))
|
||||
return FALSE;
|
||||
|
||||
Ptr = (PULONG)BitMapHeader->Buffer + (StartingIndex / 32);
|
||||
while (Length)
|
||||
{
|
||||
/* get bit shift in current dword */
|
||||
Shift = StartingIndex & 0x1F;
|
||||
|
||||
/* get number of bits to check in current dword */
|
||||
Count = (Length > 32 - Shift) ? 32 - Shift : Length;
|
||||
|
||||
/* check dword */
|
||||
if (~*Ptr++ & MASK(Count, Shift))
|
||||
return FALSE;
|
||||
|
||||
Length -= Count;
|
||||
StartingIndex += Count;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlClearAllBits (
|
||||
IN OUT PRTL_BITMAP BitMapHeader
|
||||
)
|
||||
{
|
||||
memset (BitMapHeader->Buffer,
|
||||
0x00,
|
||||
ALIGN(BitMapHeader->SizeOfBitMap, 8));
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlClearBit (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG BitNumber
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlClearBits (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG StartingIndex,
|
||||
ULONG NumberToClear
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Count;
|
||||
ULONG Shift;
|
||||
PULONG Ptr;
|
||||
|
||||
if (StartingIndex >= Size || NumberToClear == 0)
|
||||
return;
|
||||
|
||||
if (StartingIndex + NumberToClear > Size)
|
||||
NumberToClear = Size - StartingIndex;
|
||||
|
||||
Ptr = (PULONG)BitMapHeader->Buffer + (StartingIndex / 32);
|
||||
while (NumberToClear)
|
||||
{
|
||||
/* bit shift in current dword */
|
||||
Shift = StartingIndex & 0x1F;
|
||||
|
||||
/* number of bits to change in current dword */
|
||||
Count = (NumberToClear > 32 - Shift ) ? 32 - Shift : NumberToClear;
|
||||
|
||||
/* adjust dword */
|
||||
*Ptr++ &= ~MASK(Count, Shift);
|
||||
NumberToClear -= Count;
|
||||
StartingIndex += Count;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindClearBits (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG NumberToFind,
|
||||
ULONG HintIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
PULONG Ptr;
|
||||
ULONG Mask;
|
||||
|
||||
if (NumberToFind > Size || NumberToFind == 0)
|
||||
return -1;
|
||||
|
||||
if (HintIndex >= Size)
|
||||
HintIndex = 0;
|
||||
|
||||
Index = HintIndex;
|
||||
Ptr = (PULONG)BitMapHeader->Buffer + (Index / 32);
|
||||
Mask = 1 << (Index & 0x1F);
|
||||
|
||||
while (HintIndex < Size)
|
||||
{
|
||||
/* count clear bits */
|
||||
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
if (++Count >= NumberToFind)
|
||||
return HintIndex;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip set bits */
|
||||
for (; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
HintIndex = Index;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindClearBitsAndSet (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG NumberToFind,
|
||||
ULONG HintIndex
|
||||
)
|
||||
{
|
||||
ULONG Index;
|
||||
|
||||
Index = RtlFindClearBits (BitMapHeader,
|
||||
NumberToFind,
|
||||
HintIndex);
|
||||
if (Index != (ULONG)-1)
|
||||
RtlSetBits (BitMapHeader,
|
||||
Index,
|
||||
NumberToFind);
|
||||
|
||||
return Index;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindFirstRunClear (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG StartingIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
PULONG Ptr;
|
||||
ULONG Mask;
|
||||
|
||||
if (*StartingIndex > Size)
|
||||
{
|
||||
*StartingIndex = (ULONG)-1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Index = *StartingIndex;
|
||||
Ptr = (PULONG)BitMapHeader->Buffer + (Index / 32);
|
||||
Mask = 1 << (Index & 0x1F);
|
||||
|
||||
/* skip set bits */
|
||||
for (; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* return index of first clear bit */
|
||||
if (Index >= Size)
|
||||
{
|
||||
*StartingIndex = (ULONG)-1;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
*StartingIndex = Index;
|
||||
|
||||
/* count clear bits */
|
||||
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Count++;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
return Count;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindClearRuns (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PRTL_BITMAP_RUN RunArray,
|
||||
ULONG SizeOfRunArray,
|
||||
BOOLEAN LocateLongestRuns
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindLastBackwardRunClear (
|
||||
IN PRTL_BITMAP BitMapHeader,
|
||||
IN ULONG FromIndex,
|
||||
IN PULONG StartingRunIndex
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindNextForwardRunClear (
|
||||
IN PRTL_BITMAP BitMapHeader,
|
||||
IN ULONG FromIndex,
|
||||
IN PULONG StartingRunIndex
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindFirstRunSet (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG StartingIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
PULONG Ptr;
|
||||
ULONG Mask;
|
||||
|
||||
if (*StartingIndex > Size)
|
||||
{
|
||||
*StartingIndex = (ULONG)-1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Index = *StartingIndex;
|
||||
Ptr = (PULONG)BitMapHeader->Buffer + (Index / 32);
|
||||
Mask = 1 << (Index & 0x1F);
|
||||
|
||||
/* skip clear bits */
|
||||
for (; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* return index of first set bit */
|
||||
if (Index >= Size)
|
||||
{
|
||||
*StartingIndex = (ULONG)-1;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
*StartingIndex = Index;
|
||||
|
||||
/* count set bits */
|
||||
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Count++;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindLongestRunClear (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG StartingIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
PULONG Ptr = (PULONG)BitMapHeader->Buffer;
|
||||
ULONG Index = 0;
|
||||
ULONG Count;
|
||||
ULONG Max = 0;
|
||||
ULONG Start;
|
||||
ULONG Maxstart = 0;
|
||||
ULONG Mask = 1;
|
||||
|
||||
while (Index < Size)
|
||||
{
|
||||
Start = Index;
|
||||
|
||||
/* count clear bits */
|
||||
for (Count = 0; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Count++;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip set bits */
|
||||
for (; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
if (Count > Max)
|
||||
{
|
||||
Max = Count;
|
||||
Maxstart = Start;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingIndex)
|
||||
*StartingIndex = Maxstart;
|
||||
|
||||
return Max;
|
||||
}
|
||||
|
||||
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindLongestRunSet (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
PULONG StartingIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
PULONG Ptr = (PULONG)BitMapHeader->Buffer;
|
||||
ULONG Index = 0;
|
||||
ULONG Count;
|
||||
ULONG Max = 0;
|
||||
ULONG Start;
|
||||
ULONG Maxstart = 0;
|
||||
ULONG Mask = 1;
|
||||
|
||||
while (Index < Size)
|
||||
{
|
||||
Start = Index;
|
||||
|
||||
/* count set bits */
|
||||
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
Count++;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip clear bits */
|
||||
for (; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
if (Count > Max)
|
||||
{
|
||||
Max = Count;
|
||||
Maxstart = Start;
|
||||
}
|
||||
}
|
||||
|
||||
if (StartingIndex)
|
||||
*StartingIndex = Maxstart;
|
||||
|
||||
return Max;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindSetBits (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG NumberToFind,
|
||||
ULONG HintIndex
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
PULONG Ptr;
|
||||
ULONG Mask;
|
||||
|
||||
if (NumberToFind > Size || NumberToFind == 0)
|
||||
return (ULONG)-1;
|
||||
|
||||
if (HintIndex >= Size)
|
||||
HintIndex = 0;
|
||||
|
||||
Index = HintIndex;
|
||||
Ptr = (PULONG)BitMapHeader->Buffer + (Index / 32);
|
||||
Mask = 1 << (Index & 0x1F);
|
||||
|
||||
while (HintIndex < Size)
|
||||
{
|
||||
/* count set bits */
|
||||
for (Count = 0; Index < Size && *Ptr & Mask; Index++)
|
||||
{
|
||||
if (++Count >= NumberToFind)
|
||||
return HintIndex;
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip clear bits */
|
||||
for (; Index < Size && ~*Ptr & Mask; Index++)
|
||||
{
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
HintIndex = Index;
|
||||
}
|
||||
|
||||
return (ULONG)-1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlFindSetBitsAndClear (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG NumberToFind,
|
||||
ULONG HintIndex
|
||||
)
|
||||
{
|
||||
ULONG Index;
|
||||
|
||||
Index = RtlFindSetBits (BitMapHeader,
|
||||
NumberToFind,
|
||||
HintIndex);
|
||||
if (Index != (ULONG)-1)
|
||||
RtlClearBits (BitMapHeader,
|
||||
Index,
|
||||
NumberToFind);
|
||||
|
||||
return Index;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlNumberOfClearBits (
|
||||
PRTL_BITMAP BitMapHeader
|
||||
)
|
||||
{
|
||||
PULONG Ptr = (PULONG)BitMapHeader->Buffer;
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
ULONG Mask;
|
||||
|
||||
for (Mask = 1, Index = 0, Count = 0; Index < Size; Index++)
|
||||
{
|
||||
if (~*Ptr & Mask)
|
||||
Count++;
|
||||
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
RtlNumberOfSetBits (
|
||||
PRTL_BITMAP BitMapHeader
|
||||
)
|
||||
{
|
||||
PULONG Ptr = (PULONG)BitMapHeader->Buffer;
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Index;
|
||||
ULONG Count;
|
||||
ULONG Mask;
|
||||
|
||||
for (Mask = 1, Index = 0, Count = 0; Index < Size; Index++)
|
||||
{
|
||||
if (*Ptr & Mask)
|
||||
Count++;
|
||||
|
||||
Mask <<= 1;
|
||||
if (Mask == 0)
|
||||
{
|
||||
Mask = 1;
|
||||
Ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlSetAllBits (
|
||||
IN OUT PRTL_BITMAP BitMapHeader
|
||||
)
|
||||
{
|
||||
memset (BitMapHeader->Buffer,
|
||||
0xFF,
|
||||
ALIGN(BitMapHeader->SizeOfBitMap, 8));
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlSetBit (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG BitNumber
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
RtlSetBits (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG StartingIndex,
|
||||
ULONG NumberToSet
|
||||
)
|
||||
{
|
||||
ULONG Size = BitMapHeader->SizeOfBitMap;
|
||||
ULONG Count;
|
||||
ULONG Shift;
|
||||
PULONG Ptr;
|
||||
|
||||
if (StartingIndex >= Size || NumberToSet == 0)
|
||||
return;
|
||||
|
||||
if (StartingIndex + NumberToSet > Size)
|
||||
NumberToSet = Size - StartingIndex;
|
||||
|
||||
Ptr = (PULONG)BitMapHeader->Buffer + (StartingIndex / 32);
|
||||
while (NumberToSet)
|
||||
{
|
||||
/* bit shift in current dword */
|
||||
Shift = StartingIndex & 0x1F;
|
||||
|
||||
/* number of bits to change in current dword */
|
||||
Count = (NumberToSet > 32 - Shift) ? 32 - Shift : NumberToSet;
|
||||
|
||||
/* adjust dword */
|
||||
*Ptr++ |= MASK(Count, Shift);
|
||||
NumberToSet -= Count;
|
||||
StartingIndex += Count;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOLEAN
|
||||
STDCALL
|
||||
RtlTestBit (
|
||||
PRTL_BITMAP BitMapHeader,
|
||||
ULONG BitNumber
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
}
|
||||
/* EOF */
|
Loading…
Reference in a new issue