00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
#include "mi.h"
00027 
00028 
00029 
00030 
00031 
00032 #define _16MB ((16*1024*1024)/PAGE_SIZE)
00033 
00034 
00035 
VOID
00036 MiInitMachineDependent (
00037     IN 
PLOADER_PARAMETER_BLOCK LoaderBlock
00038     )
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 {
00067 
00068     ULONG i, j;
00069     ULONG HighPage;
00070     ULONG PdePageNumber;
00071     ULONG PdePage;
00072     ULONG PageFrameIndex;
00073     ULONG NextPhysicalPage;
00074     ULONG PfnAllocation;
00075     ULONG NumberOfPages;
00076     ULONG MaxPool;
00077     KIRQL OldIrql;
00078     
PEPROCESS CurrentProcess;
00079     ULONG DirBase;
00080     ULONG MostFreePage = 0;
00081     ULONG MostFreeLowMem = 0;
00082     PLIST_ENTRY NextMd;
00083     
PMEMORY_ALLOCATION_DESCRIPTOR FreeDescriptor = 
NULL;
00084     
PMEMORY_ALLOCATION_DESCRIPTOR FreeDescriptorLowMem = 
NULL;
00085     
PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor;
00086     
MMPTE TempPte;
00087     
PMMPTE PointerPde;
00088     
PMMPTE PointerPte;
00089     
PMMPTE LastPte;
00090     
PMMPTE Pde;
00091     
PMMPTE StartPde;
00092     
PMMPTE EndPde;
00093     
PMMPFN Pfn1;
00094     
PMMPFN Pfn2;
00095     ULONG va;
00096 
00097     PointerPte = 
MiGetPdeAddress (PDE_BASE);
00098 
00099 
00100     PdePageNumber = PointerPte->
u.Hard.PageFrameNumber;
00101 
00102     DirBase = PdePageNumber << 
PAGE_SHIFT;
00103 
00104     
PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = DirBase;
00105 
00106     
KeSweepDcache (
FALSE);
00107 
00108     
00109     
00110     
00111     
00112 
00113     NextMd = LoaderBlock->MemoryDescriptorListHead.Flink;
00114 
00115     
while (NextMd != &LoaderBlock->MemoryDescriptorListHead) {
00116 
00117         MemoryDescriptor = CONTAINING_RECORD(NextMd,
00118                                              
MEMORY_ALLOCATION_DESCRIPTOR,
00119                                              ListEntry);
00120 
00121         HighPage = MemoryDescriptor->
BasePage + MemoryDescriptor->
PageCount - 1;
00122         
MmNumberOfPhysicalPages += MemoryDescriptor->
PageCount;
00123 
00124         
if (MemoryDescriptor->
BasePage < 
MmLowestPhysicalPage) {
00125             
MmLowestPhysicalPage = MemoryDescriptor->
BasePage;
00126         }
00127 
00128         
if (HighPage > 
MmHighestPhysicalPage) {
00129             
MmHighestPhysicalPage = HighPage;
00130         }
00131 
00132             
00133         
00134         
00135 
00136         
if ((MemoryDescriptor->
MemoryType == 
LoaderFree) ||
00137             (MemoryDescriptor->
MemoryType == 
LoaderLoadedProgram) ||
00138             (MemoryDescriptor->
MemoryType == 
LoaderFirmwareTemporary) ||
00139             (MemoryDescriptor->
MemoryType == 
LoaderOsloaderStack)) {
00140 
00141             
if ((MemoryDescriptor->
BasePage < 
_16MB) &&
00142                 (MostFreeLowMem < MemoryDescriptor->
PageCount) &&
00143                 (MostFreeLowMem < ((ULONG)
_16MB - MemoryDescriptor->
BasePage))) {
00144 
00145                 MostFreeLowMem = (ULONG)
_16MB - MemoryDescriptor->
BasePage;
00146                 
if (MemoryDescriptor->
PageCount < MostFreeLowMem) {
00147                     MostFreeLowMem = MemoryDescriptor->
PageCount;
00148                 }
00149                 FreeDescriptorLowMem = MemoryDescriptor;
00150 
00151             } 
else if (MemoryDescriptor->
PageCount > MostFreePage) {
00152 
00153                 MostFreePage = MemoryDescriptor->
PageCount;
00154                 FreeDescriptor = MemoryDescriptor;
00155             }
00156         }
00157 
00158         NextMd = MemoryDescriptor->
ListEntry.Flink;
00159     }
00160 
00161     
00162     
00163     
00164 
00165     
if (
MmNumberOfPhysicalPages < 1024) {
00166         
KeBugCheckEx (INSTALL_MORE_MEMORY,
00167                       
MmNumberOfPhysicalPages,
00168                       
MmLowestPhysicalPage,
00169                       
MmHighestPhysicalPage,
00170                       0);
00171     }
00172 
00173     
00174     
00175     
00176     
00177     
00178     
00179     
00180     
00181     
00182 
00183     
if ((
MmSizeOfNonPagedPoolInBytes >> 
PAGE_SHIFT) >
00184                         (7 * (
MmNumberOfPhysicalPages << 3))) {
00185 
00186         
00187         
00188         
00189 
00190         
MmSizeOfNonPagedPoolInBytes = 0;
00191     }
00192 
00193     
if (
MmSizeOfNonPagedPoolInBytes < 
MmMinimumNonPagedPoolSize) {
00194 
00195         
00196         
00197         
00198         
00199         
00200 
00201         
MmSizeOfNonPagedPoolInBytes = 
MmMinimumNonPagedPoolSize;
00202 
00203         
MmSizeOfNonPagedPoolInBytes +=
00204                             ((
MmNumberOfPhysicalPages - 1024)/256) *
00205                             
MmMinAdditionNonPagedPoolPerMb;
00206     }
00207 
00208     
if (
MmSizeOfNonPagedPoolInBytes > 
MM_MAX_INITIAL_NONPAGED_POOL) {
00209         
MmSizeOfNonPagedPoolInBytes = 
MM_MAX_INITIAL_NONPAGED_POOL;
00210     }
00211 
00212     
00213     
00214     
00215 
00216     
MmSizeOfNonPagedPoolInBytes &= ~(
PAGE_SIZE - 1);
00217 
00218     
00219     
00220     
00221 
00222     
if (
MmMaximumNonPagedPoolInBytes == 0) {
00223 
00224         
00225         
00226         
00227         
00228         
00229 
00230         
MmMaximumNonPagedPoolInBytes = 
MmDefaultMaximumNonPagedPool;
00231 
00232         
00233         
00234         
00235 
00236         
MmMaximumNonPagedPoolInBytes += (ULONG)
PAGE_ALIGN (
00237                                       
MmHighestPhysicalPage * 
sizeof(
MMPFN));
00238 
00239         
MmMaximumNonPagedPoolInBytes +=
00240                         ((
MmNumberOfPhysicalPages - 1024)/256) *
00241                         
MmMaxAdditionNonPagedPoolPerMb;
00242     }
00243 
00244     MaxPool = 
MmSizeOfNonPagedPoolInBytes + 
PAGE_SIZE * 16 +
00245                                    (ULONG)
PAGE_ALIGN (
00246                                         
MmHighestPhysicalPage * 
sizeof(
MMPFN));
00247 
00248     
if (
MmMaximumNonPagedPoolInBytes < MaxPool) {
00249         
MmMaximumNonPagedPoolInBytes = MaxPool;
00250     }
00251 
00252     
if (
MmMaximumNonPagedPoolInBytes > 
MM_MAX_ADDITIONAL_NONPAGED_POOL) {
00253         
MmMaximumNonPagedPoolInBytes = 
MM_MAX_ADDITIONAL_NONPAGED_POOL;
00254     }
00255 
00256     
MmNonPagedPoolStart = (PVOID)((ULONG)
MmNonPagedPoolEnd
00257                                       - (
MmMaximumNonPagedPoolInBytes - 1));
00258 
00259     
MmNonPagedPoolStart = (PVOID)
PAGE_ALIGN(
MmNonPagedPoolStart);
00260 
00261     
00262     
00263     
00264     
00265 
00266     
MmNonPagedSystemStart = (PVOID)(((ULONG)
MmNonPagedPoolStart -
00267                                 ((
MmNumberOfSystemPtes + 1) * 
PAGE_SIZE)) &
00268                                  (~
PAGE_DIRECTORY_MASK));
00269 
00270     
if (
MmNonPagedSystemStart < 
MM_LOWEST_NONPAGED_SYSTEM_START) {
00271         
MmNonPagedSystemStart = 
MM_LOWEST_NONPAGED_SYSTEM_START;
00272         
MmNumberOfSystemPtes = (((ULONG)
MmNonPagedPoolStart -
00273                                  (ULONG)
MmNonPagedSystemStart) >> 
PAGE_SHIFT)-1;
00274         
ASSERT (
MmNumberOfSystemPtes > 1000);
00275     }
00276 
00277     StartPde = 
MiGetPdeAddress (
MmNonPagedSystemStart);
00278 
00279     EndPde = 
MiGetPdeAddress((PVOID)((PCHAR)
MmNonPagedPoolEnd - 1));
00280 
00281     
ASSERT ((ULONG)(EndPde - StartPde) < FreeDescriptorLowMem->
PageCount);
00282 
00283     
00284     
00285     
00286     
00287 
00288     NextPhysicalPage = FreeDescriptorLowMem->
BasePage;
00289     NumberOfPages = FreeDescriptorLowMem->
PageCount;
00290     TempPte = 
ValidKernelPte;
00291 
00292     
while (StartPde <= EndPde) {
00293         
if (StartPde->u.Hard.Valid == 0) {
00294 
00295             
00296             
00297             
00298 
00299             TempPte.
u.Hard.PageFrameNumber = NextPhysicalPage;
00300             NextPhysicalPage += 1;
00301             NumberOfPages -= 1;
00302             *StartPde = TempPte;
00303 
00304         }
00305         StartPde += 1;
00306     }
00307 
00308     
ASSERT(NumberOfPages > 0);
00309 
00310     
00311     
00312     
00313 
00314     StartPde = 
MiGetPteAddress(
MmNonPagedSystemStart);
00315     PointerPte = 
MiGetPteAddress(
MmNonPagedPoolStart);
00316 
00317     RtlZeroMemory (StartPde, ((ULONG)PointerPte - (ULONG)StartPde));
00318 
00319     
00320     
00321     
00322 
00323     LastPte = 
MiGetPteAddress((ULONG)
MmNonPagedPoolStart +
00324                                         
MmSizeOfNonPagedPoolInBytes - 1);
00325     
while (PointerPte <= LastPte) {
00326         TempPte.
u.Hard.PageFrameNumber = NextPhysicalPage;
00327         NextPhysicalPage += 1;
00328         NumberOfPages -= 1;
00329         
if (NumberOfPages == 0) {
00330             
ASSERT (NextPhysicalPage != (FreeDescriptor->
BasePage +
00331                                          FreeDescriptor->
PageCount));
00332             NextPhysicalPage = FreeDescriptor->
BasePage;
00333             NumberOfPages = FreeDescriptor->
PageCount;
00334         }
00335         *PointerPte = TempPte;
00336         PointerPte++;
00337     }
00338 
00339     
00340     
00341     
00342 
00343     
while (((ULONG)PointerPte & (
PAGE_SIZE - 1)) != 0) {
00344         *PointerPte = 
ZeroKernelPte;
00345         PointerPte++;
00346     }
00347 
00348     
MmPageAlignedPoolBase[
NonPagedPool] = 
MmNonPagedPoolStart;
00349 
00350     
00351     
00352     
00353 
00354     
MmNonPagedPoolExpansionStart = (PVOID)((PCHAR)
MmNonPagedPoolStart +
00355                     
MmSizeOfNonPagedPoolInBytes);
00356     
MiInitializeNonPagedPool (
MmNonPagedPoolStart);
00357 
00358     
00359     
00360     
00361     
00362     
00363     
00364 
00365     
00366     
00367     
00368     
00369     
00370     
00371     
00372 
00373     
00374     
00375     
00376 
00377     
if (
MmSecondaryColors == 0) {
00378         
MmSecondaryColors = PCR->SecondLevelDcacheSize;
00379     }
00380 
00381     
MmSecondaryColors = 
MmSecondaryColors >> 
PAGE_SHIFT;
00382 
00383     
00384     
00385     
00386 
00387     
if (((
MmSecondaryColors & (
MmSecondaryColors -1)) != 0) ||
00388         (
MmSecondaryColors < 
MM_SECONDARY_COLORS_MIN) ||
00389         (
MmSecondaryColors > 
MM_SECONDARY_COLORS_MAX)) {
00390         
MmSecondaryColors = 
MM_SECONDARY_COLORS_DEFAULT;
00391     }
00392 
00393     
MmSecondaryColorMask = (
MmSecondaryColors - 1) & ~
MM_COLOR_MASK;
00394 
00395     PfnAllocation = 1 + ((((
MmHighestPhysicalPage + 1) * 
sizeof(
MMPFN)) +
00396                         (
MmSecondaryColors * 
sizeof(
MMCOLOR_TABLES)*2))
00397                             >> 
PAGE_SHIFT);
00398 
00399     
00400     
00401     
00402     
00403 
00404     PointerPte = 
MiReserveSystemPtes (PfnAllocation,
00405                                       
NonPagedPoolExpansion,
00406                                       0,
00407                                       0,
00408                                       
TRUE);
00409 
00410     
MmPfnDatabase = (
PMMPFN)(
MiGetVirtualAddressMappedByPte (PointerPte));
00411 
00412     
00413     
00414     
00415     
00416     
00417     
00418 
00419     NextMd = LoaderBlock->MemoryDescriptorListHead.Flink;
00420 
00421     
while (NextMd != &LoaderBlock->MemoryDescriptorListHead) {
00422 
00423         MemoryDescriptor = CONTAINING_RECORD(NextMd,
00424                                              
MEMORY_ALLOCATION_DESCRIPTOR,
00425                                              ListEntry);
00426 
00427         PointerPte = 
MiGetPteAddress (
MI_PFN_ELEMENT(
00428                                         MemoryDescriptor->
BasePage));
00429 
00430         LastPte = 
MiGetPteAddress (((PCHAR)(
MI_PFN_ELEMENT(
00431                                         MemoryDescriptor->
BasePage +
00432                                         MemoryDescriptor->
PageCount))) - 1);
00433 
00434         
while (PointerPte <= LastPte) {
00435             
if (PointerPte->
u.Hard.Valid == 0) {
00436                 TempPte.
u.Hard.PageFrameNumber = NextPhysicalPage;
00437                 NextPhysicalPage += 1;
00438                 NumberOfPages -= 1;
00439                 
if (NumberOfPages == 0) {
00440                     
ASSERT (NextPhysicalPage != (FreeDescriptor->
BasePage +
00441                                                  FreeDescriptor->
PageCount));
00442                     NextPhysicalPage = FreeDescriptor->
BasePage;
00443                     NumberOfPages = FreeDescriptor->
PageCount;
00444                 }
00445                 *PointerPte = TempPte;
00446                 RtlZeroMemory (
MiGetVirtualAddressMappedByPte (PointerPte),
00447                                
PAGE_SIZE);
00448             }
00449             PointerPte++;
00450         }
00451         NextMd = MemoryDescriptor->
ListEntry.Flink;
00452     }
00453 
00454     
MmFreePagesByColor[0] = (
PMMCOLOR_TABLES)
00455                                 &
MmPfnDatabase[
MmHighestPhysicalPage + 1];
00456 
00457     
MmFreePagesByColor[1] = &
MmFreePagesByColor[0][
MmSecondaryColors];
00458 
00459     
00460     
00461     
00462 
00463 
00464     
if (!
MI_IS_PHYSICAL_ADDRESS(
MmFreePagesByColor[0])) {
00465         PointerPte = 
MiGetPteAddress (&
MmFreePagesByColor[0][0]);
00466 
00467         LastPte = 
MiGetPteAddress (
00468                   (PVOID)((PCHAR)&
MmFreePagesByColor[1][
MmSecondaryColors] - 1));
00469 
00470         
while (PointerPte <= LastPte) {
00471             
if (PointerPte->
u.Hard.Valid == 0) {
00472                 TempPte.
u.Hard.PageFrameNumber = NextPhysicalPage;
00473                 NextPhysicalPage += 1;
00474                 *PointerPte = TempPte;
00475                 RtlZeroMemory (
MiGetVirtualAddressMappedByPte (PointerPte),
00476                                
PAGE_SIZE);
00477             }
00478             PointerPte++;
00479         }
00480     }
00481 
00482     
for (i = 0; i < 
MmSecondaryColors; i++) {
00483         
MmFreePagesByColor[
ZeroedPageList][i].
Flink = 
MM_EMPTY_LIST;
00484         
MmFreePagesByColor[
FreePageList][i].
Flink = 
MM_EMPTY_LIST;
00485     }
00486 
00487 
#if MM_MAXIMUM_NUMBER_OF_COLORS > 1
00488 
    for (i = 0; i < 
MM_MAXIMUM_NUMBER_OF_COLORS; i++) {
00489         
MmFreePagesByPrimaryColor[
ZeroedPageList][i].
ListName = 
ZeroedPageList;
00490         
MmFreePagesByPrimaryColor[
FreePageList][i].
ListName = 
FreePageList;
00491         
MmFreePagesByPrimaryColor[
ZeroedPageList][i].
Flink = 
MM_EMPTY_LIST;
00492         
MmFreePagesByPrimaryColor[
FreePageList][i].
Flink = 
MM_EMPTY_LIST;
00493         
MmFreePagesByPrimaryColor[
ZeroedPageList][i].
Blink = 
MM_EMPTY_LIST;
00494         
MmFreePagesByPrimaryColor[
FreePageList][i].
Blink = 
MM_EMPTY_LIST;
00495     }
00496 
#endif
00497 
00498     
00499     
00500     
00501     
00502 
00503     Pde = 
MiGetPdeAddress (
NULL);
00504     PointerPde = 
MiGetPdeAddress (PTE_BASE);
00505     va = 0;
00506 
00507     
for (i = 0; i < 
PDE_PER_PAGE; i++) {
00508         
if (Pde->
u.Hard.Valid == 1) {
00509 
00510             PdePage = Pde->
u.Hard.PageFrameNumber;
00511             Pfn1 = 
MI_PFN_ELEMENT(PdePage);
00512             Pfn1->
PteFrame = PointerPde->
u.Hard.PageFrameNumber;
00513             Pfn1->
PteAddress = Pde;
00514             Pfn1->
u2.ShareCount += 1;
00515             Pfn1->
u3.e2.ReferenceCount = 1;
00516             Pfn1->
u3.e1.PageLocation = 
ActiveAndValid;
00517             Pfn1->
u3.e1.PageColor = 
MI_GET_COLOR_FROM_SECONDARY(
00518                                         
MI_GET_PAGE_COLOR_FROM_PTE (Pde));
00519 
00520             PointerPte = 
MiGetPteAddress (va);
00521 
00522             
for (j = 0 ; j < 
PTE_PER_PAGE; j++) {
00523                 
if (PointerPte->
u.Hard.Valid == 1) {
00524 
00525                     Pfn1->
u2.ShareCount += 1;
00526 
00527                     PageFrameIndex = PointerPte->
u.Hard.PageFrameNumber;
00528 
00529                     
if (PageFrameIndex <= 
MmHighestPhysicalPage) {
00530 
00531                         Pfn2 = 
MI_PFN_ELEMENT(PageFrameIndex);
00532 
00533                         
if (
MmIsAddressValid(Pfn2) &&
00534                              
MmIsAddressValid((PUCHAR)(Pfn2+1)-1)) {
00535 
00536                             Pfn2->PteFrame = PdePage;
00537                             Pfn2->PteAddress = PointerPte;
00538                             Pfn2->u2.ShareCount += 1;
00539                             Pfn2->u3.e2.ReferenceCount = 1;
00540                             Pfn2->u3.e1.PageLocation = 
ActiveAndValid;
00541                             Pfn2->u3.e1.PageColor = 
MI_GET_COLOR_FROM_SECONDARY(
00542                                                         
MI_GET_PAGE_COLOR_FROM_PTE (
00543                                                             PointerPte));
00544                         }
00545                     }
00546                 }
00547                 va += 
PAGE_SIZE;
00548                 PointerPte++;
00549             }
00550         } 
else {
00551             va += (ULONG)
PDE_PER_PAGE * (ULONG)
PAGE_SIZE;
00552         }
00553         Pde++;
00554     }
00555 
00556     
00557     
00558     
00559     
00560     
00561 
00562     Pfn1 = &
MmPfnDatabase[
MmLowestPhysicalPage];
00563     
if (Pfn1->
u3.e2.ReferenceCount == 0) {
00564 
00565         
00566         
00567         
00568         
00569 
00570         Pde = 
MiGetPdeAddress (0xb0000000);
00571         PdePage = Pde->
u.Hard.PageFrameNumber;
00572         Pfn1->
PteFrame = PdePageNumber;
00573         Pfn1->
PteAddress = Pde;
00574         Pfn1->
u2.ShareCount += 1;
00575         Pfn1->
u3.e2.ReferenceCount = 1;
00576         Pfn1->
u3.e1.PageLocation = 
ActiveAndValid;
00577         Pfn1->
u3.e1.PageColor = 
MI_GET_COLOR_FROM_SECONDARY(
00578                                     
MI_GET_PAGE_COLOR_FROM_PTE (Pde));
00579     }
00580 
00581     
00582 
00583     
00584     
00585     
00586     
00587     
00588 
00589     NextMd = LoaderBlock->MemoryDescriptorListHead.Flink;
00590 
00591     
while (NextMd != &LoaderBlock->MemoryDescriptorListHead) {
00592 
00593         MemoryDescriptor = CONTAINING_RECORD(NextMd,
00594                                              
MEMORY_ALLOCATION_DESCRIPTOR,
00595                                              ListEntry);
00596 
00597         i = MemoryDescriptor->
PageCount;
00598         NextPhysicalPage = MemoryDescriptor->
BasePage;
00599 
00600         
switch (MemoryDescriptor->
MemoryType) {
00601             
case LoaderBad:
00602                 
while (i != 0) {
00603                     
MiInsertPageInList (
MmPageLocationList[
BadPageList],
00604                                         NextPhysicalPage);
00605                     i -= 1;
00606                     NextPhysicalPage += 1;
00607                 }
00608                 
break;
00609 
00610             
case LoaderFree:
00611             
case LoaderLoadedProgram:
00612             
case LoaderFirmwareTemporary:
00613             
case LoaderOsloaderStack:
00614 
00615                 Pfn1 = 
MI_PFN_ELEMENT (NextPhysicalPage);
00616                 
while (i != 0) {
00617                     
if (Pfn1->
u3.e2.ReferenceCount == 0) {
00618 
00619                         
00620                         
00621                         
00622                         
00623 
00624                         Pfn1->
PteAddress =
00625                                         (
PMMPTE)(NextPhysicalPage << 
PTE_SHIFT);
00626 
00627                         Pfn1->
u3.e1.PageColor = 
MI_GET_COLOR_FROM_SECONDARY(
00628                                                     
MI_GET_PAGE_COLOR_FROM_PTE (
00629                                                         Pfn1->
PteAddress));
00630                         
MiInsertPageInList (
MmPageLocationList[
FreePageList],
00631                                             NextPhysicalPage);
00632                     }
00633                     Pfn1++;
00634                     i -= 1;
00635                     NextPhysicalPage += 1;
00636                 }
00637                 
break;
00638 
00639             
default:
00640 
00641                 PointerPte = 
MiGetPteAddress (
KSEG0_BASE +
00642                                             (NextPhysicalPage << 
PAGE_SHIFT));
00643                 Pfn1 = 
MI_PFN_ELEMENT (NextPhysicalPage);
00644                 
while (i != 0) {
00645 
00646                     
00647                     
00648                     
00649 
00650                     
if (Pfn1->
u3.e2.ReferenceCount == 0) {
00651                         Pfn1->
PteFrame = PdePageNumber;
00652                         Pfn1->
PteAddress = PointerPte;
00653                         Pfn1->
u2.ShareCount += 1;
00654                         Pfn1->
u3.e2.ReferenceCount = 1;
00655                         Pfn1->
u3.e1.PageLocation = 
ActiveAndValid;
00656                         Pfn1->
u3.e1.PageColor = 
MI_GET_COLOR_FROM_SECONDARY(
00657                                                     
MI_GET_PAGE_COLOR_FROM_PTE (
00658                                                         PointerPte));
00659                     }
00660                     Pfn1++;
00661                     i -= 1;
00662                     NextPhysicalPage += 1;
00663                     PointerPte += 1;
00664                 }
00665 
00666                 
break;
00667         }
00668 
00669         NextMd = MemoryDescriptor->
ListEntry.Flink;
00670     }
00671 
00672     
00673     
00674     
00675 
00676     Pfn1 = 
MI_PFN_ELEMENT(
MiGetPteAddress(&
MmPfnDatabase[
MmLowestPhysicalPage])->u.Hard.PageFrameNumber);
00677     Pfn1->
u3.e1.StartOfAllocation = 1;
00678     Pfn1 = 
MI_PFN_ELEMENT(
MiGetPteAddress(&
MmPfnDatabase[
MmHighestPhysicalPage])->u.Hard.PageFrameNumber);
00679     Pfn1->
u3.e1.EndOfAllocation = 1;
00680 
00681     
00682     
00683     
00684     
00685 
00686     i = 
MmSizeOfNonPagedMustSucceed;
00687     Pfn1 = 
MI_PFN_ELEMENT(
MiGetPteAddress(
MmNonPagedMustSucceed)->u.Hard.PageFrameNumber);
00688 
00689     
while ((LONG)i > 0) {
00690         Pfn1->
u3.e1.StartOfAllocation = 1;
00691         Pfn1->
u3.e1.EndOfAllocation = 1;
00692         i -= 
PAGE_SIZE;
00693         Pfn1 += 1;
00694     }
00695 
00696     
KeInitializeSpinLock (&
MmSystemSpaceLock);
00697     
KeInitializeSpinLock (&
MmPfnLock);
00698 
00699     
00700     
00701     
00702     
00703 
00704     PointerPte = 
MiGetPteAddress (
MmNonPagedSystemStart);
00705 
00706     PointerPte = (
PMMPTE)
PAGE_ALIGN (PointerPte);
00707 
00708     
MmNumberOfSystemPtes = 
MiGetPteAddress(
MmNonPagedPoolStart) - PointerPte - 1;
00709 
00710     
MiInitializeSystemPtes (PointerPte, 
MmNumberOfSystemPtes, 
SystemPteSpace);
00711 
00712     
00713     
00714     
00715 
00716     
InitializePool(
NonPagedPool,0);
00717 
00718     
00719     
00720     
00721 
00722     
00723     
00724     
00725     
00726     
00727     
00728     
00729 
00730     PointerPte = 
MiGetPdeAddress(
HYPER_SPACE);
00731 
00732     
ASSERT (PointerPte->u.Hard.Valid == 1);
00733     PointerPte->u.Hard.Write = 1;
00734     PageFrameIndex = PointerPte->u.Hard.PageFrameNumber;
00735 
00736     
00737     
00738     
00739 
00740     PointerPte = 
MiGetPteAddress(
HYPER_SPACE);
00741     RtlZeroMemory ((PVOID)PointerPte, 
PAGE_SIZE);
00742 
00743     
00744     
00745     
00746 
00747     
MmFirstReservedMappingPte = 
MiGetPteAddress (
FIRST_MAPPING_PTE);
00748     
MmLastReservedMappingPte = 
MiGetPteAddress (
LAST_MAPPING_PTE);
00749 
00750     
MmWorkingSetList = 
WORKING_SET_LIST;
00751     
MmWsle = (
PMMWSLE)((PUCHAR)
WORKING_SET_LIST + 
sizeof(
MMWSL));
00752 
00753     
00754     
00755     
00756     
00757 
00758     
00759     
00760     
00761     
00762     
00763 
00764     Pfn1 = 
MI_PFN_ELEMENT (PdePageNumber);
00765     Pfn1->
u2.ShareCount = 0;
00766     Pfn1->
u3.e2.ReferenceCount = 0;
00767     Pfn1->
u3.e1.PageColor = 0;
00768 
00769     
00770     
00771     
00772     
00773     
00774 
00775     Pfn1 = 
MI_PFN_ELEMENT (PageFrameIndex);
00776     Pfn1->
u2.ShareCount = 0;
00777     Pfn1->
u3.e2.ReferenceCount = 0;
00778     Pfn1->
u3.e1.PageColor = 1;
00779 
00780 
00781     CurrentProcess = 
PsGetCurrentProcess ();
00782 
00783     
00784     
00785     
00786     
00787 
00788     PointerPte = 
MiGetPteAddress (
HYPER_SPACE);
00789     PageFrameIndex = 
MiRemoveAnyPage (
MI_GET_PAGE_COLOR_FROM_PTE(PointerPte));
00790     CurrentProcess->
WorkingSetPage = PageFrameIndex;
00791 
00792     TempPte.
u.Hard.PageFrameNumber = PageFrameIndex;
00793     PointerPde = 
MiGetPdeAddress (
HYPER_SPACE) + 1;
00794 
00795     *PointerPde = TempPte;
00796 
00797     PointerPte = 
MiGetVirtualAddressMappedByPte (PointerPde);
00798 
00799     RtlZeroMemory ((PVOID)PointerPte, 
PAGE_SIZE);
00800 
00801     TempPte = *PointerPde;
00802     TempPte.
u.Hard.Valid = 0;
00803 
00804     
KeRaiseIrql(
DISPATCH_LEVEL, &OldIrql);
00805     
KeFlushSingleTb (PointerPte,
00806                      
TRUE,
00807                      
FALSE,
00808                      (PHARDWARE_PTE)PointerPde,
00809                      TempPte.u.Hard);
00810 
00811     
KeLowerIrql(OldIrql);
00812 
00813     CurrentProcess->
Vm.
MaximumWorkingSetSize = 
MmSystemProcessWorkingSetMax;
00814     CurrentProcess->
Vm.
MinimumWorkingSetSize = 
MmSystemProcessWorkingSetMin;
00815 
00816     
MmInitializeProcessAddressSpace (CurrentProcess,
00817                                 (
PEPROCESS)
NULL,
00818                                 (PVOID)
NULL);
00819 
00820     *PointerPde = 
ZeroKernelPte;
00821 
00822     
00823     
00824     
00825     
00826     
00827     
00828     
00829     
00830     
00831 
00832     
if ((((ULONG)
MmFreePagesByColor[0] & (
PAGE_SIZE - 1)) == 0) &&
00833        ((
MmSecondaryColors * 2 * 
sizeof(
MMCOLOR_TABLES)) < 
PAGE_SIZE)) {
00834 
00835         
PMMCOLOR_TABLES c;
00836 
00837         
c = 
MmFreePagesByColor[0];
00838 
00839         
MmFreePagesByColor[0] = 
ExAllocatePoolWithTag (
NonPagedPoolMustSucceed,
00840                                
MmSecondaryColors * 2 * 
sizeof(
MMCOLOR_TABLES),
00841                                '  mM');
00842 
00843         
MmFreePagesByColor[1] = &
MmFreePagesByColor[0][
MmSecondaryColors];
00844 
00845         RtlMoveMemory (
MmFreePagesByColor[0],
00846                        
c,
00847                        
MmSecondaryColors * 2 * 
sizeof(
MMCOLOR_TABLES));
00848 
00849         
00850         
00851         
00852 
00853         
if (!
MI_IS_PHYSICAL_ADDRESS(
c)) {
00854             PointerPte = 
MiGetPteAddress(
c);
00855             PageFrameIndex = PointerPte->u.Hard.PageFrameNumber;
00856             *PointerPte = 
ZeroKernelPte;
00857         } 
else {
00858             PageFrameIndex = 
MI_CONVERT_PHYSICAL_TO_PFN (
c);
00859         }
00860 
00861         Pfn1 = 
MI_PFN_ELEMENT (PageFrameIndex);
00862         
ASSERT ((Pfn1->
u3.e2.ReferenceCount <= 1) && (Pfn1->
u2.ShareCount <= 1));
00863         Pfn1->
u2.ShareCount = 0;
00864         Pfn1->
u3.e2.ReferenceCount = 0;
00865         
MI_SET_PFN_DELETED (Pfn1);
00866 
#if DBG
00867 
        Pfn1->
u3.e1.PageLocation = 
StandbyPageList;
00868 
#endif //DBG
00869 
        MiInsertPageInList (
MmPageLocationList[
FreePageList], PageFrameIndex);
00870     }
00871 
00872     
return;
00873 }
00874