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