📄 devicecontrol.cpp
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ * ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 * に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· * この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 * み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ * (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する * ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚を倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: devicecontrol.cpp,v 1.2 2002/04/10 11:26:20 takayuki Exp $ */#include "stdafx.h"#include "device.h"#include "devicecontrol.h"/////////////////////////////////////////////////////////////////////////////// CDeviceControlconst CLSID CLSID_Device = {0xFEE2A68B,0x7F98,0x40E0,{0x98,0x53,0x18,0x3E,0xE6,0x8B,0xC7,0xF8}};__declspec(naked) void * __fastcall MemoryCopy(void * dest, void * src, unsigned int size){ __asm mov eax, ecx __asm mov edi, ecx __asm mov esi, edx __asm pop ebx __asm pop ecx __asm rep movsb __asm jmp ebx}STDMETHODIMP CDeviceControl::Connect(){ if(!FAILED(manager.CoCreateInstance(CLSID_Device)) && !FAILED(manager.Advise((_IDeviceEvents *)this,__uuidof(_IDeviceEvents),&cookie))) return S_OK; if(! !manager) manager.Release(); return E_FAIL;}STDMETHODIMP CDeviceControl::Close(){ if(!manager) return E_FAIL; AtlUnadvise(manager,__uuidof(_IDeviceEvents),cookie); manager.Release(); cookie = 0; return S_OK;}STDMETHODIMP CDeviceControl::get_Valid(BOOL *pVal){ *pVal = !manager ? FALSE : ~0; return S_OK;}STDMETHODIMP CDeviceControl::RaiseInterrupt(long inhno){ if(!manager) return E_FAIL; return manager->RaiseInterrupt(inhno);}STDMETHODIMP CDeviceControl::Map(long address, long size){ if(!manager) return E_FAIL; return manager->Map(address, size);}STDMETHODIMP CDeviceControl::Unmap(long address){ if(!manager) return E_FAIL; return manager->Unmap(address);}STDMETHODIMP CDeviceControl::get_IsKernelStarted(BOOL *pVal){ *pVal = KernelStarted ? ~0 : 0; return S_OK;}STDMETHODIMP CDeviceControl::get_Offset(long *pVal){ *pVal = Offset; return S_OK;}STDMETHODIMP CDeviceControl::put_Offset(long newVal){ if(newVal >= Limitation) return E_FAIL; Offset = newVal; return S_OK;}STDMETHODIMP CDeviceControl::get_AccessSize(short *pVal){ *pVal = AccessSize; return S_OK;}STDMETHODIMP CDeviceControl::put_AccessSize(short newVal){ switch(newVal) { case 1: case 2: case 4: break; default: return E_FAIL; } AccessSize = newVal; return S_OK;}STDMETHODIMP CDeviceControl::get_Value(long *pVal){ if(DataPointer == 0) return E_FAIL; *pVal = 0; MemoryCopy(pVal, DataPointer + Offset, AccessSize); Offset += AccessSize; if(Offset >= Limitation) Offset = Limitation -1; return S_OK;}STDMETHODIMP CDeviceControl::put_Value(long newVal){ if(DataPointer == 0) return E_FAIL; MemoryCopy(DataPointer + Offset, &newVal, AccessSize); Offset += AccessSize; if(Offset >= Limitation) Offset = Limitation -1; return S_OK;}STDMETHODIMP CDeviceControl::OnRead(long address,long sz,byte __RPC_FAR data[]){ if(!KernelStarted) this->OnKernelStart(); DataPointer = (unsigned char *)data; Limitation = sz; Offset = 0; Fire_OnRead(address, sz); DataPointer = 0; return S_OK;}STDMETHODIMP CDeviceControl::OnWrite(long address,long sz,byte __RPC_FAR data[]){ if(!KernelStarted) this->OnKernelStart(); DataPointer = (unsigned char *)data; Limitation = sz; Offset = 0; Fire_OnWrite(address,sz); DataPointer = 0; return S_OK;}STDMETHODIMP CDeviceControl::OnKernelStart(){ KernelStarted = true; Fire_OnKernelStart(); return S_OK;}STDMETHODIMP CDeviceControl::OnKernelExit(){ KernelStarted = false; Fire_OnKernelExit(); return S_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -