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