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 PFN_NUMBER PageFrameIndex;
00063
PMMPFN Pfn1;
00064 KIRQL OldIrql;
00065
00066
00067
00068
00069
00070
00071
00072 PageFrameIndex =
MI_GET_PAGE_FRAME_FROM_PTE(PointerPte);
00073 Pfn1 =
MI_PFN_ELEMENT (PageFrameIndex);
00074
00075 TempPte = *PointerPte;
00076 TempPte.
u.Hard.Dirty = 1;
00077
MI_SET_ACCESSED_IN_PTE (&TempPte, 1);
00078 *PointerPte = TempPte;
00079
00080
00081
00082
00083
00084
00085
if (PfnHeld) {
00086
00087
00088
00089
00090
00091
00092
00093
if ((Pfn1->
OriginalPte.
u.Soft.Prototype == 0) &&
00094 (Pfn1->
u3.e1.WriteInProgress == 0)) {
00095
00096
00097
00098
00099
00100
MiReleasePageFileSpace (Pfn1->
OriginalPte);
00101
00102
00103
00104
00105
00106
00107
00108 Pfn1->
OriginalPte.
u.Soft.PageFileHigh = 0;
00109 }
00110
00111 Pfn1->
u3.e1.Modified = 1;
00112 }
00113
00114
00115
00116
00117
00118
00119
00120 KeFillEntryTb ((PHARDWARE_PTE)PointerPte, FaultingAddress, TRUE);
00121
00122
return;
00123 }
}