| 216 | } |
| 217 | |
| 218 | bool CheckUsermodePointer(uintptr_t addr, uint64_t len, address_space_t* addressSpace){ |
| 219 | if(addr >> 48) return 0; // Non-canonical or higher-half address |
| 220 | |
| 221 | if(!(addressSpace->pageDirs[PDPT_GET_INDEX(addr)][PAGE_DIR_GET_INDEX(addr)] & (PAGE_PRESENT))){ |
| 222 | return 0; |
| 223 | } |
| 224 | |
| 225 | if(!(addressSpace->pageDirs[PDPT_GET_INDEX(addr + len)][PAGE_DIR_GET_INDEX(addr + len)] & (PAGE_PRESENT))){ |
| 226 | return 0; |
| 227 | } |
| 228 | |
| 229 | if(!((addressSpace->pageTables[PDPT_GET_INDEX(addr)][PAGE_DIR_GET_INDEX(addr)][PAGE_TABLE_GET_INDEX(addr)] & (PAGE_PRESENT)) && addressSpace->pageTables[PDPT_GET_INDEX(addr)][PAGE_DIR_GET_INDEX(addr)][PAGE_TABLE_GET_INDEX(addr)] & (PAGE_USER))){ |
| 230 | return 0; |
| 231 | } |
| 232 | |
| 233 | if(!((addressSpace->pageTables[PDPT_GET_INDEX(addr + len)][PAGE_DIR_GET_INDEX(addr + len)][PAGE_TABLE_GET_INDEX(addr + len)] & (PAGE_PRESENT)) && addressSpace->pageTables[PDPT_GET_INDEX(addr + len)][PAGE_DIR_GET_INDEX(addr + len)][PAGE_TABLE_GET_INDEX(addr + len)] & (PAGE_USER))){ |
| 234 | return 0; |
| 235 | } |
| 236 | |
| 237 | return 1; |
| 238 | } |
| 239 | |
| 240 | page_table_t AllocatePageTable(){ |
| 241 | void* virt = KernelAllocate4KPages(1); |
no outgoing calls
no test coverage detected