- return(STATUS_NO_MEMORY);
- }
- Vcn = CurrentRetDescList->RetrievalPointers.Extents[CurrentRetDescList->RetrievalPointers.ExtentCount-1].NextVcn;
- CurrentRetDescList = CurrentRetDescList->Next;
- }
- else
- {
- break;
- }
- }
-
- PagingFile = ExAllocatePool(NonPagedPool, sizeof(*PagingFile));
- if (PagingFile == NULL)
- {
- while (RetDescList)
- {
- CurrentRetDescList = RetDescList;
- RetDescList = RetDescList->Next;
- ExFreePool(CurrentRetDescList);
- }
- ObDereferenceObject(FileObject);
- ZwClose(FileHandle);
- return(STATUS_NO_MEMORY);
- }
-
- RtlZeroMemory(PagingFile, sizeof(*PagingFile));
-
- PagingFile->FileObject = FileObject;
- PagingFile->MaximumSize.QuadPart = SafeMaximumSize.QuadPart;
- PagingFile->CurrentSize.QuadPart = SafeInitialSize.QuadPart;
- PagingFile->FreePages = (ULONG)(SafeInitialSize.QuadPart / PAGE_SIZE);
- PagingFile->UsedPages = 0;
- KeInitializeSpinLock(&PagingFile->AllocMapLock);
-
- AllocMapSize = (PagingFile->FreePages / 32) + 1;
- PagingFile->AllocMap = ExAllocatePool(NonPagedPool,
- AllocMapSize * sizeof(ULONG));
- PagingFile->AllocMapSize = AllocMapSize;
-
- if (PagingFile->AllocMap == NULL)
- {
- while (RetDescList)
- {
- CurrentRetDescList = RetDescList;
- RetDescList = RetDescList->Next;
- ExFreePool(CurrentRetDescList);
- }
- ExFreePool(PagingFile);
- ObDereferenceObject(FileObject);
- ZwClose(FileHandle);
- return(STATUS_NO_MEMORY);
- }
- DPRINT("ExtentCount: %lu\n", ExtentCount);
- Size = sizeof(RETRIEVAL_POINTERS_BUFFER) + ExtentCount * 2 * sizeof(LARGE_INTEGER);
- PagingFile->RetrievalPointers = ExAllocatePool(NonPagedPool, Size);
- if (PagingFile->RetrievalPointers == NULL)
- {
- while (RetDescList)
- {
- CurrentRetDescList = RetDescList;
- RetDescList = RetDescList->Next;
- ExFreePool(CurrentRetDescList);
- }
- ExFreePool(PagingFile->AllocMap);
- ExFreePool(PagingFile);
- ObDereferenceObject(FileObject);
- ZwClose(FileHandle);
- return(STATUS_NO_MEMORY);
- }
-
- RtlZeroMemory(PagingFile->AllocMap, AllocMapSize * sizeof(ULONG));
- RtlZeroMemory(PagingFile->RetrievalPointers, Size);
-
- Count = 0;
- PagingFile->RetrievalPointers->ExtentCount = ExtentCount;
- PagingFile->RetrievalPointers->StartingVcn = RetDescList->RetrievalPointers.StartingVcn;
- CurrentRetDescList = RetDescList;
- while (CurrentRetDescList)
- {
- memcpy(&PagingFile->RetrievalPointers->Extents[Count],
- CurrentRetDescList->RetrievalPointers.Extents,
- CurrentRetDescList->RetrievalPointers.ExtentCount * 2 * sizeof(LARGE_INTEGER));
- Count += CurrentRetDescList->RetrievalPointers.ExtentCount;
- RetDescList = CurrentRetDescList;
- CurrentRetDescList = CurrentRetDescList->Next;
- ExFreePool(RetDescList);
- }
-
- if (PagingFile->RetrievalPointers->ExtentCount != ExtentCount ||
- PagingFile->RetrievalPointers->Extents[ExtentCount - 1].NextVcn.QuadPart != MaxVcn.QuadPart)
- {
- ExFreePool(PagingFile->RetrievalPointers);
- ExFreePool(PagingFile->AllocMap);
- ExFreePool(PagingFile);
- ObDereferenceObject(FileObject);
- ZwClose(FileHandle);
- return(STATUS_UNSUCCESSFUL);
- }
-
- /*
- * Change the entries from lcn's to volume offset's.
- */
- PagingFile->RetrievalPointers->StartingVcn.QuadPart *= BytesPerAllocationUnit;
- for (i = 0; i < ExtentCount; i++)
- {
- PagingFile->RetrievalPointers->Extents[i].Lcn.QuadPart *= BytesPerAllocationUnit;
- PagingFile->RetrievalPointers->Extents[i].NextVcn.QuadPart *= BytesPerAllocationUnit;
- }
-
- KeAcquireSpinLock(&PagingFileListLock, &oldIrql);
- for (i = 0; i < MAX_PAGING_FILES; i++)
- {
- if (PagingFileList[i] == NULL)
- {
- PagingFileList[i] = PagingFile;
- break;
- }
- }
- MiFreeSwapPages = MiFreeSwapPages + PagingFile->FreePages;
- MmNumberOfPagingFiles++;
- KeReleaseSpinLock(&PagingFileListLock, oldIrql);
-
- ZwClose(FileHandle);
-
- MmSwapSpaceMessage = FALSE;
-
- return(STATUS_SUCCESS);
+ return(Status);
+ }
+ ExtentCount += CurrentRetDescList->RetrievalPointers.ExtentCount;
+ if (CurrentRetDescList->RetrievalPointers.Extents[CurrentRetDescList->RetrievalPointers.ExtentCount-1].NextVcn.QuadPart < MaxVcn.QuadPart)
+ {
+ CurrentRetDescList->Next = MmAllocRetrievelDescriptorList(PAIRS_PER_RUN);
+ if (CurrentRetDescList->Next == NULL)
+ {
+ while (RetDescList)
+ {
+ CurrentRetDescList = RetDescList;
+ RetDescList = RetDescList->Next;
+ ExFreePool(CurrentRetDescList);
+ }
+ ObDereferenceObject(FileObject);
+ ZwClose(FileHandle);
+ return(STATUS_NO_MEMORY);
+ }
+ Vcn = CurrentRetDescList->RetrievalPointers.Extents[CurrentRetDescList->RetrievalPointers.ExtentCount-1].NextVcn;
+ CurrentRetDescList = CurrentRetDescList->Next;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ PagingFile = ExAllocatePool(NonPagedPool, sizeof(*PagingFile));
+ if (PagingFile == NULL)
+ {
+ while (RetDescList)
+ {
+ CurrentRetDescList = RetDescList;
+ RetDescList = RetDescList->Next;
+ ExFreePool(CurrentRetDescList);
+ }
+ ObDereferenceObject(FileObject);
+ ZwClose(FileHandle);
+ return(STATUS_NO_MEMORY);
+ }
+
+ RtlZeroMemory(PagingFile, sizeof(*PagingFile));
+
+ PagingFile->FileObject = FileObject;
+ PagingFile->MaximumSize.QuadPart = SafeMaximumSize.QuadPart;
+ PagingFile->CurrentSize.QuadPart = SafeInitialSize.QuadPart;
+ PagingFile->FreePages = (ULONG)(SafeInitialSize.QuadPart / PAGE_SIZE);
+ PagingFile->UsedPages = 0;
+ KeInitializeSpinLock(&PagingFile->AllocMapLock);
+
+ AllocMapSize = (PagingFile->FreePages / 32) + 1;
+ PagingFile->AllocMap = ExAllocatePool(NonPagedPool,
+ AllocMapSize * sizeof(ULONG));
+ PagingFile->AllocMapSize = AllocMapSize;
+
+ if (PagingFile->AllocMap == NULL)
+ {
+ while (RetDescList)
+ {
+ CurrentRetDescList = RetDescList;
+ RetDescList = RetDescList->Next;
+ ExFreePool(CurrentRetDescList);
+ }
+ ExFreePool(PagingFile);
+ ObDereferenceObject(FileObject);
+ ZwClose(FileHandle);
+ return(STATUS_NO_MEMORY);
+ }
+ DPRINT("ExtentCount: %lu\n", ExtentCount);
+ Size = sizeof(RETRIEVAL_POINTERS_BUFFER) + ExtentCount * 2 * sizeof(LARGE_INTEGER);
+ PagingFile->RetrievalPointers = ExAllocatePool(NonPagedPool, Size);
+ if (PagingFile->RetrievalPointers == NULL)
+ {
+ while (RetDescList)
+ {
+ CurrentRetDescList = RetDescList;
+ RetDescList = RetDescList->Next;
+ ExFreePool(CurrentRetDescList);
+ }
+ ExFreePool(PagingFile->AllocMap);
+ ExFreePool(PagingFile);
+ ObDereferenceObject(FileObject);
+ ZwClose(FileHandle);
+ return(STATUS_NO_MEMORY);
+ }
+
+ RtlZeroMemory(PagingFile->AllocMap, AllocMapSize * sizeof(ULONG));
+ RtlZeroMemory(PagingFile->RetrievalPointers, Size);
+
+ Count = 0;
+ PagingFile->RetrievalPointers->ExtentCount = ExtentCount;
+ PagingFile->RetrievalPointers->StartingVcn = RetDescList->RetrievalPointers.StartingVcn;
+ CurrentRetDescList = RetDescList;
+ while (CurrentRetDescList)
+ {
+ memcpy(&PagingFile->RetrievalPointers->Extents[Count],
+ CurrentRetDescList->RetrievalPointers.Extents,
+ CurrentRetDescList->RetrievalPointers.ExtentCount * 2 * sizeof(LARGE_INTEGER));
+ Count += CurrentRetDescList->RetrievalPointers.ExtentCount;
+ RetDescList = CurrentRetDescList;
+ CurrentRetDescList = CurrentRetDescList->Next;
+ ExFreePool(RetDescList);
+ }
+
+ if (PagingFile->RetrievalPointers->ExtentCount != ExtentCount ||
+ PagingFile->RetrievalPointers->Extents[ExtentCount - 1].NextVcn.QuadPart != MaxVcn.QuadPart)
+ {
+ ExFreePool(PagingFile->RetrievalPointers);
+ ExFreePool(PagingFile->AllocMap);
+ ExFreePool(PagingFile);
+ ObDereferenceObject(FileObject);
+ ZwClose(FileHandle);
+ return(STATUS_UNSUCCESSFUL);
+ }
+
+ /*
+ * Change the entries from lcn's to volume offset's.
+ */
+ PagingFile->RetrievalPointers->StartingVcn.QuadPart *= BytesPerAllocationUnit;
+ for (i = 0; i < ExtentCount; i++)
+ {
+ PagingFile->RetrievalPointers->Extents[i].Lcn.QuadPart *= BytesPerAllocationUnit;
+ PagingFile->RetrievalPointers->Extents[i].NextVcn.QuadPart *= BytesPerAllocationUnit;
+ }
+
+ KeAcquireSpinLock(&PagingFileListLock, &oldIrql);
+ for (i = 0; i < MAX_PAGING_FILES; i++)
+ {
+ if (PagingFileList[i] == NULL)
+ {
+ PagingFileList[i] = PagingFile;
+ break;
+ }
+ }
+ MiFreeSwapPages = MiFreeSwapPages + PagingFile->FreePages;
+ MmNumberOfPagingFiles++;
+ KeReleaseSpinLock(&PagingFileListLock, oldIrql);
+
+ ZwClose(FileHandle);
+
+ MmSwapSpaceMessage = FALSE;
+
+ return(STATUS_SUCCESS);