mirror of
https://github.com/Cr4sh/KernelForge
synced 2026-06-08 10:43:38 +00:00
115 lines
3.3 KiB
C++
115 lines
3.3 KiB
C++
#include "stdafx.h"
|
|
//--------------------------------------------------------------------------------------
|
|
static BOOL WinioPhysMap(
|
|
HANDLE hDevice, DWORD_PTR Addr, DWORD_PTR Size,
|
|
HANDLE *phSection, PVOID *pSectionAddr, PVOID *pObjectAddr)
|
|
{
|
|
DWORD dwSize = 0;
|
|
WINIO_PHYS_MEM Request;
|
|
|
|
ZeroMemory(&Request, sizeof(Request));
|
|
|
|
Request.Size = Size;
|
|
Request.Addr = Addr;
|
|
|
|
// send physical memory map request
|
|
if (DeviceIoControl(
|
|
hDevice, IOCTL_WINIO_PHYS_MEM_MAP,
|
|
&Request, sizeof(Request), &Request, sizeof(Request), &dwSize, NULL))
|
|
{
|
|
*phSection = Request.hSection;
|
|
*pObjectAddr = Request.ObjectAddr;
|
|
*pSectionAddr = Request.SectionAddr;
|
|
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
DbgMsg(__FILE__, __LINE__, "DeviceIoControl() ERROR %d\n", GetLastError());
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
//--------------------------------------------------------------------------------------
|
|
static BOOL WinioPhysUnmap(HANDLE hDevice, HANDLE hSection, PVOID SectionAddr, PVOID ObjectAddr)
|
|
{
|
|
DWORD dwSize = 0;
|
|
WINIO_PHYS_MEM Request;
|
|
|
|
ZeroMemory(&Request, sizeof(Request));
|
|
|
|
Request.hSection = hSection;
|
|
Request.SectionAddr = SectionAddr;
|
|
Request.ObjectAddr = ObjectAddr;
|
|
|
|
// send physical memory unmap request
|
|
if (DeviceIoControl(
|
|
hDevice, IOCTL_WINIO_PHYS_MEM_UNMAP,
|
|
&Request, sizeof(Request), &Request, sizeof(Request), &dwSize, NULL))
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
DbgMsg(__FILE__, __LINE__, "DeviceIoControl() ERROR %d\n", GetLastError());
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
//--------------------------------------------------------------------------------------
|
|
BOOL WinioPhysRead(HANDLE hDevice, DWORD_PTR Addr, DWORD_PTR Size, PVOID Data)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
HANDLE hSection = NULL;
|
|
PVOID SectionAddr = NULL, ObjectAddr = NULL;
|
|
|
|
// map physical memory region
|
|
if (!WinioPhysMap(hDevice, Addr, Size, &hSection, &SectionAddr, &ObjectAddr))
|
|
{
|
|
DbgMsg(__FILE__, __LINE__, __FUNCTION__"() ERROR: WinioPhysMemMap() fails\n");
|
|
return FALSE;
|
|
}
|
|
|
|
__try
|
|
{
|
|
// perform memory read operation
|
|
bRet = memcpy(Data, SectionAddr, Size) != NULL;
|
|
}
|
|
__finally
|
|
{
|
|
// unmap physical memory region
|
|
WinioPhysUnmap(hDevice, hSection, SectionAddr, ObjectAddr);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
//--------------------------------------------------------------------------------------
|
|
BOOL WinioPhysWrite(HANDLE hDevice, DWORD_PTR Addr, DWORD_PTR Size, PVOID Data)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
HANDLE hSection = NULL;
|
|
PVOID SectionAddr = NULL, ObjectAddr = NULL;
|
|
|
|
// map physical memory region
|
|
if (!WinioPhysMap(hDevice, Addr, Size, &hSection, &SectionAddr, &ObjectAddr) != 0)
|
|
{
|
|
DbgMsg(__FILE__, __LINE__, __FUNCTION__"() ERROR: WinioPhysMemMap() fails\n");
|
|
return FALSE;
|
|
}
|
|
|
|
__try
|
|
{
|
|
// perform memory write operation
|
|
bRet = memcpy(SectionAddr, Data, Size) != NULL;
|
|
}
|
|
__finally
|
|
{
|
|
// unmap physical memory region
|
|
WinioPhysUnmap(hDevice, hSection, SectionAddr, ObjectAddr);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
//--------------------------------------------------------------------------------------
|
|
// EoF
|