ReactOS  0.4.15-dev-1377-ga59cecd
stubs.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for stubs.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

BOOLEAN NTAPI MiUnmapPageTable (IN PMMPTE PointerPde)
 
VOID NTAPI MiFlushTlb (IN PMMPTE PointerPte, IN PVOID Address)
 
PMMPTE NTAPI MiGetPageTableForProcess (IN PEPROCESS Process, IN PVOID Address, IN BOOLEAN Create)
 
MMPTE NTAPI MiGetPageEntryForProcess (IN PEPROCESS Process, IN PVOID Address)
 
BOOLEAN NTAPI MmCreateProcessAddressSpace (IN ULONG MinWs, IN PEPROCESS Process, IN PULONG DirectoryTableBase)
 
NTSTATUS NTAPI MmCreateVirtualMappingInternal (IN PEPROCESS Process, IN PVOID Address, IN ULONG Protection, IN PPFN_NUMBER Pages, IN ULONG PageCount, IN BOOLEAN MarkAsMapped)
 
NTSTATUS NTAPI MmCreateVirtualMappingUnsafe (IN PEPROCESS Process, IN PVOID Address, IN ULONG Protection, IN PPFN_NUMBER Pages, IN ULONG PageCount)
 
NTSTATUS NTAPI MmCreateVirtualMapping (IN PEPROCESS Process, IN PVOID Address, IN ULONG Protection, IN PPFN_NUMBER Pages, IN ULONG PageCount)
 
VOID NTAPI MmDeleteVirtualMapping (IN PEPROCESS Process, IN PVOID Address, OUT PBOOLEAN WasDirty, OUT PPFN_NUMBER Page)
 
VOID NTAPI MmDeletePageFileMapping (IN PEPROCESS Process, IN PVOID Address, IN SWAPENTRY *SwapEntry)
 
NTSTATUS NTAPI MmCreatePageFileMapping (IN PEPROCESS Process, IN PVOID Address, IN SWAPENTRY SwapEntry)
 
PFN_NUMBER NTAPI MmGetPfnForProcess (IN PEPROCESS Process, IN PVOID Address)
 
BOOLEAN NTAPI MmIsDirtyPage (IN PEPROCESS Process, IN PVOID Address)
 
VOID NTAPI MmSetCleanPage (IN PEPROCESS Process, IN PVOID Address)
 
VOID NTAPI MmSetDirtyPage (IN PEPROCESS Process, IN PVOID Address)
 
BOOLEAN NTAPI MmIsPagePresent (IN PEPROCESS Process, IN PVOID Address)
 
BOOLEAN NTAPI MmIsPageSwapEntry (IN PEPROCESS Process, IN PVOID Address)
 
ULONG NTAPI MmGetPageProtect (IN PEPROCESS Process, IN PVOID Address)
 
VOID NTAPI MmSetPageProtect (IN PEPROCESS Process, IN PVOID Address, IN ULONG Protection)
 
VOID NTAPI MmInitGlobalKernelPageDirectory (VOID)
 
PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress (IN PVOID Address)
 

Variables

ULONG MmGlobalKernelPageDirectory [1024]
 
MMPTE MiArmTemplatePte
 
MMPDE_HARDWARE MiArmTemplatePde
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file stubs.c.

Function Documentation

◆ MiFlushTlb()

VOID NTAPI MiFlushTlb ( IN PMMPTE  PointerPte,
IN PVOID  Address 
)

Definition at line 48 of file stubs.c.

50 {
51  //
52  // Make sure the PTE is valid, and unmap the pagetable if user-mode
53  //
54  if (((PointerPte) && (MiUnmapPageTable(PointerPte))) ||
56  {
57  //
58  // Invalidate this page
59  //
61  }
62 }
FORCEINLINE VOID KeArmInvalidateTlbEntry(IN PVOID Address)
Definition: intrin_i.h:185
BOOLEAN NTAPI MiUnmapPageTable(IN PMMPTE PointerPde)
Definition: stubs.c:25
static WCHAR Address[46]
Definition: ping.c:68
#define MmSystemRangeStart
Definition: mm.h:32

Referenced by MmDeleteVirtualMapping().

◆ MiGetPageEntryForProcess()

MMPTE NTAPI MiGetPageEntryForProcess ( IN PEPROCESS  Process,
IN PVOID  Address 
)

Definition at line 217 of file stubs.c.

219 {
220  PMMPTE PointerPte;
221  MMPTE Pte;
222  Pte.u.Hard.AsUlong = 0;
223 
224  //
225  // Get the PTE
226  //
228  if (PointerPte)
229  {
230  //
231  // Capture the PTE value and unmap the page table
232  //
233  Pte = *PointerPte;
234  MiUnmapPageTable(PointerPte);
235  }
236 
237  //
238  // Return the PTE value
239  //
240  return Pte;
241 }
union _MMPTE::@2312 u
#define FALSE
Definition: types.h:117
BOOLEAN NTAPI MiUnmapPageTable(IN PMMPTE PointerPde)
Definition: stubs.c:25
static WCHAR Address[46]
Definition: ping.c:68
PMMPTE NTAPI MiGetPageTableForProcess(IN PEPROCESS Process, IN PVOID Address, IN BOOLEAN Create)
Definition: stubs.c:66
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219

Referenced by MmGetPfnForProcess(), MmGetPhysicalAddress(), MmIsPagePresent(), and MmIsPageSwapEntry().

◆ MiGetPageTableForProcess()

PMMPTE NTAPI MiGetPageTableForProcess ( IN PEPROCESS  Process,
IN PVOID  Address,
IN BOOLEAN  Create 
)

Definition at line 66 of file stubs.c.

69 {
70  //ULONG PdeOffset;
71  PMMPTE PointerPte;
72  PMMPDE_HARDWARE PointerPde;
74  MMPTE TempPte;
76  PFN_NUMBER Pfn;
77 
78  //
79  // Check if this is a user-mode, non-kernel or non-current address
80  //
81  if ((Address < MmSystemRangeStart) &&
82  (Process) &&
84  {
85  //
86  // FIXME-USER: No user-mode memory support
87  //
88  ASSERT(FALSE);
89  }
90 
91  //
92  // Get our templates
93  //
96 
97  //
98  // Get the PDE
99  //
100  PointerPde = MiAddressToPde(Address);
101  if (PointerPde->u.Hard.Coarse.Valid)
102  {
103  //
104  // Invalid PDE, is this a kernel address?
105  //
107  {
108  //
109  // Does it exist in the kernel page directory?
110  //
111  //PdeOffset = MiGetPdeOffset(Address);
112  //if (MmGlobalKernelPageDirectory[PdeOffset] == 0)
113  {
114  //
115  // It doesn't. Is this a create operation? If not, fail
116  //
117  if (Create == FALSE) return NULL;
118  kernelHack:
119  DPRINT1("Must create a page for: %p PDE: %p\n", // Offset: %lx!\n",
120  Address, PointerPde);//, PdeOffset);
121 
122  //
123  // Allocate a non paged pool page for the PDE
124  //
125  Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn);
126  if (!NT_SUCCESS(Status)) return NULL;
127 
128  //
129  // Setup the PFN
130  //
131  TempPde.u.Hard.Coarse.PageFrameNumber = (Pfn << PAGE_SHIFT) >> CPT_SHIFT;
132 
133  //
134  // Write the PDE
135  //
136  ASSERT(PointerPde->u.Hard.Coarse.Valid == 0);
137  ASSERT(TempPde.u.Hard.Coarse.Valid == 1);
138  *PointerPde = TempPde;
139 
140  //
141  // Save it
142  //
143  //MmGlobalKernelPageDirectory[PdeOffset] = TempPde.u.Hard.AsUlong;
144  //DPRINT1("KPD: %p PDEADDR: %p\n", &MmGlobalKernelPageDirectory[PdeOffset], MiAddressToPde(Address));
145 
146  //
147  // FIXFIX: Double check with Felix tomorrow
148  //
150  //
151  // Get the PTE for this 1MB region
152  //
153  PointerPte = MiAddressToPte(MiAddressToPte(Address));
154  DPRINT1("PointerPte: %p\n", PointerPte);
155 
156  //
157  // Write the PFN of the PDE
158  //
159  TempPte.u.Hard.PageFrameNumber = Pfn;
160 
161  //
162  // Write the PTE
163  //
164  ASSERT(PointerPte->u.Hard.Valid == 0);
165  ASSERT(TempPte.u.Hard.Valid == 1);
166  *PointerPte = TempPte;
168  }
169 
170  //
171  // Now set the actual PDE
172  //
173  //PointerPde = (PMMPTE)&MmGlobalKernelPageDirectory[PdeOffset];
174  }
175  else
176  {
177  //
178  // Is this a create operation? If not, fail
179  //
180  if (Create == FALSE) return NULL;
181 
182  //
183  // THIS WHOLE PATH IS TODO
184  //
185 #if 1
186  goto kernelHack;
187 #else
188  ASSERT(FALSE);
189 
190  //
191  // Allocate a non paged pool page for the PDE
192  //
193  Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn);
194  if (!NT_SUCCESS(Status)) return NULL;
195 
196  //
197  // Make the entry valid
198  //
199  TempPde.u.Hard.AsUlong = 0xDEADBEEF;
200 
201  //
202  // Set it
203  //
204  *PointerPde = TempPde;
205 #endif
206  }
207  }
208 
209  //
210  // Return the PTE
211  //
212  return MiAddressToPte(Address);
213 }
#define MiAddressToPde(x)
Definition: mmx86.c:20
union _MMPTE::@2312 u
_In_ BOOLEAN Create
Definition: pstypes.h:519
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTAPI MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN MyWait, PPFN_NUMBER AllocatedPage)
Definition: balance.c:222
HARDWARE_PDE_ARMV6 TempPde
Definition: winldr.c:78
#define MiAddressToPte(x)
Definition: mmx86.c:19
ULONG PFN_NUMBER
Definition: ke.h:8
#define FALSE
Definition: types.h:117
#define PsGetCurrentProcess
Definition: psfuncs.h:17
static WCHAR Address[46]
Definition: ping.c:68
Status
Definition: gdiplustypes.h:24
ULONG PageFrameNumber
Definition: mmtypes.h:74
#define ASSERT(a)
Definition: mode.c:45
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
ULONG64 Valid
Definition: mmtypes.h:150
HARDWARE_PTE_ARMV6 TempPte
Definition: winldr.c:76
#define CPT_SHIFT
Definition: mm.h:149
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
#define NULL
Definition: types.h:112
MMPTE MiArmTemplatePte
Definition: stubs.c:18
#define DPRINT1
Definition: precomp.h:8
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
MMPDE_HARDWARE MiArmTemplatePde
Definition: stubs.c:19
#define MmSystemRangeStart
Definition: mm.h:32
ULONG PageFrameNumber
Definition: mmtypes.h:109

Referenced by MiGetPageEntryForProcess(), MmCreateVirtualMappingInternal(), and MmDeleteVirtualMapping().

◆ MiUnmapPageTable()

BOOLEAN NTAPI MiUnmapPageTable ( IN PMMPTE  PointerPde)

Definition at line 25 of file stubs.c.

26 {
27  //
28  // Check if this address belongs to the kernel
29  //
30  if (((ULONG_PTR)PointerPde > PDE_BASE) ||
31  ((ULONG_PTR)PointerPde < (PDE_BASE + 1024*1024)))
32  {
33  //
34  // Nothing to do
35  //
36  return TRUE;
37  }
38 
39  //
40  // FIXME-USER: Shouldn't get here yet
41  //
42  ERROR_FATAL();
43  return FALSE;
44 }
#define TRUE
Definition: types.h:120
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define ERROR_FATAL(...)
Definition: debug.h:238
#define FALSE
Definition: types.h:117
#define PDE_BASE
Definition: winldr.c:21

Referenced by MiFlushTlb(), MiGetPageEntryForProcess(), and MmCreateVirtualMappingInternal().

◆ MmCreatePageFileMapping()

NTSTATUS NTAPI MmCreatePageFileMapping ( IN PEPROCESS  Process,
IN PVOID  Address,
IN SWAPENTRY  SwapEntry 
)

Definition at line 526 of file stubs.c.

529 {
530  //
531  // TODO
532  //
534  return STATUS_NOT_IMPLEMENTED;
535 }
return STATUS_NOT_IMPLEMENTED
#define UNIMPLEMENTED_DBGBREAK(...)
Definition: debug.h:57

◆ MmCreateProcessAddressSpace()

BOOLEAN NTAPI MmCreateProcessAddressSpace ( IN ULONG  MinWs,
IN PEPROCESS  Process,
IN PULONG  DirectoryTableBase 
)

Definition at line 245 of file stubs.c.

248 {
250  ULONG i;
251  PFN_NUMBER Pfn[2];
252  PMMPDE_HARDWARE PageDirectory, PointerPde;
254  ASSERT(FALSE);
255 
256  //
257  // Loop two tables (Hyperspace and TTB). Each one is 16KB
258  //
259  //
260  for (i = 0; i < sizeof(Pfn) / sizeof(Pfn[0]); i++)
261  {
262  //
263  // Allocate a page
264  //
265  Status = MmRequestPageMemoryConsumer(MC_NPPOOL, FALSE, &Pfn[i]);
266  if (!NT_SUCCESS(Status)) ASSERT(FALSE);
267  }
268 
269  //
270  // Map the base
271  //
272  PageDirectory = MmCreateHyperspaceMapping(Pfn[0]);
273 
274  //
275  // Copy the PDEs for kernel-mode
276  //
279  (1024 - MiGetPdeOffset(MmSystemRangeStart)) * sizeof(ULONG));
280 
281 
282  //
283  // Setup the PDE for the table base
284  //
286  TempPde.u.Hard.Coarse.PageFrameNumber = (Pfn[0] << PAGE_SHIFT) >> CPT_SHIFT;
287  PointerPde = &PageDirectory[MiGetPdeOffset(PTE_BASE)];
288 
289  //
290  // Write the PDE
291  //
292  ASSERT(PointerPde->u.Hard.Coarse.Valid == 0);
293  ASSERT(TempPde.u.Hard.Coarse.Valid == 1);
294  *PointerPde = TempPde;
295 
296  //
297  // Setup the PDE for the hyperspace
298  //
299  TempPde.u.Hard.Coarse.PageFrameNumber = (Pfn[1] << PAGE_SHIFT) >> CPT_SHIFT;
300  PointerPde = &PageDirectory[MiGetPdeOffset(HYPER_SPACE)];
301 
302  //
303  // Write the PDE
304  //
305  ASSERT(PointerPde->u.Hard.Coarse.Valid == 0);
306  ASSERT(TempPde.u.Hard.Coarse.Valid == 1);
307  *PointerPde = TempPde;
308 
309  //
310  // Unmap the page directory
311  //
312  MmDeleteHyperspaceMapping(PageDirectory);
313 
314  //
315  // Return the page table base
316  //
317  DirectoryTableBase[0] = Pfn[0] << PAGE_SHIFT;
318  return TRUE;
319 }
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTAPI MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN MyWait, PPFN_NUMBER AllocatedPage)
Definition: balance.c:222
HARDWARE_PDE_ARMV6 TempPde
Definition: winldr.c:78
#define MiGetPdeOffset(x)
Definition: mm.h:188
ULONG PFN_NUMBER
Definition: ke.h:8
#define FALSE
Definition: types.h:117
Status
Definition: gdiplustypes.h:24
ULONG PageFrameNumber
Definition: mmtypes.h:74
#define ASSERT(a)
Definition: mode.c:45
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define MmDeleteHyperspaceMapping(x)
Definition: mm.h:1033
#define CPT_SHIFT
Definition: mm.h:149
#define PTE_BASE
Definition: mmx86.c:14
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
FORCEINLINE PVOID MmCreateHyperspaceMapping(IN PFN_NUMBER Page)
Definition: mm.h:1027
#define HYPER_SPACE
Definition: mm.h:14
ULONG MmGlobalKernelPageDirectory[1024]
Definition: stubs.c:17
unsigned int ULONG
Definition: retypes.h:1
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
MMPDE_HARDWARE MiArmTemplatePde
Definition: stubs.c:19
#define MmSystemRangeStart
Definition: mm.h:32

◆ MmCreateVirtualMapping()

NTSTATUS NTAPI MmCreateVirtualMapping ( IN PEPROCESS  Process,
IN PVOID  Address,
IN ULONG  Protection,
IN PPFN_NUMBER  Pages,
IN ULONG  PageCount 
)

Definition at line 437 of file stubs.c.

442 {
443  ULONG i;
444 
445  //
446  // Loop each page
447  //
448  for (i = 0; i < PageCount; i++)
449  {
450  //
451  // Make sure the page is marked as in use
452  //
453  ASSERT(MmIsPageInUse(Pages[i]));
454  }
455 
456  //
457  // Call the unsafe version
458  //
460  Address,
461  Protection,
462  Pages,
463  PageCount);
464 }
BOOLEAN NTAPI MmIsPageInUse(PFN_NUMBER Page)
Definition: freelist.c:530
static WCHAR Address[46]
Definition: ping.c:68
#define ASSERT(a)
Definition: mode.c:45
NTSTATUS NTAPI MmCreateVirtualMappingUnsafe(IN PEPROCESS Process, IN PVOID Address, IN ULONG Protection, IN PPFN_NUMBER Pages, IN ULONG PageCount)
Definition: stubs.c:406
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
unsigned int ULONG
Definition: retypes.h:1

◆ MmCreateVirtualMappingInternal()

NTSTATUS NTAPI MmCreateVirtualMappingInternal ( IN PEPROCESS  Process,
IN PVOID  Address,
IN ULONG  Protection,
IN PPFN_NUMBER  Pages,
IN ULONG  PageCount,
IN BOOLEAN  MarkAsMapped 
)

Definition at line 323 of file stubs.c.

329 {
330  PMMPTE PointerPte = NULL;
331  MMPTE TempPte;
332  PVOID Addr;
333  ULONG OldPdeOffset, PdeOffset, i;
334  DPRINT("[KMAP]: %p %d\n", Address, PageCount);
335  //ASSERT(Address >= MmSystemRangeStart);
336 
337  //
338  // Get our template PTE
339  //
341 
342  //
343  // Loop every page
344  //
345  Addr = Address;
346  OldPdeOffset = MiGetPdeOffset(Addr) + 1;
347  for (i = 0; i < PageCount; i++)
348  {
349  //
350  // Get the next PDE offset and check if it's a new one
351  //
352  PdeOffset = MiGetPdeOffset(Addr);
353  if (OldPdeOffset != PdeOffset)
354  {
355  //
356  // Get rid of the old L2 Table, if this was the last PTE on it
357  //
358  MiUnmapPageTable(PointerPte);
359 
360  //
361  // Get the PTE for this address, and create the PDE for it
362  //
363  PointerPte = MiGetPageTableForProcess(NULL, Addr, TRUE);
364  ASSERT(PointerPte);
365  }
366  else
367  {
368  //
369  // Go to the next PTE on this PDE
370  //
371  ASSERT(PointerPte);
372  PointerPte++;
373  }
374 
375  //
376  // Save the current PDE
377  //
378  OldPdeOffset = PdeOffset;
379 
380  //
381  // Set the PFN
382  //
383  TempPte.u.Hard.PageFrameNumber = *Pages++;
384 
385  //
386  // Write the PTE
387  //
388  ASSERT(PointerPte->u.Hard.Valid == 0);
389  ASSERT(TempPte.u.Hard.Valid == 1);
390  *PointerPte = TempPte;
391 
392  //
393  // Move to the next page
394  //
395  Addr = (PVOID)((ULONG_PTR)Addr + PAGE_SIZE);
396  }
397 
398  //
399  // All done
400  //
401  return STATUS_SUCCESS;
402 }
#define TRUE
Definition: types.h:120
union _MMPTE::@2312 u
#define MiGetPdeOffset(x)
Definition: mm.h:188
uint32_t ULONG_PTR
Definition: typedefs.h:65
BOOLEAN NTAPI MiUnmapPageTable(IN PMMPTE PointerPde)
Definition: stubs.c:25
static WCHAR Address[46]
Definition: ping.c:68
void DPRINT(...)
Definition: polytest.cpp:61
void * PVOID
Definition: retypes.h:9
PMMPTE NTAPI MiGetPageTableForProcess(IN PEPROCESS Process, IN PVOID Address, IN BOOLEAN Create)
Definition: stubs.c:66
#define ASSERT(a)
Definition: mode.c:45
ULONG64 Valid
Definition: mmtypes.h:150
HARDWARE_PTE_ARMV6 TempPte
Definition: winldr.c:76
#define PAGE_SIZE
Definition: env_spec_w32.h:49
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
MMPTE MiArmTemplatePte
Definition: stubs.c:18
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG PageFrameNumber
Definition: mmtypes.h:109

Referenced by MmCreateVirtualMappingUnsafe().

◆ MmCreateVirtualMappingUnsafe()

NTSTATUS NTAPI MmCreateVirtualMappingUnsafe ( IN PEPROCESS  Process,
IN PVOID  Address,
IN ULONG  Protection,
IN PPFN_NUMBER  Pages,
IN ULONG  PageCount 
)

Definition at line 406 of file stubs.c.

411 {
412  //
413  // Are we only handling the kernel?
414  //
415  if (!(Process) || (Process == PsGetCurrentProcess()))
416  {
417  //
418  // Call the internal version
419  //
421  Address,
422  Protection,
423  Pages,
424  PageCount,
425  TRUE);
426  }
427 
428  //
429  // FIXME-USER: Support user-mode mappings
430  //
431  ASSERT(FALSE);
432  return 0;
433 }
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define PsGetCurrentProcess
Definition: psfuncs.h:17
static WCHAR Address[46]
Definition: ping.c:68
#define ASSERT(a)
Definition: mode.c:45
NTSTATUS NTAPI MmCreateVirtualMappingInternal(IN PEPROCESS Process, IN PVOID Address, IN ULONG Protection, IN PPFN_NUMBER Pages, IN ULONG PageCount, IN BOOLEAN MarkAsMapped)
Definition: stubs.c:323
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219

Referenced by MmCreateVirtualMapping().

◆ MmDeletePageFileMapping()

VOID NTAPI MmDeletePageFileMapping ( IN PEPROCESS  Process,
IN PVOID  Address,
IN SWAPENTRY SwapEntry 
)

Definition at line 514 of file stubs.c.

517 {
518  //
519  // TODO
520  //
522 }
#define UNIMPLEMENTED_DBGBREAK(...)
Definition: debug.h:57

◆ MmDeleteVirtualMapping()

VOID NTAPI MmDeleteVirtualMapping ( IN PEPROCESS  Process,
IN PVOID  Address,
OUT PBOOLEAN  WasDirty,
OUT PPFN_NUMBER  Page 
)

Definition at line 468 of file stubs.c.

472 {
473  PMMPTE PointerPte;
474  MMPTE Pte;
475  PFN_NUMBER Pfn = 0;
476 
477  //
478  // Get the PTE
479  //
480  PointerPte = MiGetPageTableForProcess(NULL, Address, FALSE);
481  if (PointerPte)
482  {
483  //
484  // Save and destroy the PTE
485  //
486  Pte = *PointerPte;
487  PointerPte->u.Hard.AsUlong = 0;
488 
489  //
490  // Flush the TLB
491  //
492  MiFlushTlb(PointerPte, Address);
493 
494  //
495  // Unmap the PFN
496  //
497  Pfn = Pte.u.Hard.PageFrameNumber;
498 
499  //
500  // Release the PFN if it was ours
501  //
502  if ((FreePage) && (Pfn)) MmReleasePageMemoryConsumer(MC_NPPOOL, Pfn);
503  }
504 
505  //
506  // Return if the page was dirty
507  //
508  if (WasDirty) *WasDirty = FALSE; // LIE!!!
509  if (Page) *Page = Pfn;
510 }
union _MMPTE::@2312 u
NTSTATUS NTAPI MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page)
Definition: balance.c:90
ULONG PFN_NUMBER
Definition: ke.h:8
#define FALSE
Definition: types.h:117
static WCHAR Address[46]
Definition: ping.c:68
PMMPTE NTAPI MiGetPageTableForProcess(IN PEPROCESS Process, IN PVOID Address, IN BOOLEAN Create)
Definition: stubs.c:66
VOID NTAPI MiFlushTlb(IN PMMPTE PointerPte, IN PVOID Address)
Definition: stubs.c:48
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
#define NULL
Definition: types.h:112
ULONG64 PageFrameNumber
Definition: mmtypes.h:171

◆ MmGetPageProtect()

ULONG NTAPI MmGetPageProtect ( IN PEPROCESS  Process,
IN PVOID  Address 
)

Definition at line 621 of file stubs.c.

623 {
624  //
625  // We don't enforce any protection on the pages -- they are all RWX
626  //
627  return PAGE_READWRITE;
628 }
#define PAGE_READWRITE
Definition: nt_native.h:1304

◆ MmGetPfnForProcess()

PFN_NUMBER NTAPI MmGetPfnForProcess ( IN PEPROCESS  Process,
IN PVOID  Address 
)

Definition at line 539 of file stubs.c.

541 {
542  MMPTE Pte;
543 
544  //
545  // Get the PTE
546  //
548  if (Pte.u.Hard.Valid == 0) return 0;
549 
550  //
551  // Return PFN
552  //
553  return Pte.u.Hard.PageFrameNumber;
554 }
union _MMPTE::@2312 u
static WCHAR Address[46]
Definition: ping.c:68
ULONG64 Valid
Definition: mmtypes.h:150
MMPTE NTAPI MiGetPageEntryForProcess(IN PEPROCESS Process, IN PVOID Address)
Definition: stubs.c:217
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
ULONG64 PageFrameNumber
Definition: mmtypes.h:171

◆ MmGetPhysicalAddress()

PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress ( IN PVOID  Address)

Definition at line 686 of file stubs.c.

687 {
689  MMPTE Pte;
690 
691  //
692  // Early boot PCR check
693  //
694  if (Address == PCR)
695  {
696  //
697  // ARM Hack while we still use a section PTE
698  //
699  PMMPDE_HARDWARE PointerPde;
700  PointerPde = MiAddressToPde(PCR);
701  ASSERT(PointerPde->u.Hard.Section.Valid == 1);
702  PhysicalAddress.QuadPart = PointerPde->u.Hard.Section.PageFrameNumber;
705  return PhysicalAddress;
706  }
707 
708  //
709  // Get the PTE
710  //
712  if (Pte.u.Hard.Valid)
713  {
714  //
715  // Return the information
716  //
720  }
721  else
722  {
723  //
724  // Invalid or unmapped
725  //
727  }
728 
729  //
730  // Return the physical address
731  //
732  return PhysicalAddress;
733 }
#define PAGE_SHIFT
Definition: env_spec_w32.h:45
#define MiAddressToPde(x)
Definition: mmx86.c:20
union _MMPTE::@2312 u
#define PCR
Definition: ke.h:8
static WCHAR Address[46]
Definition: ping.c:68
#define ASSERT(a)
Definition: mode.c:45
ULONG64 Valid
Definition: mmtypes.h:150
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1081
MMPTE NTAPI MiGetPageEntryForProcess(IN PEPROCESS Process, IN PVOID Address)
Definition: stubs.c:217
#define CPT_SHIFT
Definition: mm.h:149
ULONG LowPart
Definition: typedefs.h:106
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
#define NULL
Definition: types.h:112
ULONG64 PageFrameNumber
Definition: mmtypes.h:171
#define BYTE_OFFSET(Va)
LONGLONG QuadPart
Definition: typedefs.h:114
ULONG PageFrameNumber
Definition: mmtypes.h:213

Referenced by AcpiOsGetPhysicalAddress(), AtapiVirtToPhysAddr_(), CcRosTrimCache(), HalAllocateCommonBuffer(), HalpGrowMapBuffers(), HDA_InitCorbRirbPos(), KdDebuggerInitialize0(), Ki386BuildIdentityBuffer(), Ki386ConvertPte(), Ki386CreateIdentityMap(), MiReadPage(), SoundProgramDMA(), StorPortGetPhysicalAddress(), StorPortGetUncachedExtension(), TestPhysicalMemorySection(), and VidInitialize().

◆ MmInitGlobalKernelPageDirectory()

VOID NTAPI MmInitGlobalKernelPageDirectory ( VOID  )

Definition at line 645 of file stubs.c.

646 {
647  ULONG i;
648  PULONG CurrentPageDirectory = (PULONG)PDE_BASE;
649 
650  //
651  // Good place to setup template PTE/PDEs.
652  // We are lazy and pick a known-good PTE
653  //
654  MiArmTemplatePte = *MiAddressToPte(0x80000000);
655  MiArmTemplatePde = *MiAddressToPde(0x80000000);
656 
657  //
658  // Loop the 2GB of address space which belong to the kernel
659  //
660  for (i = MiGetPdeOffset(MmSystemRangeStart); i < 1024; i++)
661  {
662  //
663  // Check if we have an entry for this already
664  //
665  if ((i != MiGetPdeOffset(PTE_BASE)) &&
666  (i != MiGetPdeOffset(HYPER_SPACE)) &&
668  (CurrentPageDirectory[i]))
669  {
670  //
671  // We don't, link it in our global page directory
672  //
673  MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i];
674  }
675  }
676 }
#define MiAddressToPde(x)
Definition: mmx86.c:20
#define MiGetPdeOffset(x)
Definition: mm.h:188
#define MiAddressToPte(x)
Definition: mmx86.c:19
#define PDE_BASE
Definition: winldr.c:21
#define PTE_BASE
Definition: mmx86.c:14
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int * PULONG
Definition: retypes.h:1
MMPTE MiArmTemplatePte
Definition: stubs.c:18
#define HYPER_SPACE
Definition: mm.h:14
ULONG MmGlobalKernelPageDirectory[1024]
Definition: stubs.c:17
unsigned int ULONG
Definition: retypes.h:1
MMPDE_HARDWARE MiArmTemplatePde
Definition: stubs.c:19
#define MmSystemRangeStart
Definition: mm.h:32

◆ MmIsDirtyPage()

BOOLEAN NTAPI MmIsDirtyPage ( IN PEPROCESS  Process,
IN PVOID  Address 
)

Definition at line 558 of file stubs.c.

560 {
561  //
562  // TODO
563  //
565  return FALSE;
566 }
#define FALSE
Definition: types.h:117
#define UNIMPLEMENTED_DBGBREAK(...)
Definition: debug.h:57

◆ MmIsPagePresent()

BOOLEAN NTAPI MmIsPagePresent ( IN PEPROCESS  Process,
IN PVOID  Address 
)

Definition at line 592 of file stubs.c.

594 {
595  //
596  // Fault PTEs are 0, which is FALSE (non-present)
597  //
599 }
union _MMPTE::@2312 u
static WCHAR Address[46]
Definition: ping.c:68
ULONG64 Valid
Definition: mmtypes.h:150
MMPTE NTAPI MiGetPageEntryForProcess(IN PEPROCESS Process, IN PVOID Address)
Definition: stubs.c:217
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219

◆ MmIsPageSwapEntry()

BOOLEAN NTAPI MmIsPageSwapEntry ( IN PEPROCESS  Process,
IN PVOID  Address 
)

Definition at line 603 of file stubs.c.

605 {
606  MMPTE Pte;
607 
608  //
609  // Get the PTE
610  //
612 
613  //
614  // Make sure it exists, but is faulting
615  //
616  return (Pte.u.Hard.Valid == 0) && (Pte.u.Hard.AsUlong);
617 }
union _MMPTE::@2312 u
static WCHAR Address[46]
Definition: ping.c:68
ULONG64 Valid
Definition: mmtypes.h:150
MMPTE NTAPI MiGetPageEntryForProcess(IN PEPROCESS Process, IN PVOID Address)
Definition: stubs.c:217
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219

◆ MmSetCleanPage()

VOID NTAPI MmSetCleanPage ( IN PEPROCESS  Process,
IN PVOID  Address 
)

Definition at line 570 of file stubs.c.

572 {
573  //
574  // TODO
575  //
577 }
#define UNIMPLEMENTED_DBGBREAK(...)
Definition: debug.h:57

◆ MmSetDirtyPage()

VOID NTAPI MmSetDirtyPage ( IN PEPROCESS  Process,
IN PVOID  Address 
)

Definition at line 581 of file stubs.c.

583 {
584  //
585  // TODO
586  //
588 }
#define UNIMPLEMENTED_DBGBREAK(...)
Definition: debug.h:57

◆ MmSetPageProtect()

VOID NTAPI MmSetPageProtect ( IN PEPROCESS  Process,
IN PVOID  Address,
IN ULONG  Protection 
)

Definition at line 632 of file stubs.c.

635 {
636  //
637  // We don't enforce any protection on the pages -- they are all RWX
638  //
639  return;
640 }

Variable Documentation

◆ MiArmTemplatePde

◆ MiArmTemplatePte

MMPTE MiArmTemplatePte

◆ MmGlobalKernelPageDirectory

ULONG MmGlobalKernelPageDirectory[1024]

Definition at line 17 of file stubs.c.

Referenced by MmCreateProcessAddressSpace(), and MmInitGlobalKernelPageDirectory().