Jump to content
Sign in to follow this  
Ascend4nt

_DLLStructDisplay - Show Struct in ListView

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

Share this post


Link to post
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!

Share this post


Link to post
Share on other sites

Excellent learning tool.

I must say thank you, I have learned a lot from your code over the months.

I now understand things I never even learnt.

Share this post


Link to post
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.


Share this post


Link to post
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

Share this post


Link to post
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 >_<


Share this post


Link to post
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 >_<

Share this post


Link to post
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* >_<


Share this post


Link to post
Share on other sites

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


Share this post


Link to post
Share on other sites

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 { };


Share this post


Link to post
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)


Share this post


Link to post
Share on other sites

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&']')

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

  • Similar Content

    • By jchd
      Here's a new version of my Dump.au3 file (dirty). I've recently added support to dissect (dump) as a treeview-like view any string in the variable conforming to a strict JSON grammar, whereever said string is: as a standalone string variable or in an array or a map. AFAICT the only relaxed constraint not implemented here is that numbers in parsed JSON may have leading zeroes, although leading zeroes are forbidden in pure JSON specifications. If required it wouldn't be hard to add this constraint.
      @c.haslam (among others) may find it useful. Use freely.
      Dump.au3
    • By TheDcoder
      Hello, it has been a long time since I have posted here
      I am working on an AutoIt project where I need to enable to user to interactively choose any point or coordinate on the screen... something like a big overlay where the user can click anywhere on the screen to select that point. @UEZ's screenshot tool may have something similar to what I need:
      I just checked the source code for the tool and I see that the Mark_Area function has a part in selecting the area to screenshot, I tried to figure out how it works but it is simply too complex and long...
      So I was wondering if there were any examples of interactively selecting points on a screen? Maybe an UDF that I can just use in my script to make the whole thing a matter of adding few lines
      Thank you for the replies in advance!
    • By Eggie6
      Hi all,
      I have a script 
      #include <IE.au3> Local $oIE = _IEAttach("anythinghere") $tags = $oIE.document.GetElementsByTagName("div") $oCollection = $oIE.document.getElementsByClassName("x-panel-btn-td") MsgBox(0, "", $oCollection.length) which shows 8 results, how can i see what those results are, and i need also to get ID of 4th in a row of them

      Please help
    • By c.haslam
      cDebug.au3 includes four main debugging UDFs: _GuiDebug(), _ConsDebug(), _ClipDebug() and _FormatValsForDebug(). They all dump the values of all AutoIt subtypes and expressions, in a structured manner, including nested arrays (up to 3 dimensions) and slices of them, and even DLL structs and maps. It is an alternative to a graphical debugger, offering GUI output.
      The format for calling the UDFs has been designed to make coding a call as convenient and fast as possible, minimizing coding effort and the chances of errors: the $name argument is often the same as the variables arguments, enclosed in quote marks.
      For DLL structures, if you specify a tag, cDebug checks for differences between it and what it detects. If you only specify a structure variable, it can report the structure it detects, with the values of elements.
      It does much more than MsgBox(), ConsoleWrite() and _ArrayDisplay(), in a definitely user-friendly manner, and does its best to avoid hiding your code in SciTE.
      #include cDebug no maps.au3 or cDebug.au3 at the top of your script. If you #include cDebug.au3 (the version with maps)  #include #AutoIt3Wrapper_Version=B before #include cDebug.au3
      It is fully documented in    .  During debugging and development of new features, the current version is used to debug the upcoming version, so there is much testing, even so  bugs are always possible, particularly in new features, such as reporting elements of maps whose keys match a regular expression. Bug reports and suggestions are welcome.
      These UDFs have been in regular use for some years.
      Because when cDebug was developed, maps were a use at your own risk feature, there are two streams of cDebug:
      cDebug.au3 reports maps, so to use it you must be running a version of AutoIt that supports maps, e.g. 3.3.15.0, and #include cDebug.au3 cDebug no maps.au3 does not report maps, so you can be running any recent version of AutoIt, e.g. 3.3.14.5, and #include cDebug no maps.au3 The only difference between the two streams is that map-reporting code is commented out in cDebug no maps.au3 .
      These functions are documented in cDebug.pdf
      A teaser
      This script:
      #AutoIt3Wrapper_Version=B ; beta 3.3.15.0 or greater is mandatory for cDebug.au3 #include "cDebug.au3" Local $seasons[] $seasons.summer = 'May to September' $seasons.spring = 'April' $seasons.fall = 'October to November' $seasons.winter = 'December to March' Local $aCats[3][3] = [['jack','black',3],['suki','grey',4],[$seasons,'','']] Local $i = 1 Local $tStruct = DllStructCreate('uint') DllStructSetData($tStruct,1,2018) _GuiDebug('At line '&@ScriptLineNumber,'$cats,jack is,$cats[..][$i],$i,hex,structure{uint}', _ $aCats,$aCats[0][2],$aCats,$i,Hex(-$i),$tstruct) produces:

       
      Acknowledgements
      Melba23, Kafu, ProgAndy, jchd
    • By valdemar1977
      Dbug is graphical debugger for AutoIt.
      Project started by @Heron in 2009 and now supported by @asdf8 and @valdemar1977.
      Features
      Debug the complete script or just parts of it Display run status (line number of currently executed function) GUI default always-on-top in the upper right corner for comfortable debugging WM_NOTIFY and WM_COMMAND hook to prevent interference with possible message handlers Display scope, type and value of variables, expressions, macro's and constants (global AND function local) Execute commands in an immediate window. Can be expressions, functions and assignments Detailed display of array, struct and object variables Dynamic display of variable value in the source code (under cursor) Array table viewer with ability to view the sub-arrays, the correct handling of macro @Error, @Extended and other changes OEM and ANSI console output Conditional breakpoints Saving settings and debugging state and much more... How to use
      Extract from downloaded archive _Dbug.au3 to your Autoit include dir Add #include <_Dbug.au3> in to your code and run code Before compile or buid comment or remove #include <_Dbug.au3> from your code
×
×
  • Create New...