Jump to content

_DLLStructDisplay - Show Struct in ListView


Ascend4nt
 Share

Recommended Posts

_DLLStructDisplay

Posted Image

While working on debugging a project a while back, I was looking for better ways to debug the code. And voila, here it is.

Anyway, this function displays the contents of your DLLStruct's in a ListView format (placing the items in an array and utilizing _ArrayDisplay).

IMPORTANT: You must supply the string EXACTLY as it was used to set up the structure (although you can add descriptions after the datatypes if they aren't already there). The string requirement might seem like one more extra step, but without it the function wouldn't work (and you're debugging would be much harder).

The code is smart enough to split items into subitems (based on [#]'s found), and will display the description with {sub item #x}).

Also - the behaviour with GINORMOUS pieces of data is unknown - this is best used with smaller structures!

NOTE: One thing you might notice about structures is alignment has alot to do with where items are placed in the structure. The default is '8', which means that everything is aligned on a boundary equally divisible by itself (char being 1 byte is aligned anywhere, int's being 4 bytes, are aligned on offsets divisible by 4, double's and int64's both are aligned on offsets equally divisible by 8)

HOWEVER: a prefix of 'align ##' can change this behavior so that the data can be 'misaligned' so to speak, to the specified alignment # (see AutoIT Help info for DLLStructCreate)

Update Log:

5/27/2011: Small fixes, ability to use multiple 'align' directives

Fixed: initial 'align (##);' check code failed in certain circumstances (align on its own, spaces after #)

Fixed: 'char' & 'byte' can now be part of description of all array objects

Added/Fixed: 'align (##);' can now appear anywhere in a structure, now properly handled (extra ones are reported in display)

5/26/2011: Updated to new structure alignment directives (as of AutoIt v3.3.7.2beta)

Added: Structure size information, End-of-Structure Padding Info

Added: Struct/EndStruct support, these show up in list with C-style curly braces { };

3/18/2010: Updated to all new supported types as of AutoIT v3.3.6.0

Added: Index, Offset, Size Columns, Base Pointer & Alignment Type info (in Title Bar and in 'Offset' column)

Fixed: subitem listings, items with labels, alignment override being read as a type, subitem offsets, fixed case-sensitivity

Adjusted: stripped unnecessary whitespace, added options to display Strings (char[#]/wchar[#]) and Binary string data (ubyte[#],byte[#]) as one concatenated string

Download the ZIP Here

Ascend4nt's AutoIT Code License agreement:

While I provide this source code freely, if you do use the code in your projects, all I ask is that:

  • If you provide source, keep the header as I have put it, OR, if you expand it, then at least acknowledge me as the original author, and any other authors I credit
  • If the program is released, acknowledge me in your credits (it doesn't have to state which functions came from me, though again if the source is provided - see #1)
  • The source on it's own (as opposed to part of a project) can not be posted unless a link to the page(s) where the code were retrieved from is provided and a message stating that the latest updates will be available on the page(s) linked to.
  • Pieces of the code can however be discussed on the threads where Ascend4nt has posted the code without worrying about further linking.
Edited by Ascend4nt
Link to comment
Share on other sites

Heh I made something similar for a long time ago, forgot to post it :(

Anyways, it looks good & useful. However my thoughts:

  • Using for example "align 2;" should not show up as a data type
  • Possible trailing and leading spaces should be removed, it looks funny in the listview.
  • Definitely needs to display the pointer to the struct somewhere, this will serve as a double purpose since it will display '0' of the struct is invalid
  • Maybe show arrays of type byte/char/wchar in binary/string in a single listview element?
Other than that it works fine >_<

Edit:

To calculate correct offset you can use DllStructGetPtr() with the element paramater. Array elements will always be placed next to eachother in the array.

Edited by monoceres

Broken link? PM me and I'll send you the file!

Link to comment
Share on other sites

@Monoceres: Thanks for the ideas - I will implement some of them, maybe some as bool parameters. As for calculating the offset, I had tried to use an element index, but then found out there's only a pointer to the element (so pointers to individual items in [#] can't be gotten).

I'm going to just use a type-size translation array or even a string with StringRegExp to see which would be faster to get the actual size of each item (hmm..gotta take into account size differences with @AutoItX64)

@dmob: Thanks for the compliment >_< , I'm glad I've been of help.

Link to comment
Share on other sites

Updated! Hopefully this satisfies the needs of most. (This also fixes some issues). Changes (since last time):

Fixes:

  • Fixed items with label descriptions
  • Fixed alignment-override being read as a data-type
  • Fixed subitem offset info
Additions:

  • Added DLL Struct 'Base pointer' info (in Title bar & 'Offset' column description)
  • Added Alignment info (in Title bar & 'Offset' column description)
  • Stripped whitespace from Struct Type/descriptions (except where needed for Labels and subitem info)
  • Added parameter option to display multi-character strings (char[#]/wchar[#]) as one concatenated string (default behavior)
  • Added parameter option to display multi-byte Binary strings (ubyte[#],byte[#]) as one concatenated string (not default behavior)
  • *edit* Also added 'Size' column (which is also properly adjusted for x86 or x64 mode)
Anyways, have a look. Hopefully this should make everyone happy. >_<

Edited by Ascend4nt
Link to comment
Share on other sites

Okay, last change (I hope!). I've added an 'Index' column, because those sub-items can make it a bit confusing if you're trying to remember which index to use as the base index into the Structure. (the sub-item # is the sub-index)

Th-th-th-thats all >_<

Link to comment
Share on other sites

Excellent! Very useful thing.

Was missing it and also was too lazy to write it and I knew some day someone would and I'll just say thanks.

So, thanks.

Btw, I see you don't use Opt("MustDeclareVars", 1). Everyone should. And tidy.exe, and #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 4 -w 5 -w 6 and ...actually nothing more >_<

♡♡♡

.

eMyvnE

Link to comment
Share on other sites

Excellent! Very useful thing.

Was missing it and also was too lazy to write it and I knew some day someone would and I'll just say thanks.

So, thanks.

You're welcome :( Now someone should create a tool to test, mess around with, and create your own DLLStructs.

:( erm, hey, why are you looking at me. I'm not a GUI guy da*it!

*walks off mumbling about too many projects on my mind* >_<

Link to comment
Share on other sites

  • 7 months later...

I'm back. Code has been updated, latest edit:

*edits: 3/18/2010: Updated to all new supported types as of AutoIT v3.3.6.0

Link to comment
Share on other sites

  • 1 month later...
  • 1 year later...

New updates (works with latest beta changes!):

5/26/2011: Updated to new structure alignment directives (as of AutoIt v3.3.7.2beta)

Added: Structure size information, End-of-Structure Padding Info

Added: Struct/EndStruct support, these show up in list with C-style curly braces { };

Link to comment
Share on other sites

Updated again. Didn't know about the ability to use multiple 'align' directives in a structure, now I do! So here's a version that works with those structures (plus a bugfix or 2):

5/27/2011: Small fixes, ability to use multiple 'align' directives

Fixed: initial 'align (##);' check code failed in certain circumstances (align on its own, spaces after #)

Fixed: 'char' & 'byte' can now be part of description of all array objects

Added/Fixed: 'align (##);' can now appear anywhere in a structure, now properly handled (extra ones are reported in display)

Link to comment
Share on other sites

  • 10 months later...

I have changed for my personal use:

113 ; $aStDisplay[0][0]="Index"
114 ; $aStDisplay[0][1]="DLL Struct Type + Description (optional)"
115 ; $aStDisplay[0][2]="Value"
116 ; $aStDisplay[0][3]="Offset [Base Ptr="&$iBaseAddress&", Alignment="&$iAlign&" [Base], Size="&$iStrSize&']'
117 ; $aStDisplay[0][4]="Size [Total="&$iStrSize&']'
118
119 $iDispIndex=0
...
224  _ArrayDisplay($aStDisplay,"DLLStruct"&$sStructName&" Contents [Base Ptr="&$iBaseAddress&", Alignment="&$iAlign&", Size="&$iStrSize&']',-1,0,"","|", _
225  "Row|Index|DLL Struct Type + Description (optional)|Value|Offset [Base Ptr="&$iBaseAddress&", Alignment="&$iAlign&" [Base], Size="&$iStrSize&"]|Size [Total="&$iStrSize&']')

AutoIt-Syntaxsheme for Proton & Phase5 * Firefox Addons by me (resizable Textarea 0.1d) (docked JS-Console 0.1.1)

Link to comment
Share on other sites

  • 1 year later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...