00037 :
00038
00039 This routine sets dirty in
the specified PTE and
the modify bit in
the
00040 correpsonding PFN element. If any page
file space
is allocated,
it
00041
is deallocated.
00042
00043 Arguments:
00044
00045 FaultingAddress - Supplies
the faulting address.
00046
00047 PointerPte - Supplies a pointer to
the corresponding valid PTE.
00048
00049 PfnHeld - Supplies
TRUE if the PFN mutex
is already held.
00050
00051 Return Value:
00052
00053 None.
00054
00055 Environment:
00056
00057 Kernel mode, APC's disabled, Working set mutex held.
00058
00059 --*/
00060
00061 {
00062
MMPTE TempPte;
00063 ULONG PageFrameIndex;
00064
PMMPFN Pfn1;
00065 KIRQL OldIrql;
00066
00067
00068
00069
00070
00071
00072
00073 PageFrameIndex = PointerPte->u.Hard.PageFrameNumber;
00074 Pfn1 =
MI_PFN_ELEMENT (PageFrameIndex);
00075
00076 TempPte = *PointerPte;
00077 TempPte.
u.Hard.Dirty =
MM_PTE_DIRTY;
00078
MI_SET_ACCESSED_IN_PTE (&TempPte, 1);
00079 *PointerPte = TempPte;
00080
00081
00082
00083
00084
00085
00086
if (PfnHeld) {
00087
00088
00089
00090
00091
00092
00093
00094
if ((Pfn1->
OriginalPte.
u.Soft.Prototype == 0) &&
00095 (Pfn1->
u3.e1.WriteInProgress == 0)) {
00096
00097
00098
00099
00100
00101
MiReleasePageFileSpace (Pfn1->
OriginalPte);
00102
00103
00104
00105
00106
00107
00108
00109 Pfn1->
OriginalPte.
u.Soft.PageFileHigh = 0;
00110 }
00111
00112 Pfn1->
u3.e1.Modified = 1;
00113 }
00114
00115
00116
00117
00118
00119
00120
00121 KeFillEntryTb ((PHARDWARE_PTE)PointerPte, FaultingAddress, TRUE);
00122
00123
return;
00124 }
}