00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "mi.h"
00022
00023
#if DBG
00024
#if 0 // LWFIX: fix this up for Sundown before re-enabling
00025
00026
VOID
00027 CheckValidPte (
00028 IN
PMMPTE PointerPte
00029 );
00030
00031
VOID
00032 CheckInvalidPte (
00033 IN
PMMPTE PointerPte
00034 );
00035
00036
00037
VOID
00038
MiCheckPte (
00039 VOID
00040 )
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 {
00064 ULONG i,j;
00065
PMMPTE PointerPte;
00066
PMMPTE PointerPde;
00067
PMMPFN Pfn1;
00068 ULONG ValidCount;
00069 ULONG TransitionCount;
00070 KIRQL PreviousIrql;
00071 KIRQL OldIrql;
00072
PEPROCESS TargetProcess;
00073
USHORT UsedPages;
00074 ULONG PdeValidCount;
00075
00076 TargetProcess =
PsGetCurrentProcess ();
00077
00078
KeRaiseIrql (APC_LEVEL, &PreviousIrql);
00079
00080
LOCK_WS (TargetProcess);
00081
LOCK_PFN (OldIrql);
00082
00083 PointerPde =
MiGetPdeAddress(0);
00084
00085 UsedPages = 0;
00086 PdeValidCount = 1;
00087
00088
for (i = 0; i <
PDE_PER_PAGE; i++) {
00089
if (PointerPde->
u.Hard.Valid) {
00090
00091
if ((i < 512) || (i == 769) || (i== 896) ) {
00092 PdeValidCount += 1;
00093 }
00094
00095 ValidCount = 0;
00096 TransitionCount = 0;
00097 CheckValidPte (PointerPde);
00098
00099 PointerPte =
MiGetPteAddress (i<<22);
00100
00101
for (j=0; j <
PTE_PER_PAGE; j++) {
00102
00103
if ((PointerPte >=
MiGetPteAddress(HYPER_SPACE)) &&
00104 (PointerPte <
MiGetPteAddress(WORKING_SET_LIST))) {
00105
goto endloop;
00106 }
00107
00108
if (PointerPte->
u.Hard.Valid) {
00109 ValidCount += 1;
00110 CheckValidPte (PointerPte);
00111
00112 }
else {
00113 CheckInvalidPte (PointerPte);
00114
00115
if ((PointerPte->
u.Soft.Transition == 1) &&
00116 (PointerPte->
u.Soft.Prototype == 0)) {
00117
00118
00119
00120
00121
00122 TransitionCount += 1;
00123
00124 }
00125 }
00126
00127
if (PointerPte->
u.Long != 0) {
00128 UsedPages += 1;
00129 }
00130 endloop:
00131 PointerPte++;
00132
00133 }
00134
if ((i < 512) || (i == 896)) {
00135
if (
MmWorkingSetList->
UsedPageTableEntries[i] != UsedPages) {
00136
DbgPrint(
"used pages and page table used not equal %lx %lx %lx\n",
00137 i,
MmWorkingSetList->
UsedPageTableEntries[i], UsedPages);
00138 }
00139 }
00140
00141
00142
00143
00144
if ((i < 511) || (i == 896)) {
00145 Pfn1 =
MI_PFN_ELEMENT (PointerPde->
u.Hard.PageFrameNumber);
00146
if (Pfn1->
u2.ShareCount != ((ULONG)1+ValidCount+TransitionCount)) {
00147
DbgPrint(
"share count for page table page bad - %lx %lx %lx\n",
00148 i,ValidCount, TransitionCount);
00149
MiFormatPfn(Pfn1);
00150 }
00151 }
00152 }
00153 PointerPde++;
00154 UsedPages = 0;
00155 }
00156
00157 PointerPde = (
PMMPTE)(ULONG_PTR)0xc0300c00;
00158 Pfn1 =
MI_PFN_ELEMENT(PointerPde->
u.Hard.PageFrameNumber);
00159
UNLOCK_PFN (OldIrql);
00160
UNLOCK_WS (TargetProcess);
00161
KeLowerIrql (PreviousIrql);
00162
return;
00163
00164 }
00165
00166
VOID
00167 CheckValidPte (
00168 IN
PMMPTE PointerPte
00169 )
00170
00171 {
00172
PMMPFN Pfn1;
00173
PMMPTE PointerPde;
00174
00175
if (
MI_GET_PAGE_FRAME_FROM_PTE (PointerPte) >
MmNumberOfPhysicalPages) {
00176
return;
00177 }
00178
00179
00180 Pfn1 =
MI_PFN_ELEMENT(PointerPte->u.Hard.PageFrameNumber);
00181
00182
if (PointerPte->u.Hard.PageFrameNumber == 0) {
00183
DbgPrint(
"physical page zero mapped\n");
00184
MiFormatPte(PointerPte);
00185
MiFormatPfn(Pfn1);
00186 }
00187
00188
if (Pfn1->
u3.e1.PageLocation !=
ActiveAndValid) {
00189
DbgPrint(
"valid PTE with page frame not active and valid\n");
00190
MiFormatPfn(Pfn1);
00191
MiFormatPte(PointerPte);
00192 }
00193
00194
if (Pfn1->
u3.e1.PrototypePte == 0) {
00195
00196
00197
00198
if (Pfn1->
PteAddress != PointerPte) {
00199
DbgPrint(
"checkpte - pfn pte address and pte address not equal\n");
00200
MiFormatPte(PointerPte);
00201
MiFormatPfn(Pfn1);
00202
return;
00203 }
00204
00205 }
00206
00207
if (!
MmIsAddressValid(Pfn1->
PteAddress)) {
00208
return;
00209 }
00210
00211 PointerPde =
MiGetPteAddress (Pfn1->
PteAddress);
00212
if (PointerPde->
u.Hard.Valid == 1) {
00213
00214
if (
MI_GET_PAGE_FRAME_FROM_PTE (PointerPde) != Pfn1->
PteFrame) {
00215
DbgPrint(
"checkpte - pteframe not right\n");
00216
MiFormatPfn(Pfn1);
00217
MiFormatPte(PointerPte);
00218
MiFormatPte(PointerPde);
00219 }
00220 }
00221
return;
00222
00223 }
00224
00225
VOID
00226 CheckInvalidPte (
00227 IN
PMMPTE PointerPte
00228 )
00229
00230
00231 {
00232 PointerPte;
00233
return;
00234
00235 }
00236
#endif // 0
00237
#endif //DBG