mirror of
https://github.com/reactos/reactos.git
synced 2024-09-14 23:01:53 +00:00
Added more bitmap functions
Fixed some STDCALL issues svn path=/trunk/; revision=1035
This commit is contained in:
parent
a12836346f
commit
e2eb8c1697
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue