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