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 }
}