📄 fc_windows.cpp
字号:
/*
* TOPPERS/JSP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Just Standard Profile Kernel
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
*
* 忋婰挊嶌尃幰偼丆埲壓偺 (1)乣(4) 偺忦審偐丆Free Software Foundation
* 偵傛偭偰岞昞偝傟偰偄傞 GNU General Public License 偺 Version 2 偵婰
* 弎偝傟偰偄傞忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃傾
* 傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
* 棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
* (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
* 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
* 僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
* (2) 杮僜僼僩僂僃傾傪丆儔僀僽儔儕宍幃側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒傞宍偱嵞攝晍偡傞応崌偵偼丆嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡
* 幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰
* 偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (3) 杮僜僼僩僂僃傾傪丆婡婍偵慻傒崬傓側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒側偄宍偱嵞攝晍偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙
* 偲丏
* (a) 嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊
* 嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (b) 嵞攝晍偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆TOPPERS僾儘僕僃僋僩偵
* 曬崘偡傞偙偲丏
* (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
* 奞偐傜傕丆忋婰挊嶌尃幰偍傛傃TOPPERS僾儘僕僃僋僩傪柶愑偡傞偙偲丏
*
* 杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偍
* 傛傃TOPPERS僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
* 娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
* 愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
*
* @(#) $Id: fc_windows.cpp,v 1.1 2006/04/14 02:46:04 9564907 Exp $
*/
#if (defined(FILECONTAINER_WINDOWS) || defined(TESTSUITE)) && defined(_MSC_VER)
#pragma warning(disable:4786)
#include "base/filecontainer.h"
#include <windows.h>
#include <imagehlp.h>
#include <string>
using namespace std;
namespace {
class FileContainerWindowsImpl : public FileContainer
{
protected:
HANDLE process;
LOADED_IMAGE image;
DWORD base;
inline bool isLoaded(void) const
{ return base != 0; }
public:
FileContainerWindowsImpl(void) throw();
virtual ~FileContainerWindowsImpl(void) throw();
/* 僀儞僞僼僃乕僗晹 */
virtual void attachModule(const string & filename) throw(Exception);
virtual void loadContents(void * dest, address_t address, size_t size) throw(Exception);
virtual address_t getSymbolAddress(const string & symbol) throw(Exception);
virtual std::string getArchitecture(void) throw();
TESTSUITE_PROTOTYPE(main)
};
FileContainerWindowsImpl instance_of_FileContaienrWindowsImpl;
/* 僐儞僗僩儔僋僞 */
FileContainerWindowsImpl::FileContainerWindowsImpl(void) throw()
: process(NULL), image(), base(0)
{}
/* 僨僗僩儔僋僞 */
FileContainerWindowsImpl::~FileContainerWindowsImpl(void) throw()
{
if(isLoaded()) {
::UnMapAndLoad(&image);
::SymUnloadModule(process, base);
process = NULL;
base = 0;
}
}
/* 懳徾儌僕儏乕儖偺妱晅 */
void FileContainerWindowsImpl::attachModule(const std::string & _filename) throw(Exception)
{
string filename(_filename);
process = ::GetCurrentProcess();
if(::SymInitialize( process , NULL, FALSE) == FALSE)
ExceptionMessage("[Internal Error] ImageHelper API initialization failure","[撪晹僄儔乕] 弶婜壔偵幐攕偟傑偟偨 (ImageHlp)").throwException();
base = ::SymLoadModule(process, NULL, (PSTR)filename.c_str(), NULL, 0, 0);
image.SizeOfImage = sizeof(LOADED_IMAGE);
if(::MapAndLoad((PSTR)filename.c_str(), NULL, &image, FALSE, TRUE) == FALSE)
ExceptionMessage("[Internel error] Module loading failure [%]","[撪晹僄儔乕] 儌僕儏乕儖偺撉傒崬傒偵幐攕偟傑偟偨 [%]") << filename << throwException;
}
/* 撪梕偺庢摼 */
void FileContainerWindowsImpl::loadContents(void * dest, address_t address, size_t size) throw(Exception)
{
PIMAGE_SECTION_HEADER header;
unsigned int i;
address -= base;
for(i=0;i<image.NumberOfSections;i++) {
header = image.Sections+i;
if(address >= header->VirtualAddress && address < header->VirtualAddress + header->SizeOfRawData) {
address -= header->VirtualAddress - header->PointerToRawData;
::CopyMemory(dest,image.MappedAddress + address,size);
break;
}
}
if(i == image.NumberOfSections)
ExceptionMessage("[Internel error] Memory read with unmapped address","[撪晹僄儔乕] 儅僢僾偝傟偰側偄傾僪儗僗傪巊偭偰儊儌儕儕乕僪偑峴傢傟傑偟偨").throwException();
}
/* 僔儞儃儖傾僪儗僗偺夝寛 */
FileContainer::address_t FileContainerWindowsImpl::getSymbolAddress(const string & _symbol) throw(Exception)
{
FileContainer::address_t result = 0;
string symbol(_symbol);
IMAGEHLP_SYMBOL sym;
if(process == NULL || base == 0)
ExceptionMessage("Not initialized","弶婜壔偝傟偰傑偣傫").throwException();
sym.SizeOfStruct = sizeof(sym);
sym.MaxNameLength = 0;
if(::SymGetSymFromName(process, (PSTR)symbol.c_str(), &sym) == TRUE)
result = static_cast<FileContainer::address_t>(sym.Address);
if(result == 0)
ExceptionMessage("Unknown symbol [%]","晄惓側僔儞儃儖柤 [%]") << symbol << throwException;
return static_cast<FileContainer::address_t>(sym.Address);
}
string FileContainerWindowsImpl::getArchitecture(void) throw()
{ return "Windows (Win32)"; }
}
//---------------------------------------------
#ifdef TESTSUITE
#include "base/coverage_undefs.h"
#pragma warning(disable:4311) //'reinterpret_cast' : 億僀儞僞傪 'const int *__w64 ' 偐傜 'FileContainer::address_t' 傊愗傝媗傔傑偡丅
extern "C" const int FileContainerWindowsImplTestVariable = 0x01234567;
extern "C" const int _FileContainerWindowsImplTestVariableWithUnderbar = 0x89abcdef;
TESTSUITE(main, FileContainerWindowsImpl)
{
PREDECESSOR("TFileContainer");
SingletonBase::ContextChain chain;
chain.saveContext<RuntimeObjectTable>();
chain.renewInstance();
BEGIN_CASE("attachModule","attachModule") {
BEGIN_CASE("1","幚峴偟偰偄傞僾儘僌儔儉偑奐偗傞偐") {
FileContainerWindowsImpl fcwi;
bool result = true;
try { fcwi.attachModule(TestSuite::getProgName()); } catch(...) { result = false; }
TEST_CASE("1", "椺奜偼婲偒側偄", result);
} END_CASE;
BEGIN_CASE("2","懚嵼偟側偄僼傽僀儖柤偱椺奜") {
FileContainerWindowsImpl fcwi;
bool result = false;
try { fcwi.attachModule("..."); } catch(...) { result = true; }
TEST_CASE("1", "椺奜偑婲偒傞", result);
} END_CASE;
} END_CASE;
BEGIN_CASE("getSymbolAddress","getSymbolAddress") {
FileContainerWindowsImpl fcwi;
BEGIN_CASE("1","弶婜壔偟偰偄側偄忬懺偱専嶕偡傞") {
bool result = false;
try { fcwi.getSymbolAddress("FileContainerWindowsImplTestVariable"); } catch(...) { result = true; }
TEST_CASE("1","椺奜偑偍偒傞", result);
} END_CASE;
fcwi.attachModule(TestSuite::getProgName());
BEGIN_CASE("2","懚嵼偡傞僔儞儃儖傪専嶕偡傞") {
FileContainer::address_t addr = 0;
bool result = true;
try { addr = fcwi.getSymbolAddress("FileContainerWindowsImplTestVariable"); } catch(...) { result = false; }
TEST_CASE("1","椺奜偼婲偒側偄", result);
TEST_CASE("2","傾僪儗僗偑惓偟偄", addr == reinterpret_cast<FileContainer::address_t>(&FileContainerWindowsImplTestVariable));
} END_CASE;
BEGIN_CASE("3","梋寁側_傪彑庤偵晅壛偟側偄") {
FileContainer::address_t addr = 0;
bool result = false;
try { addr = fcwi.getSymbolAddress("FileContainerWindowsImplTestVariableWithUnderbar"); } catch(...) { result = true; }
TEST_CASE("1","椺奜偑婲偒傞", result);
TEST_CASE("2","傾僪儗僗偼0偺傑傑", addr == 0);
} END_CASE;
BEGIN_CASE("4","懚嵼偟側偄僔儞儃儖傪専嶕偡傞") {
FileContainer::address_t addr = 0;
bool result = false;
try { addr = fcwi.getSymbolAddress("____unknown____"); } catch(...) { result = true; }
TEST_CASE("1","椺奜偑偍偒傞", result);
} END_CASE;
} END_CASE;
BEGIN_CASE("loadContents","loadContents") {
FileContainerWindowsImpl fcwi;
fcwi.attachModule(TestSuite::getProgName());
BEGIN_CASE("1","懚嵼偡傞曄悢傪撉傒弌偡") {
FileContainer::address_t addr;
int i;
addr = fcwi.getSymbolAddress("FileContainerWindowsImplTestVariable");
bool result = true;
try { fcwi.loadContents(&i, addr, sizeof(i)); } catch(...) { result = false; }
TEST_CASE("1","椺奜偼婲偒側偄", result);
TEST_CASE("2","撉傒弌偝傟偨撪梕偼惓偟偄", i == FileContainerWindowsImplTestVariable);
} END_CASE;
BEGIN_CASE("2","懚嵼偟側偄曄悢傪撉傒弌偡") {
FileContainer::address_t addr;
int i;
addr = ~0;
bool result = false;
try { fcwi.loadContents(&i, addr, sizeof(i)); } catch(Exception &) { result = true; }
TEST_CASE("1","椺奜偑婲偙傞", result);
} END_CASE;
} END_CASE;
chain.restoreContext();
}
#endif /* TESTSUITE */
#endif /* FILECONTAINER_WINDOWS || TESTSUITE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -