#pragma once #include #include #include #include #include "../util/util.hpp" #include "../loadup.hpp" #include "../raw_driver.hpp" #pragma pack ( push, 1 ) typedef struct _GIOMAP { unsigned long interface_type; unsigned long bus; std::uintptr_t physical_address; unsigned long io_space; unsigned long size; } GIOMAP; #pragma pack ( pop ) namespace physmeme { inline std::string drv_key; // // please code this function depending on your method of physical read/write. // inline HANDLE load_drv() { const auto [result, key] = driver::load(raw_driver, sizeof(raw_driver)); drv_key = key; return CreateFile( "\\\\.\\GIO", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); } // // please code this function depending on your method of physical read/write. // inline bool unload_drv() { return driver::unload(drv_key); } inline HANDLE drv_handle = load_drv(); // // please code this function depending on your method of physical read/write. // inline std::uintptr_t map_phys( std::uintptr_t addr, std::size_t size ) { //--- ensure the validity of the address we are going to try and map if (!util::is_valid(addr)) return NULL; GIOMAP in_buffer = { 0, 0, addr, 0, size }; uintptr_t out_buffer[2] = { 0 }; unsigned long returned = 0; DeviceIoControl(drv_handle, 0xC3502004, reinterpret_cast(&in_buffer), sizeof(in_buffer), reinterpret_cast(out_buffer), sizeof(out_buffer), &returned, NULL); return out_buffer[0]; } // // please code this function depending on your method of physical read/write. // inline bool unmap_phys( std::uintptr_t addr, std::size_t size ) { uintptr_t in_buffer = addr; uintptr_t out_buffer[2] = {sizeof(out_buffer)}; unsigned long returned = NULL; DeviceIoControl(drv_handle, 0xC3502008, reinterpret_cast(&in_buffer), sizeof(in_buffer), reinterpret_cast(out_buffer), sizeof(out_buffer), &returned, NULL); return out_buffer[0]; } }