[NTOSKRNL] Replace the alloc map by a bitmap

This commit is contained in:
Pierre Schweitzer 2018-08-11 22:47:58 +02:00
parent fb07332450
commit f080ee1305
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B

View file

@ -50,9 +50,8 @@ typedef struct _PAGINGFILE
LARGE_INTEGER CurrentSize; LARGE_INTEGER CurrentSize;
PFN_NUMBER FreePages; PFN_NUMBER FreePages;
PFN_NUMBER UsedPages; PFN_NUMBER UsedPages;
PULONG AllocMap; PRTL_BITMAP AllocMap;
KSPIN_LOCK AllocMapLock; KSPIN_LOCK AllocMapLock;
ULONG AllocMapSize;
} }
PAGINGFILE, *PPAGINGFILE; PAGINGFILE, *PPAGINGFILE;
@ -297,27 +296,13 @@ static ULONG
MiAllocPageFromPagingFile(PPAGINGFILE PagingFile) MiAllocPageFromPagingFile(PPAGINGFILE PagingFile)
{ {
KIRQL oldIrql; KIRQL oldIrql;
ULONG i, j; ULONG off;
KeAcquireSpinLock(&PagingFile->AllocMapLock, &oldIrql); KeAcquireSpinLock(&PagingFile->AllocMapLock, &oldIrql);
off = RtlFindClearBitsAndSet(PagingFile->AllocMap, 1, 0);
for (i = 0; i < PagingFile->AllocMapSize; i++)
{
for (j = 0; j < 32; j++)
{
if (!(PagingFile->AllocMap[i] & (1 << j)))
{
PagingFile->AllocMap[i] |= (1 << j);
PagingFile->UsedPages++;
PagingFile->FreePages--;
KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql);
return((i * 32) + j);
}
}
}
KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql); KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql);
return(0xFFFFFFFF);
return off;
} }
VOID VOID
@ -338,7 +323,7 @@ MmFreeSwapPage(SWAPENTRY Entry)
} }
KeAcquireSpinLockAtDpcLevel(&PagingFileList[i]->AllocMapLock); KeAcquireSpinLockAtDpcLevel(&PagingFileList[i]->AllocMapLock);
PagingFileList[i]->AllocMap[off >> 5] &= (~(1 << (off % 32))); RtlClearBit(PagingFileList[i]->AllocMap, off >> 5);
PagingFileList[i]->FreePages++; PagingFileList[i]->FreePages++;
PagingFileList[i]->UsedPages--; PagingFileList[i]->UsedPages--;
@ -661,11 +646,10 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName,
PagingFile->UsedPages = 0; PagingFile->UsedPages = 0;
KeInitializeSpinLock(&PagingFile->AllocMapLock); KeInitializeSpinLock(&PagingFile->AllocMapLock);
AllocMapSize = (PagingFile->FreePages / 32) + 1; AllocMapSize = sizeof(RTL_BITMAP) + (((PagingFile->FreePages + 31) / 32) * sizeof(ULONG));
PagingFile->AllocMap = ExAllocatePool(NonPagedPool, PagingFile->AllocMap = ExAllocatePoolWithTag(NonPagedPool,
AllocMapSize * sizeof(ULONG)); AllocMapSize,
PagingFile->AllocMapSize = AllocMapSize; TAG_MM);
if (PagingFile->AllocMap == NULL) if (PagingFile->AllocMap == NULL)
{ {
ExFreePool(PagingFile); ExFreePool(PagingFile);
@ -674,7 +658,10 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName,
return(STATUS_NO_MEMORY); return(STATUS_NO_MEMORY);
} }
RtlZeroMemory(PagingFile->AllocMap, AllocMapSize * sizeof(ULONG)); RtlInitializeBitMap(PagingFile->AllocMap,
(PULONG)(PagingFile->AllocMap + 1),
(ULONG)(PagingFile->FreePages));
RtlClearAllBits(PagingFile->AllocMap);
KeAcquireSpinLock(&PagingFileListLock, &oldIrql); KeAcquireSpinLock(&PagingFileListLock, &oldIrql);
for (i = 0; i < MAX_PAGING_FILES; i++) for (i = 0; i < MAX_PAGING_FILES; i++)