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