Files
2021-05-17 00:36:08 +07:00

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