📄 stdafx.cpp
字号:
list<CKernelLog *>::iterator watcher;
DebugOut(::wsprintfA(Buffer,"DetachKernel\n"));
::EnterCriticalSection(&cs);
if( (result = Kernel == kernel) )
{
scope = DeviceList.begin();
while(scope != DeviceList.end())
{
(*scope)->Fire_OnKernelExit();
scope ++;
}
view = ViewerList.begin();
while(view != ViewerList.end())
{
(*view)->Fire_OnKernelChanged(2);
view ++;
}
watcher = WatcherList.begin();
while(watcher != WatcherList.end())
{
(*watcher)->Fire_OnKernelExit();
watcher ++;
}
Kernel = 0l;
DebugOut(::wsprintfA(Buffer,"DetachKernel was performed successfully\n"));
}
::LeaveCriticalSection(&cs);
return result;
}
bool CExeModule::Read(CKernel * kernel, unsigned long address, unsigned long sz, unsigned char data[])
{
bool result;
map<Range,CDevice *>::iterator scope;
DebugOut(::wsprintfA(Buffer,"Read\n"));
::EnterCriticalSection(&cs);
if(Kernel != kernel)
{
::LeaveCriticalSection(&cs);
DebugOut(::wsprintfA(Buffer,"Illegal Kernel\n"));
return false;
}
scope = DeviceMap.find(Range(address,sz));
result = (scope != DeviceMap.end());
if(result)
(*scope).second->Fire_OnRead(address, sz, data);
::LeaveCriticalSection(&cs);
return result;
}
bool CExeModule::Write(CKernel *kernel, unsigned long address, unsigned long sz, unsigned char *data)
{
bool result;
map<Range,CDevice *>::iterator scope;
DebugOut(::wsprintfA(Buffer,"Write\n"));
::EnterCriticalSection(&cs);
if(Kernel != kernel)
{
::LeaveCriticalSection(&cs);
DebugOut(::wsprintfA(Buffer,"Request performed by Illegal Kernel\n"));
return false;
}
scope = DeviceMap.find(Range(address,sz));
result = (scope != DeviceMap.end());
if(result)
{
DebugOut(::wsprintfA(Buffer,"FireWrite\n"));
(*scope).second->Fire_OnWrite(address, sz,data);
}
::LeaveCriticalSection(&cs);
return result;
}
bool CExeModule::RaiseInterrupt(unsigned long inhno)
{
bool result = false;
::EnterCriticalSection(&cs);
if(Kernel != 0 && Kernel->Fire_OnInterruptRequest(inhno) >= 0)
result = true;
::LeaveCriticalSection(&cs);
return result;
}
bool CExeModule::AddLogWatcher(CKernelLog * watcher)
{
if( find(WatcherList.begin(), WatcherList.end(), watcher) != WatcherList.end() )
return false; //懡廳搊榐
::EnterCriticalSection(&cs);
WatcherList.push_back(watcher);
::LeaveCriticalSection(&cs);
DebugOut(::wsprintfA(Buffer,"Log watcher inserted into the queue successfully\n"));
return true;
}
void CExeModule::RemoveLogWatcher(CKernelLog * watcher)
{
list<CKernelLog *>::iterator scope;
::EnterCriticalSection(&cs);
scope = find(WatcherList.begin(), WatcherList.end(), watcher);
if(scope != WatcherList.end())
WatcherList.erase(scope);
::LeaveCriticalSection(&cs);
DebugOut(::wsprintfA(Buffer,"Log watcher removed from the queue successfully\n"));
}
/*
* 儘僌忣曬偺庬暿偺掕媊
*/
#define LOG_TYP_INTERRUPT 0x01 /* 妱崬傒僴儞僪儔 */
#define LOG_TYP_ISR 0x02 /* 妱崬傒僒乕價僗僴儞僪儔 */
#define LOG_TYP_TIMERHDR 0x03 /* 僞僀儉僀儀儞僩僴儞僪儔 */
#define LOG_TYP_CPUEXC 0x04 /* CPU椺奜僴儞僪儔 */
#define LOG_TYP_TSKEXC 0x05 /* 僞僗僋椺奜張棟儖乕僠儞 */
#define LOG_TYP_TSKSTAT 0x06 /* 僞僗僋忬懺曄壔 */
#define LOG_TYP_DISPATCH 0x07 /* 僨傿僗僷僢僠儍 */
#define LOG_TYP_SVC 0x08 /* 僒乕價僗僐乕儖 */
#define LOG_TYP_COMMENT 0x09 /* 僐儊儞僩乮暥帤楍偺傒偺儘僌乯 */
#define LOG_ENTER 0x00 /* 擖岥乛奐巒 */
#define LOG_LEAVE 0x80 /* 弌岥乛廔椆 */
typedef unsigned int BITMASK;
typedef struct {
unsigned int logtype;
unsigned int logtim;
BITMASK valid;
unsigned int bufsz;
unsigned char buf[];
} DBIFLOG;
#define DBIFLOG_BUFMARGIN (sizeof(unsigned int)*4)
bool CExeModule::OnLogEvent(CKernel *kernel, long sz, unsigned char *data)
{
list<CKernelLog *>::iterator scope;
#if 0
DBIFLOG * log = reinterpret_cast<DBIFLOG *>(data);
DebugOut(::wsprintfA(Buffer,"LOG <%08x> ",log->logtim));
switch(log->logtype)
{
case LOG_TYP_TSKSTAT:
DebugOut(::wsprintfA(Buffer,"[STATUS] Tsk:%d ",*(int*)log->buf));
switch(*((int*)log->buf+1))
{
case 0x01:
case 0x02:
DebugOut(::wsprintfA(Buffer,"<Runnable [Ready+Running]>\n",*(int*)log->buf));
break;
case 0x04:
case 0x0c:
if(*((int*)log->buf+1) == 0x04)
DebugOut(::wsprintfA(Buffer,"<Waiting : "));
else
DebugOut(::wsprintfA(Buffer,"<Wait-Suspend : "));
switch(*((int*)log->buf+2))
{
case 0x1:
DebugOut(::wsprintfA(Buffer,"Sleep>\n"));
break;
case 0x2:
DebugOut(::wsprintfA(Buffer,"Delay>\n"));
break;
case 0x4:
DebugOut(::wsprintfA(Buffer,"Semaphore>\n"));
break;
default:
DebugOut(::wsprintfA(Buffer," complex [%04x]>\n", *((int*)log->buf+2)));
break;
}
break;
case 0x08:
DebugOut(::wsprintfA(Buffer,"<Suspended>\n"));
break;
case 0x10:
DebugOut(::wsprintfA(Buffer,"<Dormant>\n"));
break;
default:
DebugOut(::wsprintfA(Buffer,"<Unknown : %d>",*(int*)log->buf));
break;
}
break;
case LOG_TYP_TSKEXC:
DebugOut(::wsprintfA(Buffer,"[TSKEXC|ENT] Tsk:%d\n",*(int*)log->buf));
break;
case LOG_TYP_TSKEXC | LOG_LEAVE:
DebugOut(::wsprintfA(Buffer,"[TSKEXC|LEA] Tsk:%d\n",*(int*)log->buf));
break;
case LOG_TYP_DISPATCH:
if(*((int*)log->buf+1) == 0)
DebugOut(::wsprintfA(Buffer,"[DSP|ENT] Tsk:%d Task-context\n",*(int*)log->buf));
else
DebugOut(::wsprintfA(Buffer,"[DSP|ENT] Tsk:%d Nontask-context\n",*(int*)log->buf));
break;
case LOG_TYP_DISPATCH | LOG_LEAVE:
DebugOut(::wsprintfA(Buffer,"[DSP|LEA] Tsk:%d\n",*(int*)log->buf));
break;
case LOG_TYP_COMMENT:
DebugOut(::wsprintfA(Buffer,"[COMMENT (%d)] : ",log->bufsz));
::WriteFile(::GetStdHandle(STD_OUTPUT_HANDLE), log->buf, log->bufsz-1, &Count, NULL);
break;
case LOG_TYP_INTERRUPT:
DebugOut(::wsprintfA(Buffer,"[INT|ENT] %d\n",*(int*)log->buf));
break;
case LOG_TYP_INTERRUPT | LOG_LEAVE:
DebugOut(::wsprintfA(Buffer,"[INT|LEA] %d\n",*(int*)log->buf));
break;
case LOG_TYP_CPUEXC:
DebugOut(::wsprintfA(Buffer,"[CPUEXC|ENT] Tsk:%d\n",*(int*)log->buf));
break;
case LOG_TYP_CPUEXC | LOG_LEAVE:
DebugOut(::wsprintfA(Buffer,"[CPUEXC|LEA] Tsk:%d\n",*(int*)log->buf));
break;
case LOG_TYP_TIMERHDR:
case LOG_TYP_TIMERHDR | LOG_LEAVE:
if((log->logtype & LOG_LEAVE) != 0)
DebugOut(::wsprintfA(Buffer,"[INT|LEA]"));
else
DebugOut(::wsprintfA(Buffer,"[INT|ENT]"));
if( *(int*)log->buf == 0x8d )
DebugOut(::wsprintfA(Buffer," cyclic "));
else
DebugOut(::wsprintfA(Buffer," OBJ(%02x) ", *(int*)log->buf));
DebugOut(::wsprintf(Buffer," ID:%d EXINF:0x%08x\n",*((int*)log->buf+1), *((int*)log->buf+2)));
break;
default:
DebugOut(::wsprintfA(Buffer,"[UNKNOWN:0x%x]\n",log->logtype));
};
#endif
if(Kernel != kernel)
{
DebugOut(::wsprintfA(Buffer,"Request performed by Illegal Kernel\n"));
return false;
}
::EnterCriticalSection(&cs);
scope = WatcherList.begin();
while(scope != WatcherList.end())
{
(*scope)->Fire_OnLogEvent(sz, data);
scope ++;
}
::LeaveCriticalSection(&cs);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -