Added more bitmap functions

Fixed some STDCALL issues

svn path=/trunk/; revision=1035
This commit is contained in:
Eric Kohl 2000-03-08 01:55:34 +00:00
parent a12836346f
commit e2eb8c1697
6 changed files with 703 additions and 61 deletions

View file

@ -1,4 +1,4 @@
/* $Id: rtl.h,v 1.28 2000/03/03 00:38:15 ekohl Exp $ /* $Id: rtl.h,v 1.29 2000/03/08 01:52:52 ekohl Exp $
* *
*/ */
@ -262,6 +262,22 @@ RtlAppendUnicodeToString (
PWSTR Source PWSTR Source
); );
BOOLEAN
STDCALL
RtlAreBitsClear (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG Length
);
BOOLEAN
STDCALL
RtlAreBitsSet (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG Length
);
NTSTATUS NTSTATUS
STDCALL STDCALL
RtlCharToInteger ( RtlCharToInteger (
@ -499,6 +515,66 @@ RtlFillMemoryUlong (
ULONG Fill ULONG Fill
); );
ULONG
STDCALL
RtlFindClearBits (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
);
ULONG
STDCALL
RtlFindClearBitsAndSet (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
);
ULONG
STDCALL
RtlFindFirstRunClear (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
);
ULONG
STDCALL
RtlFindFirstRunSet (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
);
ULONG
STDCALL
RtlFindLongestRunClear (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
);
ULONG
STDCALL
RtlFindLongestRunSet (
PRTL_BITMAP BitMapHeader,
PULONG StartingIndex
);
ULONG
STDCALL
RtlFindSetBits (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
);
ULONG
STDCALL
RtlFindSetBitsAndClear (
PRTL_BITMAP BitMapHeader,
ULONG NumberToFind,
ULONG HintIndex
);
VOID VOID
STDCALL STDCALL
RtlFreeAnsiString ( RtlFreeAnsiString (
@ -839,6 +915,18 @@ RtlNtStatusToPsxErrno (
NTSTATUS StatusCode NTSTATUS StatusCode
); );
ULONG
STDCALL
RtlNumberOfClearBits (
PRTL_BITMAP BitMapHeader
);
ULONG
STDCALL
RtlNumberOfSetBits (
PRTL_BITMAP BitMapHeader
);
ULONG ULONG
STDCALL STDCALL
RtlOemStringToUnicodeSize ( RtlOemStringToUnicodeSize (
@ -914,6 +1002,14 @@ RtlSetAllBits (
IN PRTL_BITMAP BitMapHeader IN PRTL_BITMAP BitMapHeader
); );
VOID
STDCALL
RtlSetBits (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG NumberToSet
);
NTSTATUS NTSTATUS
STDCALL STDCALL
RtlSetDaclSecurityDescriptor ( RtlSetDaclSecurityDescriptor (
@ -931,15 +1027,6 @@ RtlSizeHeap (
PVOID pmem PVOID pmem
); );
#if 0
PWSTR
RtlStrtok (
PUNICODE_STRING _string,
PWSTR _sep,
PWSTR * temp
);
#endif
VOID VOID
RtlStoreLong ( RtlStoreLong (
PULONG Address, PULONG Address,

View file

@ -29,7 +29,25 @@ typedef struct t_KeServiceDescriptorTableEntry {
#pragma pack() #pragma pack()
/* --- NTOSKRNL.EXE --- */
#if defined(__NTOSKRNL__)
extern
KE_SERVICE_DESCRIPTOR_TABLE_ENTRY
KeServiceDescriptorTable[SSDT_MAX_ENTRIES] __declspec(dllexport);
#else
extern
KE_SERVICE_DESCRIPTOR_TABLE_ENTRY
KeServiceDescriptorTable[SSDT_MAX_ENTRIES] __declspec(dllimport);
#endif
extern
KE_SERVICE_DESCRIPTOR_TABLE_ENTRY
KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES];
BOOLEAN BOOLEAN
STDCALL
KeAddSystemServiceTable ( KeAddSystemServiceTable (
PSSDT SSDT, PSSDT SSDT,
PULONG ServiceCounterTable, PULONG ServiceCounterTable,

View file

@ -1,4 +1,4 @@
/* $Id: usercall.c,v 1.9 2000/02/25 00:33:30 ekohl Exp $ /* $Id: usercall.c,v 1.10 2000/03/08 01:53:59 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -22,9 +22,6 @@
#include <ddk/defines.h> #include <ddk/defines.h>
extern KE_SERVICE_DESCRIPTOR_TABLE_ENTRY KeServiceDescriptorTable[];
extern KE_SERVICE_DESCRIPTOR_TABLE_ENTRY KeServiceDescriptorTableShadow[];
#define _STR(x) #x #define _STR(x) #x
#define STR(x) _STR(x) #define STR(x) _STR(x)
@ -92,6 +89,7 @@ ULONG KiAfterSystemCallHook(ULONG NtStatus, PCONTEXT Context)
// TableIndex is 0 based // TableIndex is 0 based
// ServiceCountTable its not used at the moment // ServiceCountTable its not used at the moment
BOOLEAN BOOLEAN
STDCALL
KeAddSystemServiceTable ( KeAddSystemServiceTable (
PSSDT SSDT, PSSDT SSDT,
PULONG ServiceCounterTable, PULONG ServiceCounterTable,
@ -285,3 +283,5 @@ void interrupt_handler2e(void);
"popl %ebp\n\t" /* Ebp */ "popl %ebp\n\t" /* Ebp */
"iret\n\t"); "iret\n\t");
/* EOF */

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.def,v 1.53 2000/03/06 01:02:30 ea Exp $ ; $Id: ntoskrnl.def,v 1.54 2000/03/08 01:55:34 ekohl Exp $
; ;
; reactos/ntoskrnl/ntoskrnl.def ; reactos/ntoskrnl/ntoskrnl.def
; ;
@ -187,7 +187,7 @@ IofCompleteRequest@8
KdDebuggerEnabled DATA KdDebuggerEnabled DATA
KdDebuggerNotPresent DATA KdDebuggerNotPresent DATA
KdPollBreakIn@0 KdPollBreakIn@0
KeAddSystemServiceTable KeAddSystemServiceTable@20
KeBugCheck KeBugCheck
KeBugCheckEx KeBugCheckEx
KeClearEvent KeClearEvent
@ -203,17 +203,18 @@ KeInsertQueueDpc
KeQuerySystemTime KeQuerySystemTime
KeReadStateEvent KeReadStateEvent
KeResetEvent KeResetEvent
KeServiceDescriptorTable DATA
KeSetEvent KeSetEvent
KeSetTimer KeSetTimer
KeSynchronizeExecution KeSynchronizeExecution
KeWaitForSingleObject KeWaitForSingleObject
MmGetSystemAddressForMdl MmGetSystemAddressForMdl
MmMapIoSpace MmMapIoSpace
NlsAnsiCodePage DATA NlsAnsiCodePage DATA
NlsLeadByteInfo DATA NlsLeadByteInfo DATA
NlsMbCodePageTag DATA NlsMbCodePageTag DATA
NlsMbOemCodePageTag DATA NlsMbOemCodePageTag DATA
NlsOemLeadByteInfo DATA NlsOemLeadByteInfo DATA
NtAddAtom@8 NtAddAtom@8
NtAdjustPrivilegesToken@24 NtAdjustPrivilegesToken@24
NtAllocateLocallyUniqueId@4 NtAllocateLocallyUniqueId@4
@ -287,8 +288,8 @@ RtlAppendUnicodeStringToString@8
RtlAppendUnicodeToString@8 RtlAppendUnicodeToString@8
;RtlAreAllAccessesGranted ;RtlAreAllAccessesGranted
;RtlAreAnyAccessesGranted ;RtlAreAnyAccessesGranted
;RtlAreBitsClear RtlAreBitsClear@12
;RtlAreBitsSet RtlAreBitsSet@12
;RtlAssert ;RtlAssert
;RtlCaptureStackBackTrace ;RtlCaptureStackBackTrace
RtlCharToInteger@12 RtlCharToInteger@12
@ -342,15 +343,15 @@ RtlExtendedLargeIntegerDivide@16
RtlExtendedMagicDivide@20 RtlExtendedMagicDivide@20
RtlFillMemory@12 RtlFillMemory@12
RtlFillMemoryUlong@12 RtlFillMemoryUlong@12
;RtlFindClearBits RtlFindClearBits@12
;RtlFindClearBitsAndSet RtlFindClearBitsAndSet@12
;RtlFindFirstRunClear RtlFindFirstRunClear@8
;RtlFindFirstRunSet RtlFindFirstRunSet@8
;RtlFindLongestRunClear RtlFindLongestRunClear@8
;RtlFindLongestRunSet RtlFindLongestRunSet@8
;RtlFindMessage ;RtlFindMessage
;RtlFindSetBits RtlFindSetBits@12
;RtlFindSetBitsAndClear RtlFindSetBitsAndClear@12
;RtlFindUnicodePrefix ;RtlFindUnicodePrefix
;RtlFormatCurrentUserKeyPath ;RtlFormatCurrentUserKeyPath
RtlFreeAnsiString@4 RtlFreeAnsiString@4
@ -399,8 +400,8 @@ RtlMultiByteToUnicodeSize@12
;RtlNtStatusToDosError ;RtlNtStatusToDosError
;RtlNtStatusToDosErrorNoTeb ;RtlNtStatusToDosErrorNoTeb
;RtlNumberGenericTableElements ;RtlNumberGenericTableElements
;RtlNumberOfClearBits RtlNumberOfClearBits@4
;RtlNumberOfSetBits RtlNumberOfSetBits@4
RtlOemStringToCountedUnicodeString@12 RtlOemStringToCountedUnicodeString@12
RtlOemStringToUnicodeSize@4 RtlOemStringToUnicodeSize@4
RtlOemStringToUnicodeString@12 RtlOemStringToUnicodeString@12
@ -721,4 +722,3 @@ WRITE_PORT_ULONG@8
WRITE_PORT_USHORT@8 WRITE_PORT_USHORT@8
InsertTailList InsertTailList
RemoveEntryList RemoveEntryList
_KeServiceDescriptorTable DATA

View file

@ -1,4 +1,4 @@
; $Id: ntoskrnl.edf,v 1.40 2000/03/06 01:02:30 ea Exp $ ; $Id: ntoskrnl.edf,v 1.41 2000/03/08 01:55:34 ekohl Exp $
; ;
; reactos/ntoskrnl/ntoskrnl.def ; reactos/ntoskrnl/ntoskrnl.def
; ;
@ -187,7 +187,7 @@ IofCompleteRequest=IofCompleteRequest@8
KdDebuggerEnabled DATA KdDebuggerEnabled DATA
KdDebuggerNotPresent DATA KdDebuggerNotPresent DATA
KdPollBreakIn=KdPollBreakIn@0 KdPollBreakIn=KdPollBreakIn@0
KeAddSystemServiceTable KeAddSystemServiceTable=KeAddSystemServiceTable@20
KeBugCheck KeBugCheck
KeBugCheckEx KeBugCheckEx
KeClearEvent KeClearEvent
@ -203,17 +203,18 @@ KeInsertQueueDpc
KeQuerySystemTime KeQuerySystemTime
KeReadStateEvent KeReadStateEvent
KeResetEvent KeResetEvent
KeServiceDescriptorTable DATA
KeSetEvent KeSetEvent
KeSetTimer KeSetTimer
KeSynchronizeExecution KeSynchronizeExecution
KeWaitForSingleObject KeWaitForSingleObject
MmGetSystemAddressForMdl MmGetSystemAddressForMdl
MmMapIoSpace MmMapIoSpace
NlsAnsiCodePage DATA NlsAnsiCodePage DATA
NlsLeadByteInfo DATA NlsLeadByteInfo DATA
NlsMbCodePageTag DATA NlsMbCodePageTag DATA
NlsMbOemCodePageTag DATA NlsMbOemCodePageTag DATA
NlsOemLeadByteInfo DATA NlsOemLeadByteInfo DATA
NtAddAtom=NtAddAtom@8 NtAddAtom=NtAddAtom@8
NtAdjustPrivilegesToken=NtAdjustPrivilegesToken@24 NtAdjustPrivilegesToken=NtAdjustPrivilegesToken@24
NtAllocateLocallyUniqueId=NtAllocateLocallyUniqueId@4 NtAllocateLocallyUniqueId=NtAllocateLocallyUniqueId@4
@ -280,6 +281,8 @@ RtlAppendAsciizToString=RtlAppendAsciizToString@8
RtlAppendStringToString=RtlAppendStringToString@8 RtlAppendStringToString=RtlAppendStringToString@8
RtlAppendUnicodeStringToString=RtlAppendUnicodeStringToString@8 RtlAppendUnicodeStringToString=RtlAppendUnicodeStringToString@8
RtlAppendUnicodeToString=RtlAppendUnicodeToString@8 RtlAppendUnicodeToString=RtlAppendUnicodeToString@8
RtlAreBitsClear=RtlAreBitsClear@12
RtlAreBitsSet=RtlAreBitsSet@12
RtlCharToInteger=RtlCharToInteger@12 RtlCharToInteger=RtlCharToInteger@12
RtlClearAllBits=RtlClearAllBits@4 RtlClearAllBits=RtlClearAllBits@4
RtlClearBits=RtlClearBits@12 RtlClearBits=RtlClearBits@12
@ -308,6 +311,14 @@ RtlExtendedLargeIntegerDivide=RtlExtendedLargeIntegerDivide@16
RtlExtendedMagicDivide=RtlExtendedMagicDivide@20 RtlExtendedMagicDivide=RtlExtendedMagicDivide@20
RtlFillMemory=RtlFillMemory@12 RtlFillMemory=RtlFillMemory@12
RtlFillMemoryUlong=RtlFillMemoryUlong@12 RtlFillMemoryUlong=RtlFillMemoryUlong@12
RtlFindClearBits=RtlFindClearBits@12
RtlFindClearBitsAndSet=RtlFindClearBitsAndSet@12
RtlFindFirstRunClear=RtlFindFirstRunClear@8
RtlFindFirstRunSet=RtlFindFirstRunSet@8
RtlFindLongestRunClear=RtlFindLongestRunClear@8
RtlFindLongestRunSet=RtlFindLongestRunSet@8
RtlFindSetBits=RtlFindSetBits@12
RtlFindSetBitsAndClear=RtlFindSetBitsAndClear@12
RtlFreeAnsiString=RtlFreeAnsiString@4 RtlFreeAnsiString=RtlFreeAnsiString@4
RtlFreeOemString=RtlFreeOemString@4 RtlFreeOemString=RtlFreeOemString@4
RtlFreeUnicodeString=RtlFreeUnicodeString@4 RtlFreeUnicodeString=RtlFreeUnicodeString@4
@ -335,6 +346,8 @@ RtlLengthSid=RtlLengthSid@4
RtlMoveMemory=RtlMoveMemory@12 RtlMoveMemory=RtlMoveMemory@12
RtlMultiByteToUnicodeN=RtlMultiByteToUnicodeN@20 RtlMultiByteToUnicodeN=RtlMultiByteToUnicodeN@20
RtlMultiByteToUnicodeSize=RtlMultiByteToUnicodeSize@12 RtlMultiByteToUnicodeSize=RtlMultiByteToUnicodeSize@12
RtlNumberOfClearBits=RtlNumberOfClearBits@4
RtlNumberOfSetBits=RtlNumberOfSetBits@4
RtlOemStringToCountedUnicodeString=RtlOemStringToCountedUnicodeString@12 RtlOemStringToCountedUnicodeString=RtlOemStringToCountedUnicodeString@12
RtlOemStringToUnicodeSize=RtlOemStringToUnicodeSize@4 RtlOemStringToUnicodeSize=RtlOemStringToUnicodeSize@4
RtlOemStringToUnicodeString=RtlOemStringToUnicodeString@12 RtlOemStringToUnicodeString=RtlOemStringToUnicodeString@12

View file

@ -1,4 +1,4 @@
/* $Id: bitmap.c,v 1.1 2000/03/03 00:48:50 ekohl Exp $ /* $Id: bitmap.c,v 1.2 2000/03/08 01:54:34 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -27,6 +27,84 @@ RtlInitializeBitMap (
} }
BOOLEAN
STDCALL
RtlAreBitsClear (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG Length
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Shift;
ULONG Count;
PCHAR Ptr;
if (StartingIndex >= Size ||
!Length ||
(StartingIndex + Length > Size))
return FALSE;
Ptr = (PCHAR)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;
Length -= Count;
StartingIndex += Count;
}
return TRUE;
}
BOOLEAN
STDCALL
RtlAreBitsSet (
PRTL_BITMAP BitMapHeader,
ULONG StartingIndex,
ULONG Length
)
{
ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG Shift;
ULONG Count;
PCHAR Ptr;
if (StartingIndex >= Size ||
!Length ||
(StartingIndex + Length > Size))
return FALSE;
Ptr = (PCHAR)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;
Length -= Count;
StartingIndex += Count;
}
return TRUE;
}
VOID VOID
STDCALL STDCALL
RtlClearAllBits ( RtlClearAllBits (
@ -48,9 +126,9 @@ RtlClearBits (
) )
{ {
ULONG Size = BitMapHeader->SizeOfBitMap; ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG n; ULONG Count;
ULONG shift; ULONG Shift;
PCHAR p; PCHAR Ptr;
if (StartingIndex >= Size || NumberToClear == 0) if (StartingIndex >= Size || NumberToClear == 0)
return; return;
@ -58,23 +136,469 @@ RtlClearBits (
if (StartingIndex + NumberToClear > Size) if (StartingIndex + NumberToClear > Size)
NumberToClear = Size - StartingIndex; NumberToClear = Size - StartingIndex;
p = (PCHAR)(BitMapHeader->Buffer + (StartingIndex / 8)); Ptr = (PCHAR)(BitMapHeader->Buffer + (StartingIndex / 8));
while (NumberToClear) while (NumberToClear)
{ {
/* bit shift in current byte */ /* bit shift in current byte */
shift = StartingIndex & 7; Shift = StartingIndex & 7;
/* number of bits to change in current byte */ /* number of bits to change in current byte */
n = (NumberToClear > 8 - shift ) ? 8 - shift : NumberToClear; Count = (NumberToClear > 8 - Shift ) ? 8 - Shift : NumberToClear;
/* adjust byte */ /* adjust byte */
*p++ &= ~(~(0xFF << n) << shift); *Ptr++ &= ~(~(0xFF << Count) << Shift);
NumberToClear -= n; NumberToClear -= Count;
StartingIndex += n; StartingIndex += Count;
} }
} }
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
VOID VOID
STDCALL STDCALL
RtlSetAllBits ( RtlSetAllBits (
@ -86,6 +610,7 @@ RtlSetAllBits (
ALIGN(BitMapHeader->SizeOfBitMap, 8)); ALIGN(BitMapHeader->SizeOfBitMap, 8));
} }
VOID VOID
STDCALL STDCALL
RtlSetBits ( RtlSetBits (
@ -95,9 +620,9 @@ RtlSetBits (
) )
{ {
ULONG Size = BitMapHeader->SizeOfBitMap; ULONG Size = BitMapHeader->SizeOfBitMap;
ULONG n; ULONG Count;
ULONG shift; ULONG Shift;
PCHAR p; PCHAR Ptr;
if (StartingIndex >= Size || NumberToSet == 0) if (StartingIndex >= Size || NumberToSet == 0)
return; return;
@ -105,21 +630,20 @@ RtlSetBits (
if (StartingIndex + NumberToSet > Size) if (StartingIndex + NumberToSet > Size)
NumberToSet = Size - StartingIndex; NumberToSet = Size - StartingIndex;
p = (PCHAR)BitMapHeader->Buffer + (StartingIndex / 8); Ptr = (PCHAR)BitMapHeader->Buffer + (StartingIndex / 8);
while (NumberToSet) while (NumberToSet)
{ {
/* bit shift in current byte */ /* bit shift in current byte */
shift = StartingIndex & 7; Shift = StartingIndex & 7;
/* number of bits to change in current byte */ /* number of bits to change in current byte */
n = (NumberToSet > 8 - shift) ? 8 - shift : NumberToSet; Count = (NumberToSet > 8 - Shift) ? 8 - Shift : NumberToSet;
/* adjust byte */ /* adjust byte */
*p++ |= ~( 0xFF << n ) << shift; *Ptr++ |= ~(0xFF << Count) << Shift;
NumberToSet -= n; NumberToSet -= Count;
StartingIndex += n; StartingIndex += Count;
} }
} }
/* EOF */ /* EOF */