Nebula2探秘附件:nutildef与nkernelinfo的代码
发布时间:2020-12-13 00:26:08 所属栏目:百科 来源:网络整理
导读:nutildef.h中主要定义了运行Nebula2程序所需要的最小依赖以及简化声明和使用Nebula2对象的工具宏,代码如下: /* ************************************************************************** */ /* Nebula2-TutorialUtils */ /* nKernelInfo-Nebula2实用
nutildef.h中主要定义了运行Nebula2程序所需要的最小依赖以及简化声明和使用Nebula2对象的工具宏,代码如下: /* ************************************************************************** *//* Nebula2-TutorialUtils */ /* nKernelInfo-Nebula2实用工具宏及静态库 */ /* author:happykevins */ /* ************************************************************************** */ #pragma once /// ---------------------------------------------------------------------------- /// +必要的链接库 #ifdefKS_STATICLINK_NEBULA2 #pragma comment(lib,"wsock32.lib") #pragma comment(lib,"dxguid.lib") #pragma comment(lib,"dxerr9.lib") #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9d.lib") #pragma comment(lib,"dinput8.lib") #pragma comment(lib,"ogg_d.lib") #pragma comment(lib,"theora_d.lib") #pragma comment(lib,"sqlite_d.lib") #pragma comment(lib,"d_microtcl.lib") #pragma comment(lib,"d_nkernel.lib") #pragma comment(lib,"d_nnebula.lib") #pragma comment(lib,"d_ntoollib.lib") #pragma comment(lib,"d_ngui.lib") #pragma comment(lib,"d_ndinput8.lib") #pragma comment(lib,"d_ndirect3d9.lib") #endif /// -必要的链接库 /// ---------------------------------------------------------------------------- /// ---------------------------------------------------------------------------- /// +声明Nebula2对象工具宏 /// 声明使用指定的Module #define nNebulaUseModule(MODULE) extern void * n_new_##MODULE( void ); extern bool n_init_##MODULE(nClass * ,nKernelServer * ); /// 将指定Module添加到KernelServer #define nNebulaAddModule(MODULE) nKernelServer::Instance() -> AddModule(#MODULE, n_init_##MODULE,n_new_##MODULE); /// 声明为Nebula2Module #define nNebulaModule(CLASS,MODULE,BASEMODULENAME) extern bool n_init_##MODULE(nClass * clazz,nKernelServer * kernelServer); extern void * n_new_##MODULE(); bool n_init_##MODULE(nClass * clazz,nKernelServer * kernelServer){ clazz -> SetProperName(#MODULE); clazz -> SetInstanceSize( sizeof (CLASS)); kernelServer -> AddClass(BASEMODULENAME,clazz); return true ; }; void * n_new_##MODULE(){ return n_new(CLASS());}; /// 命令初始化函数名 #define nNebulaScriptInitCmds(MODULE)n_initcmds_##MODULE /// 声明为Nebula2脚本Module #define nNebulaScriptModule(CLASS,nKernelServer * kernelServer); extern void * n_new_##MODULE(); extern void n_initcmds_##MODULE(nClass * ); bool n_init_##MODULE(nClass * clazz,clazz); n_initcmds_##MODULE(clazz); return true ; }; void * n_new_##MODULE(){ return n_new(CLASS());}; /// -声明Nebula2对象工具宏 /// ---------------------------------------------------------------------------- nkernelinfo类主要是对第3章代码的整理,目前支持察看Nebula2的Class列表和当前NOH中的对象两项功能。 /* Nebula2-TutorialUtils */ /* nKernelInfo-Nebula2内核信息调试器 */ /* author:happykevins */ /* ************************************************************************** */ #pragma once #include " kernel/nkernelserver.h " #include " util/nstack.h " #include " util/nhashlist.h " // 使用标准输出流(否则输出到Nebula2的日志系统) #ifdefKS_USE_STDOUT #define ks_printprintf #else #define ks_printn_printf #endif class nKernelInfoHelper: public nRoot { public : /// 构造nKernelInfoHelper nKernelInfoHelper(nKernelServer * _ks = nKernelServer::Instance()); /// 设置KernelServer实例 void SetKernelServer(nKernelServer * _ks); /// 将指定NOH分支的当前信息输出到Nebula日至系统 void LogNOH( const char * szRootPath); /// 将当前的类列表输出到Nebula日至系统 void LogCLS(); protected : nKernelServer * ks; }; nkernelinfo.cpp代码如下: // nkernelinfo.cpp#pragma warning(push) #pragma warning(disable:42674244) #include " nkernelinfo.h " #include " nutildefs.h " /// 声明为Nebula2脚本支持类 nNebulaScriptModule(nKernelInfoHelper,nkernelinfohelper, " nroot " ); /// ---------------------------------------------------------------------------- /// +CommonSection /// /// 构造nKernelInfoHelper nKernelInfoHelper::nKernelInfoHelper(nKernelServer * _ks) :ks(_ks) { } /// 设置KernelServer实例 void nKernelInfoHelper::SetKernelServer(nKernelServer * _ks) { this -> ks = _ks; } /// 将指定NOH分支的当前信息输出到Nebula日至系统 void nKernelInfoHelper::LogNOH( const char * szRootPath) { n_assert(ks); n_assert(szRootPath); nRoot * pRoot = ks -> Lookup(szRootPath); if ( ! pRoot) { ks_print( " --NONE:%s---- " ,szRootPath); return ; } // 内核加锁 ks -> Lock(); // 打印根节点NOH名 if (pRoot -> GetParent()) { ks_print( " %s " ,pRoot -> GetFullName().Get()); } else { ks_print( " %s " ,pRoot -> GetName()); } // 打印所有子节点 if (pRoot -> GetHead()) { // 层次栈 // 在开始时将根节点入栈 nStack < nRoot *> deepStack; deepStack.Push(pRoot -> GetHead()); // 遍历树 do { // 获得当前栈顶元素 nRoot * obj = deepStack.Pop(); // 打印该元素NOH名 if (obj -> GetParent()) { ks_print( " %s " ,obj -> GetFullName().Get()); } else { ks_print( " %s " ,obj -> GetName()); } // 兄弟节点入栈 if (obj -> IsLinked() && obj -> GetSucc()) { deepStack.Push(obj -> GetSucc()); } // 第一个子节点入栈 if (obj -> GetHead()) { deepStack.Push(obj -> GetHead()); } } while ( ! deepStack.IsEmpty()); } // 内核解锁 ks -> Unlock(); } /// 将当前的类列表输出到Nebula日至系统 void nKernelInfoHelper::LogCLS() { n_assert(ks); // 内核加锁 ks -> Lock(); // 获得Class列表 const nHashList * classList = ks -> GetClassList(); nHashNode * node = (nClass * )classList -> GetHead(); // 遍历输出Class列表 do { nClass * cls = (nClass * )node; ks_print( " %s " ,cls -> GetName()); node = node -> GetSucc(); } while (node); // 内核解锁 ks -> Unlock(); } /// /// -CommonSection /// ---------------------------------------------------------------------------- /// ---------------------------------------------------------------------------- /// +ScriptSection /// /// LogCLS的脚本支持 static void n_logcls( void * slf,nCmd * cmd); /// LogNOH的脚本支持 static void n_lognoh( void * slf,nCmd * cmd); void nNebulaScriptInitCmds(nkernelinfohelper)(nClass * cl) { cl -> BeginCmds(); cl -> AddCmd( " v_logcls_v " , ' LCLS ' ,n_logcls); cl -> AddCmd( " v_lognoh_s " , ' LNOH ' ,n_lognoh); cl -> EndCmds(); } static void n_logcls( void * slf,nCmd * cmd) { nKernelInfoHelper * self = (nKernelInfoHelper * )slf; self -> LogCLS(); } static void n_lognoh( void * slf,nCmd * cmd) { nKernelInfoHelper * self = (nKernelInfoHelper * )slf; const char * root = cmd -> In() -> GetS(); self -> LogNOH(root); } /// /// -ScriptSection /// ---------------------------------------------------------------------------- #pragma warning(pop) -The End- (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |