424{
430 PMMPTE PointerPte, StartPte;
436 PVOID BaseVa, BaseVaStart;
438
439
440
441
443
444
445
446
447 if (SizeInPages == 0)
448 {
449
450
451
453 }
454
455
456
457
459 {
460
461
462
464 {
466 if (BaseVa) return BaseVa;
467 }
468
469
470
471
473
474
475
476
478 SizeInPages,
481 {
482
483
484
486 DPRINT(
"Paged pool expansion: %lu %x\n",
i, SizeInPages);
487
488
489
490
493 {
494
495
496
497 DPRINT1(
"FAILED to allocate %Iu bytes from paged pool\n", SizeInBytes);
500 }
501
502
503
504
507 {
508
509
510
512 PageTableCount = (
PFN_COUNT)(PointerPde + 1 -
516 }
517 else
518 {
519
520
521
523 }
524
525
526
527
529
530
531
532
535 BaseVaStart = BaseVa;
536
537
538
539
541 do
542 {
543
544
545
547
548
553#if (_MI_PAGING_LEVELS >= 3)
554
555
559
560
562#else
563
564
565
567
568
572#endif
573
574
575
576
577 PointerPde++;
581
582
583
584
586
587
588
589
594 EndAllocation,
596
597
598
599
601
602
603
604
606
607
608
609
611 SizeInPages,
612 0);
614 {
615
616
617
618 DPRINT1(
"FAILED to allocate %Iu bytes from paged pool\n", SizeInBytes);
621 }
622 }
623
624
625
626
628
629
630
631
632
633 EndAllocation =
i + SizeInPages - 1;
635
636
637
638
640
641
642
643
645
646
647
648
650
651
653
654
655
656
658 StartPte = PointerPte + SizeInPages;
659 do
660 {
661
662
663
665 } while (++PointerPte < StartPte);
666
667
668
669
670 return BaseVa;
671 }
672
673
674
675
677 {
679 if (BaseVa) return BaseVa;
680 }
681
682
683
684
686
687
688
689
692
693
694
695
697 do
698 {
699
700
701
702 NextEntry = NextHead->
Flink;
703 while (NextEntry != NextHead)
704 {
705
707 {
708
710 }
711
712
713
714
717 if (FreeEntry->
Size >= SizeInPages)
718 {
719
720
721
722 FreeEntry->
Size -= SizeInPages;
723
724
725
726
729
730
733 else
735
736
737
738
739 if (FreeEntry->
Size != 0)
740 {
741
743
744
747 else
749
750
752 {
753
755 }
756 }
757
758
759
760
763
764
765
766
768
769
770
771
773 Pfn1->
u3.
e1.StartOfAllocation = 1;
774
775
778 {
780 }
781
782
783
784
785 if (SizeInPages != 1)
786 {
787
788
789
790 PointerPte += SizeInPages - 1;
793 }
794
795
796
797
799 Pfn1->
u3.
e1.EndOfAllocation = 1;
800
801
802
803
805 return BaseVa;
806 }
807
808
809
810
812
813
815 {
816
818 }
819 }
820 } while (++NextHead < LastHead);
821
822
823
824
825
827
828
829
830
832 PointerPte = StartPte;
833 if (StartPte ==
NULL)
834 {
835
836
837
838 DPRINT(
"Out of NP Expansion Pool\n");
840 }
841
842
843
844
846
847
848
849
850 MiAcquirePfnLockAtDpcLevel();
851
852
854 {
855 MiReleasePfnLockFromDpcLevel();
857
859
861
863 }
864
865
866
867
869 do
870 {
871
875
876
878 Pfn1->
u3.
e2.ReferenceCount = 1;
883
884
887 } while (--SizeInPages > 0);
888
889
890
891
892 Pfn1->
u3.
e1.EndOfAllocation = 1;
893
894
895
896
898 Pfn1->
u3.
e1.StartOfAllocation = 1;
899
900
903
904
905
906
907 MiReleasePfnLockFromDpcLevel();
909
910
911
912
914}
HARDWARE_PTE_ARMV6 TempPte
HARDWARE_PDE_ARMV6 TempPde
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
NTSYSAPI ULONG WINAPI RtlFindClearBitsAndSet(PRTL_BITMAP, ULONG, ULONG)
NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG)
#define MI_GET_NEXT_COLOR()
PFN_NUMBER NTAPI MiRemoveAnyPage(IN ULONG Color)
VOID NTAPI MiReleaseSystemPtes(IN PMMPTE StartingPte, IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
#define MI_MAKE_SOFTWARE_PTE(p, x)
VOID NTAPI MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex, IN PVOID PteAddress, IN PFN_NUMBER PteFrame)
FORCEINLINE VOID MI_WRITE_VALID_PDE(IN PMMPDE PointerPde, IN MMPDE TempPde)
FORCEINLINE VOID MI_WRITE_INVALID_PTE(IN PMMPTE PointerPte, IN MMPTE InvalidPte)
PMMPTE NTAPI MiReserveSystemPtes(IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
FORCEINLINE VOID MI_WRITE_VALID_PTE(IN PMMPTE PointerPte, IN MMPTE TempPte)
#define MiAddressToPte(x)
#define MiAddressToPde(x)
#define MI_MAX_FREE_PAGE_LISTS
#define MiPteToAddress(_Pte)
#define VERIFIER_POOL_MASK
FORCEINLINE PMMPFN MiGetPfnEntry(IN PFN_NUMBER Pfn)
#define MI_SET_PROCESS2(x)
PFN_NUMBER MmAvailablePages
#define MM_FREE_POOL_SIGNATURE
VOID NTAPI KeFlushEntireTb(IN BOOLEAN Invalid, IN BOOLEAN AllProcessors)
PFN_NUMBER MmSystemPageDirectory[PPE_PER_PAGE]
VOID NTAPI MiProtectedPoolRemoveEntryList(IN PLIST_ENTRY Entry)
BOOLEAN MmProtectFreedNonPagedPool
KGUARDED_MUTEX MmPagedPoolMutex
MM_PAGED_POOL_INFO MmPagedPoolInfo
SLIST_HEADER MiNonPagedPoolSListHead
VOID NTAPI MiProtectFreeNonPagedPool(IN PVOID VirtualAddress, IN ULONG PageCount)
LIST_ENTRY MmNonPagedPoolFreeListHead[MI_MAX_FREE_PAGE_LISTS]
SLIST_HEADER MiPagedPoolSListHead
BOOLEAN NTAPI MiUnProtectFreeNonPagedPool(IN PVOID VirtualAddress, IN ULONG PageCount)
VOID NTAPI MiProtectedPoolInsertList(IN PLIST_ENTRY ListHead, IN PLIST_ENTRY Entry, IN BOOLEAN Critical)
struct _LIST_ENTRY * Flink
ULONG_PTR VerifierAllocation
struct _MMPFN::@1772::@1778 e2
PMMPTE LastPteForPagedPool
PRTL_BITMAP EndOfPagedPoolBitmap
PRTL_BITMAP PagedPoolAllocationMap
PMMPDE NextPdeForPagedPoolExpansion
PMMPTE FirstPteForPagedPool
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
_Must_inspect_result_ _In_ WDFCMRESLIST List
FORCEINLINE USHORT ExQueryDepthSList(_In_ PSLIST_HEADER SListHead)
@ LockQueueMmNonPagedPoolLock
#define BYTES_TO_PAGES(Size)
NTSYSAPI VOID NTAPI RtlSetBit(_In_ PRTL_BITMAP BitMapHeader, _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber)
#define InterlockedPopEntrySList(SListHead)