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

📄 madsys.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
字号:
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
*               DESCRIBE IT HERE!
*
****************************************************************************/


#include <stdlib.h>

#if (defined M_I86 || defined M_I386)
#define MD_x86
#elif defined __AXP__
#define MD_axp
#endif

#include "mad.h"
#include "drwatcom.h"
#include "windows.h"
#include "mem.h"

unsigned DIGCLIENT MADCliReadMem( address a, unsigned size, void *buff )
{
    DWORD bytesread;
    ReadProcessMemory( ProcessHdl, (void *)a.mach.offset, buff, size, &bytesread );
    return bytesread;
}

unsigned DIGCLIENT MADCliWriteMem( address a, unsigned size, void *buff )
{
    DWORD byteswritten;
    WriteProcessMemory( ProcessHdl, (void *)a.mach.offset, buff, size, &byteswritten );
    return byteswritten;
}

#if (defined M_I86 || defined M_I386)
void GetSysConfig(void)
{
    SYSTEM_INFO sys;

    GetSystemInfo( &sys );
    switch( sys.dwProcessorType ) {
    case PROCESSOR_INTEL_386:
        SysConfig.cpu = X86_386;
        SysConfig.fpu = X86_387;
        break;
    case PROCESSOR_INTEL_486:
        SysConfig.cpu = X86_486;
        SysConfig.fpu = X86_487;
        break;
    case PROCESSOR_INTEL_PENTIUM:
        SysConfig.cpu = X86_586;
        SysConfig.fpu = X86_587;
        break;
    }
    SysConfig.os=OS_NT;
    SysConfig.mad = MAD_X86;
    SysConfig.osminor = _osminor;
    SysConfig.osmajor = _osmajor;
    SysConfig.huge_shift = 3;
}

void LoadMADRegisters( mad_registers *MadRegisters, HANDLE threadhdl )
{
    CONTEXT context;
    context.ContextFlags = CONTEXT_FULL | CONTEXT_FLOATING_POINT;
    GetThreadContext( threadhdl, &context );
    MadRegisters->x86.cpu.eax = context.Eax;
    MadRegisters->x86.cpu.ebx = context.Ebx;
    MadRegisters->x86.cpu.ecx = context.Ecx;
    MadRegisters->x86.cpu.edx = context.Edx;
    MadRegisters->x86.cpu.esi = context.Esi;
    MadRegisters->x86.cpu.edi = context.Edi;
    MadRegisters->x86.cpu.ebp = context.Ebp;
    MadRegisters->x86.cpu.esp = context.Esp;
    MadRegisters->x86.cpu.eip = context.Eip;
    MadRegisters->x86.cpu.efl = context.EFlags;
    MadRegisters->x86.cpu.cr0 = 0;
    MadRegisters->x86.cpu.cr2 = 0;
    MadRegisters->x86.cpu.cr3 = 0;
    MadRegisters->x86.cpu.ds = context.SegDs;
    MadRegisters->x86.cpu.es = context.SegEs;
    MadRegisters->x86.cpu.ss = context.SegSs;
    MadRegisters->x86.cpu.cs = context.SegCs;
    MadRegisters->x86.cpu.fs = context.SegFs;
    memcpy( &( MadRegisters->x86.fpu ), &( context.FloatSave ), sizeof( MadRegisters->x86.fpu ) );
    MADRegistersHost( MadRegisters );
}

void StoreMADRegisters( mad_registers *MadRegisters, HANDLE threadhdl )
{
    CONTEXT context;

    MADRegistersTarget(MadRegisters);
    context.ContextFlags=CONTEXT_FULL|CONTEXT_FLOATING_POINT;
    context.Eax = MadRegisters->x86.cpu.eax;
    context.Ebx = MadRegisters->x86.cpu.ebx;
    context.Ecx = MadRegisters->x86.cpu.ecx;
    context.Edx = MadRegisters->x86.cpu.edx;
    context.Esi = MadRegisters->x86.cpu.esi;
    context.Edi = MadRegisters->x86.cpu.edi;
    context.Ebp = MadRegisters->x86.cpu.ebp;
    context.Esp = MadRegisters->x86.cpu.esp;
    context.Eip = MadRegisters->x86.cpu.eip;
    context.EFlags = MadRegisters->x86.cpu.efl;
    context.SegDs = MadRegisters->x86.cpu.ds;
    context.SegEs = MadRegisters->x86.cpu.es;
    context.SegSs = MadRegisters->x86.cpu.ss;
    context.SegCs = MadRegisters->x86.cpu.cs;
    context.SegFs = MadRegisters->x86.cpu.fs;
    memcpy(&(context.FloatSave),&(MadRegisters->x86.fpu),min(sizeof(context.FloatSave),sizeof(MadRegisters->x86.fpu)));
    SetThreadContext( threadhdl, &context );
}

#elif defined __AXP__
void GetSysConfig( void )
{
    SysConfig.cpu = 0;
    SysConfig.fpu = 0;
    SysConfig.mad = MAD_AXP;
    SysConfig.osminor = _osminor;
    SysConfig.osmajor = _osmajor;
    SysConfig.huge_shift = 0;

}

void LoadMADRegisters(mad_registers *MadRegisters, HANDLE threadhdl )
{
    CONTEXT context;

    context.ContextFlags = CONTEXT_FULL;
    GetThreadContext( threadhdl, &context );
    memcpy( &( MadRegisters->axp.r[AR_f0] ), &( context.FltF0 ), sizeof( axpreg ) * 32 );
    memcpy( &( MadRegisters->axp.r[AR_v0] ), &( context.IntV0 ), sizeof( axpreg ) * 32 );
    memcpy( &( MadRegisters->axp.r[AR_fpcr] ), &( context.Fpcr ), sizeof( axpreg ) );
    memcpy( &( MadRegisters->axp.pal.nt.fir ), &( context.Fir ), sizeof( unsigned_64 ) );
    memcpy( &( MadRegisters->axp.pal.nt.softfpcr ), &( context.SoftFpcr ), sizeof( unsigned_64 ) );
    memcpy( &( MadRegisters->axp.pal.nt.psr ), &( context.Psr ), sizeof( unsigned_32 ) );
    MadRegisters->axp.active_pal = PAL_nt;
    MADRegistersHost( MadRegisters );

}

void StoreMADRegisters( mad_registers *MadRegisters, HANDLE threadhdl )
{
    CONTEXT context;

    MADRegistersTarget( MadRegisters );
    context.ContextFlags = CONTEXT_FULL;
    memcpy( &( context.FltF0 ), &( MadRegisters->axp.r[AR_f0] ), sizeof( axpreg ) * 32 );
    memcpy( &( context.IntV0 ), &( MadRegisters->axp.r[AR_v0] ), sizeof( axpreg ) * 32 );
    memcpy( &( context.Fpcr ), &( MadRegisters->axp.r[AR_fpcr] ), sizeof( axpreg ) );
    memcpy( &( context.Fir ), &( MadRegisters->axp.pal.nt.fir ), sizeof( unsigned_64 ) );
    memcpy( &( context.SoftFpcr ), &( MadRegisters->axp.pal.nt.softfpcr ), sizeof( unsigned_64 ) );
    memcpy( &( MadRegisters->axp.pal.nt.psr ), &( context.Psr ), sizeof( unsigned_32 ) );
    SetThreadContext( threadhdl, &context );
}
#else
#error hardware support not written
#endif

⌨️ 快捷键说明

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