ADDRESS TRANSLATION ON WINDOWS
Basically we can get the address of the “Page Directory Pointer Table ” (PDPT) from the CR3 Register. When switching threads in kernel-mode or user-mode (called a context switch), Windows stores off or loads information about the current thread including the state of all of the registers. Because of this, Windows is able to swap out the root of the paging structures when the thread context is switched by changing the value of CR3, effectively allowing it to manage an entirely separate set of paging structures for each process on the system.

This gives each process a unique mapping of virtual memory to physical memory, while still using the same virtual address ranges as another process. The PML4 table pointer for each user-mode process is stored in the DirectoryTableBase member of an internal kernel structure called the EPROCESS (kernel), which also manages a great deal of other state and metadata about the process.


https://devblogs.microsoft.com/oldnewthing/20160701-00/?p=93785
https://www.triplefault.io/2017/08/exploring-windows-virtual-memory.html