mirror of
https://github.com/reactos/reactos.git
synced 2025-07-04 20:21:22 +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 = ../..
|
PATH_TO_TOP = ../..
|
||||||
|
|
||||||
|
@ -39,7 +39,6 @@ DBG_OBJECTS = \
|
||||||
dbg/brkpoint.o \
|
dbg/brkpoint.o \
|
||||||
dbg/debug.o \
|
dbg/debug.o \
|
||||||
dbg/print.o
|
dbg/print.o
|
||||||
# dbg/winedbg.o
|
|
||||||
|
|
||||||
LDR_OBJECTS = \
|
LDR_OBJECTS = \
|
||||||
ldr/entry.o \
|
ldr/entry.o \
|
||||||
|
@ -64,11 +63,10 @@ RTL_OBJECTS = \
|
||||||
rtl/access.o \
|
rtl/access.o \
|
||||||
rtl/apc.o \
|
rtl/apc.o \
|
||||||
rtl/atom.o \
|
rtl/atom.o \
|
||||||
rtl/dbgbuffer.o \
|
|
||||||
rtl/bitmap.o \
|
|
||||||
rtl/callback.o \
|
rtl/callback.o \
|
||||||
rtl/crc32.o \
|
rtl/crc32.o \
|
||||||
rtl/critical.o \
|
rtl/critical.o \
|
||||||
|
rtl/dbgbuffer.o \
|
||||||
rtl/exception.o \
|
rtl/exception.o \
|
||||||
rtl/handle.o \
|
rtl/handle.o \
|
||||||
rtl/intrlck.o \
|
rtl/intrlck.o \
|
||||||
|
@ -87,6 +85,7 @@ RTL_OBJECTS = \
|
||||||
rtl/timerqueue.o \
|
rtl/timerqueue.o \
|
||||||
rtl/libsupp.o
|
rtl/libsupp.o
|
||||||
|
|
||||||
|
|
||||||
STDIO_OBJECTS = \
|
STDIO_OBJECTS = \
|
||||||
stdio/sprintf.o \
|
stdio/sprintf.o \
|
||||||
stdio/sscanf.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
|
# ReactOS Operating System
|
||||||
#
|
#
|
||||||
|
@ -110,8 +110,6 @@ OBJECTS_NT = \
|
||||||
# Run-Time Library (Rtl)
|
# Run-Time Library (Rtl)
|
||||||
OBJECTS_RTL = \
|
OBJECTS_RTL = \
|
||||||
rtl/atom.o \
|
rtl/atom.o \
|
||||||
rtl/bit.o \
|
|
||||||
rtl/bitmap.o \
|
|
||||||
rtl/capture.o \
|
rtl/capture.o \
|
||||||
rtl/ctype.o \
|
rtl/ctype.o \
|
||||||
rtl/handle.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…
Add table
Add a link
Reference in a new issue