⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virt_mem.cpp

📁 djgpp bt878 capture for DOS
💻 CPP
字号:
#include <dpmi.h>
#include <stdio.h>
#include <string.h>
#include "virt_mem.h"


///////////////////////////////////////////////////////////////////////////////
VIRTUAL_MEM::VIRTUAL_MEM(void)
{

    addr = 0;
    physical_address = 0;
    length = 0;
    status = 0;
}


///////////////////////////////////////////////////////////////////////////////
VIRTUAL_MEM::~VIRTUAL_MEM(void)
{
    if(addr != 0)
        free(addr);
}

///////////////////////////////////////////////////////////////////////////////
VIRTUAL_MEM::VIRTUAL_MEM(DWORD phys_addr, DWORD length_in_bytes)
{
    CreateVirtual(phys_addr, length_in_bytes);
}

///////////////////////////////////////////////////////////////////////////////
int VIRTUAL_MEM::CreateVirtual(DWORD phys_addr, DWORD length_in_bytes )
{
    physical_address = phys_addr;
    length = (length_in_bytes + 0x0fff) & 0xFFFFF000;
    addr = (BYTE*)malloc(length + 0xfff);
    if(addr == 0) {
        status = 1;
        return 0;
    }
    
    virtual_address = ((DWORD)addr + 0xfff) & 0xfffff000;
    
    if(__djgpp_map_physical_memory((void*)virtual_address, 
        length, phys_addr) == -1) {
        status = 2;
        return 0;
    }
    
    status = 0;
    return 1;
}

///////////////////////////////////////////////////////////////////////////////
char* VIRTUAL_MEM::ErrString()
{
    char* str[]={
        "",
        "Error allocate memory!\n",
        "Failed map physical memory!\n"
    };
    sprintf(buf, "VM error %d: %s", status, str[status]);
    return (char*)buf;
}


DWORD VIRTUAL_MEM::Get(DWORD offset)
{
    return *(DWORD*)(virtual_address + offset);
}

void VIRTUAL_MEM::Set(DWORD value, DWORD offset)
{
    *(DWORD*)(virtual_address + offset) = value;
}

void VIRTUAL_MEM::CopyTo(DWORD *addr, DWORD length_in_bytes, DWORD offset)
{
    if(offset < 0)
        offset = 0;
    
    if(length_in_bytes < 0 || length_in_bytes > length || offset + length_in_bytes > length)
        length_in_bytes = length - offset;
    if(length_in_bytes > 0)
        memcpy(addr, (DWORD*)(virtual_address + offset), length_in_bytes);
}

void VIRTUAL_MEM::CopyFrom(DWORD *addr, DWORD length_in_bytes, DWORD offset=0)
{
    if(offset < 0)
        offset = 0;
    
    if(length_in_bytes < 0 || length_in_bytes > length || offset + length_in_bytes > length)
        length_in_bytes = length - offset;
    
    if( length_in_bytes > 0 )
        memcpy((DWORD*)(virtual_address + offset), addr, length_in_bytes);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -