Wireshark-dev: Re: [Wireshark-dev] Adding Buffer Stream View
Date: Wed, 22 Apr 2009 20:06:23 +0000
well my function is in the dll that i export for my dissector to use. here's the code: 

(_AppendMultiMsg)( target, bnpLength );   // adds current tvb to the buffer in my dll
multiMsgSize 		= (_GetMultiMsgSize)(); // size of whole buffer as int
next_tvb 		= tvb_new_real_data((const guint8 *)(_GetMultiMsg)(), multiMsgSize, multiMsgSize); //new tvb that holds the buffer from my dll
tvb_set_free_cb(next_tvb, (_FreeMultiMemory)); // FreeMultiMemory is the function that will free the void* multiMsg object in my dll that is holding the buffer in the first place
add_new_data_source(pinfo, next_tvb, "Multi-Part Message");
dissectPacket( next_tvb, bnp_tree, pinfo );

So i was wondering a way to put my buffer from dll into a new buffer, free the memory from my dll, but have it copied in wireshark memory to use. I had something like this before, would this work?:


(_AppendMultiMsg)( target, bnpLength );
multiMsgSize 		= (_GetMultiMsgSize)();
			
free(target);
target = ep_alloc(multiMsgSize);
memcpy(target, (_GetMultiMsg)(), multiMsgSize);
target = (_GetMultiMsg)();
next_tvb 			= tvb_new_real_data((const guint8 *)target, multiMsgSize, multiMsgSize);*/
(_FreeMultiMemory)();
add_new_data_source(pinfo, next_tvb, "Multi-Part Message");
dissectPacket( next_tvb, bnp_tree, pinfo );

Thanks for the help,

Greg

---- didier <dgautheron@xxxxxxxx> wrote: 

=============
Hi,
Le mercredi 22 avril 2009 à 18:34 +0000, gogrady@xxxxxxxxx a écrit :
> Thank you both you and Jeff, this is exactly what i was looking for. However, run into a bit of a problem. The buffer that i create, is returned from a dll where i allocate and free the memory from. I put wrapper type of functions in my wireshark dissector that frees the memory after each packet. I ended up with fe ee fe ee fe ee (etc) as my buffer which means it is freed memory. I was wondering if there is a place to put my free memory call, or if there is a way to kind of copy data over to the dissector, free my dll memory, and have wireshark then be incharge of freeing the memory it allocated. I hope you understand what my situation is. 
> 
add a call to tvb_set_free_cb()
after tvb_new_read_data()

next_tvb = tvb_new_real_data(data, datalen, datalen);
tvb_set_free_cb(new_tvb, my_free);

my_free() is called when next_tvb is freed.

for example if data is a g_malloc buffer, g_free will do it.

Didier