lua里怎么注册大插件

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:操作系统:windows 7
wireshark:1.10.3
lua 语言基本语法,特别是关于表操作和循环
wireshark 文档,包括用户使用文档和开发者文档,这些在 wireshark 官方网站都能找到
我们首先定义一个简单的协议,我们使用 C 语言的语法描述,
1 struct foo
char protocol_type[16];
/* request response notify */
char service_type[16];
/* 我们定义的各种服务类型 */
unsigned int msg_
/* 消息体的长度 */
char msg_content[0];
/* 消息体的内容,由于是变长的所以采用此方法定义 */
现在可以让我们使用 lua 定义一个最基本的框架
创建一个新的协议结构 foo_proto
第一个参数是协议名称会体现在过滤器中
第二个参数是协议的描述信息,无关紧要
local foo_proto = Proto("foo", "Foo Protolcol")
下面定义字段
local foo_protocol_type = ProtoField.string("foo.prototype", "Protocol Type", base.NONE)
local foo_service_type = ProtoField.string("foo.servicetype", "Service Type", base.NONE)
local foo_msg_len = ProtoField.uint32("foo.msglen", "Message Length", base.DEC)
local foo_msg_content = ProtoField.string("foo.msgcontent", "Message Content", base.NONE)
-- 将字段添加都协议中
foo_proto.fields = {
foo_protocol_type,
foo_service_type,
foo_msg_len,
foo_msg_content
下面定义 foo 解析器的主函数,这个函数由 wireshark调用
第一个参数是 Tvb 类型,表示的是需要此解析器解析的数据
第二个参数是 Pinfo 类型,是协议解析树上的信息,包括 UI 上的显示
第三个参数是 TreeItem 类型,表示上一级解析树
function foo_proto.dissector(tvb, pinfo, treeitem)
-- 设置一些 UI 上面的信息
pinfo.cols.protocol:set("FOO")
:set("Foo Protocol")
local offset = 0
local tvb_len = tvb:len()
-- 在上一级解析树上创建 foo 的根节点
local foo_tree = treeitem:add(foo_proto, tvb:range(offset))
-- 下面是想该根节点上添加子节点,也就是自定义协议的各个字段
-- 注意 range 这个方法的两个参数的意义,第一个表示此时的偏移量
-- 第二个参数代表的是字段占用数据的长度
foo_tree:add(foo_protocol_type, tvb:range(offset, 16))
offset = offset+16
foo_tree:add(foo_service_type, tvb:range(offset, 16))
offset = offset+16
foo_tree:add(foo_msg_len, tvb:range(offset, 4))
offset = offset+4
-- 计算消息内容的长度
local foo_content_len = tvb_len-offset
foo_tree:add(foo_msg_content, tvb:range(offset, foo_content_len))
offset = offset+foo_content_len
-- 向 wireshark 注册协议插件被调用的条件
local tcp_port_table = DissectorTable.get("tcp.port")
tcp_port_table:add(12345, foo_proto)
(1)单 TCP 分节多应用 PDU
这种情况可以在我们的协议解析函数中使用循环解决,但是应用层 PDU 一般都需要有我们自定义的分割标识符,不然无法区分,这里我们使用协议尾端标记的方式,采用0xFF分割,这里我们假设我们的协议体中不会出现这个值,也就是我们的消息体长度字段的值不会出现这个值。
(2)单应用 PDU 多 TCP 分节
这种情况就需要 wireshark 为我们重新拼接被 TCP 协议栈拆分的数据,不过这已经有接口可用了,下面是处理两种情况的框架
-- 这里便于运算需要将数据类型进行转换
local tvbrange = tvb:range(0)
local bytearray = tvbrange:bytes()
local offset = pinfo.desegment_offset or 0
while true do
local pdu_flg = false
local pdu_end_index = 0
-- ByteArray 类型的索引与 C 类似
-- 这与 lua 本身处理表的方式有所区别
for i = offset, tvb_len do
if 0xFF == bytearray:get_index(i) then
pdu_flg = true
pdu_end_index = i
-- 如果没有找到 PDU 的结束符,进行合包延迟解析
if false == frame_end_flg then
-- 如果明确知道这个应用协议还需要多少字节
-- 可以明确地将需要的值填上,而不是使用下面的值
-- 只是表示需要更多的分节
pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
-- 下面是正常的处理流程,在上面的代码中已经有体现了
-- 不过此时协议最大边界为 pdu_end_index
(1)谈到网络协议,如果涉及到整数必然会有字节序的问题,如果 wireshark 默认使用的是大端字节序,如果协议中的整数采用的是小端字节序,那么请考虑使用 TreeItem 类型的 le_add() 方法替代 add() 方法。
(2)在 add 和 le_add 方法中,我们可以显式设定我们自己的值,可以给 add 方法传递第三个值,例如,
local protocol_type = tvb:range(offset, 16):string()
foo_tree:add(foo_protocol_type, tvb:range(offset, 4), protocol_type)
这样显示的就是 protocol_type 的内容,另外这里的 protocol_type 类型一定要与上面定义 foo_protocol_type 让 wireshark 解析的一致,不然这个值是无效的,也就是说这个地方 protocol_type 如果是整数,就是无效,反过来也是一样。
(3)在协议解析树上增加节点不一定要提前定义字段,也就是字段的定义不是必须的,例如,
1 local protocol_type = tvb:range(offset, 16):string()
2 foo_tree:add(tvb:range(offset, 16), "Protocol Type: " .. protocol_type)
效果是一样的,但是在过滤器中无法使用此字段。
(4):set 方法可以延迟调用,也就说可以在确定了消息的各种属性之后在调用,这样可以更清晰的显示协议的摘要。
(1)wireshark 用户手册,在 wireshark 的***目录下有 chm 的版本,最值得参考的是第11章的数据类型和各种方法的解释。
(2)重组被拆分的 TCP 分节,
(3)处理一个分节多应用 PDU,
(4)调用子协议的方法,
阅读(...) 评论()Havok c++ Lua插件注册传值
时间: 03:30:37
&&&& 阅读:127
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&  下面要说到的前提是在有了解的前提下进行的。教了如何新建一个自己的插件,我是在这基础上修改的。
  参考了官网下载下来的案例,案例地址“F:\Havok\AnarchySDK\Source\Vision\Runtime\EnginePlugins\RemoteInputEnginePlugin”,这是一个安卓远程输入的引擎插件,在安卓手机屏幕上点击即可点。
  1.注册引擎插件名
  在GameManager.cpp文件中,加入
extern "C" int luaopen_RemoteInput(lua_State *);
void MyGameManager::OnHandleCallback(IVisCallbackDataObject_cl *pData)
if(LuaSet)//在程序加载时注册Lua
RemoteInput
Vision::IsInitialized() || Vision::IsInitializing()&&
IVScriptManager* pScriptManager = Vision::GetScriptManager();
if (pScriptManager)
lua_State* pLuaState = static_cast&VScriptResourceManager*&(pScriptManager)-&GetMasterState();
if(pLuaState)
lua_getglobal(pLuaState, "RemoteInput");
int iType = lua_type(pLuaState, -1);
lua_pop(pLuaState, 1);
if(iType!=LUA_TUSERDATA)
luaopen_RemoteInput(pLuaState);
int iRetParams = LUA_CallStaticFunction(pLuaState,"RemoteInput","IVRemoteInput","Cast","v&v", this);
if (iRetParams==1)
if(lua_isnil(pLuaState, -1))
lua_pop(pLuaState, iRetParams);
lua_setglobal(pLuaState, "RemoteInput");
Vision::Message.Print(1, 400, 420, "lua_RemoteInput setCompleted");
// //already loaded
Vision::Error.Warning("can not creat lua FMOD,lua_state
null or error!");
//Vision::Error.Warning("can not creat lua FMOD,lua_state
null or error!");
if (pData-&m_pSender==&Vision::Callbacks.OnBeforeSceneLoaded)
//在场景加载你可以在这里添加你的特定的代码
client.addTuioListener(&dump);
client.connect(false);
if (pData-&m_pSender==&Vision::Callbacks.OnUpdateSceneBegin)
//This callback will be triggered at the beginning of every frame
//您可以添加您自己的每帧的逻辑
if (m_bPlayingTheGame)
//Vision::Message.Print(1, 200, 100, "testrunning 140208");
//在场景加载你可以在这里添加你的特定的代码
time(&nowtime);
tm* t_tm=localtime(&nowtime);
KinectTestX=10*t_tm-&tm_
KinectTestX=10*t_tm-&tm_*/
//***端口
/*TuioObject *frameObject = NULL;
TuioObject *tobj = (*iter);
frameObject = new TuioObject(currentTime,tobj-&getSessionID(),tobj-&getSymbolID(),tobj-&getX(),tobj-&getY(),tobj-&getAngle());*/
//Vision::Mouse.SetPosition(x,y);
//Vision::Mouse.IsLeftButtonPressed();//if Input:IsMouseButtonPressed(Vision.BUTTON_LEFT) then
if (pData-&m_pSender==&Vision::Callbacks.OnEditorModeChanged)
// 当vforge开关从editormode_playing_in_game,关闭我们的游戏模式
if (((VisEditorModeChangedDataObject_cl *)pData)-&m_eNewMode != VisEditorManager_cl::EDITORMODE_PLAYING_IN_GAME)
SetPlayTheGame(false);
if (pData-&m_pSender==&Vision::Callbacks.OnAfterSceneLoaded)
//被触发时,玩游戏vforge启动或外vforge加载后的场景
if (Vision::Editor.IsPlayingTheGame())
SetPlayTheGame(true);
Vision::Input.Update();
Vision::Mouse.SetPosition(100,100);
if (pData-&m_pSender==&Vision::Callbacks.OnWorldDeInit)
// 这是重要的当在外面跑vforge
SetPlayTheGame(false);
注册插件以及每帧的逻辑
  2.在RemoteInputModule_wrapper.cpp中修改代码(此文件从上面提到的RemoteInputEnginePlugin中引用)
SWIGINTERN int _wrap_IVRemoteInput_GetKinectPoint(lua_State *L)
SWIG_CONVERT_POINTER(L, 1, IVRemoteInput, pSelf)
//float x=KinectTestX, y=KinectTestY;
//Vision::Mouse.IsLeftButtonPressed();
//pSelf-&GetKinectPoint(x, y);
lua_pushnumber(L, (lua_Number)KinectTestX);
lua_pushnumber(L, (lua_Number)KinectTestY);
return 2; //in every case we leave two values at the stack
  3.之后再vForge中可调用
local x,y = RemoteInput:GetKinectPoint()
这里只是大线路写了新建插件,调用传值,有疑问联系。标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/bkycjj/p/3533932.html
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!

参考资料

 

随机推荐