Code : Tout sélectionner
#include <WinAPI.au3>
#include <Array.au3>
#include <String.au3>
Global $nBytes
; #FUNCTION# =============================================================================
; Name...........: getStruct
; Description ...: Get Autoit structure and the size of it
; Syntax.........: getStruct($sPath,$sStructName,$iType)
; Parameters ....: $sPath - Path of the file who contening the structure.
; Parameters ....: $sStructName - String contening the name of the structure of his GUID sous la forme (8bit-4bit-4bit-4bit-12bit)
; Optional.......:
; Return values .: Success - Returns an array [0] = Structure
; [1] = Size of structure
; [2] = Number of Data
; Failure - Returns a 0
; @Error - 0 = No error.
; 1 = Path is not a string
; 2 = Can't open file
; 3 = Can't find the structure name
; Author ........: sea78
; ========================================================================================
Func getStruct($sPath,$sStructName,$iRecursivelvl = 1)
If Not IsString($sPath) Then
SetError(1)
Return 0
EndIf
if ($iRecursivelvl = 1) Then
Global $text[1]
Global $data[3]
$data[2] = 0
Else
ReDim $text[$iRecursivelvl]
EndIf
$file = FileOpen($sPath)
If $file = -1 Then
SetError(2)
Return 0
EndIf
$text[$iRecursivelvl-1] = FileRead($file)
FileClose($file)
$text[$iRecursivelvl-1] = StringReplace($text[$iRecursivelvl-1],@CR,"")
$text[$iRecursivelvl-1] = StringReplace($text[$iRecursivelvl-1],@LF,"")
If (StringRegExp($sStructName, '^(\{){0,1}[[:xdigit:]]{8}\-[[:xdigit:]]{4}\-[[:xdigit:]]{4}\-[[:xdigit:]]{4}\-[[:xdigit:]]{12}(\}){0,1}$')) Then
$text[$iRecursivelvl-1] = StringRegExpReplace($text[$iRecursivelvl-1], "(.*)"&$sStructName&"}{", "", 0)
$text[$iRecursivelvl-1] = StringRegExpReplace($text[$iRecursivelvl-1], "}(.*)", "", 0)
Else
$text[$iRecursivelvl-1] = StringRegExpReplace($text[$iRecursivelvl-1], "(.*)struct "&$sStructName&"({)(.{8})-(.{4})-(.{4})-(.{4})-(.{12})}{", "", 0)
$text[$iRecursivelvl-1] = StringRegExpReplace($text[$iRecursivelvl-1], "}(.*)", "", 0)
EndIf
$textExplosed = _StringExplode($text[$iRecursivelvl-1],';')
If (StringRegExp($text[0], "struct", 0)) Then
SetError(3)
Return 0
EndIf
Redim $textExplosed[UBound($textExplosed)-1]
for $i = 0 to UBound($textExplosed)-1
If CheckType($textExplosed[$i]) = 1 Then
$data[0] = $data[0]&$textExplosed[$i]&';'
$data[1] = $data[1]+getSize($textExplosed[$i])
$data[2] = $data[2]+1
ElseIf CheckType($textExplosed[$i]) = 2 Then
$nb = StringRegExpReplace($textExplosed[$i], "(\D)", "", 0)
if $nb <> "" Then
for $y = 0 to $nb
getStruct($sPath,StringRegExpReplace($textExplosed[$i], "\[(.*)\]", "", 0),$iRecursivelvl+1)
Next
Else
getStruct($sPath,StringRegExpReplace($textExplosed[$i], "\[(.*)\]", "", 0),$iRecursivelvl+1)
EndIf
EndIf
Next
Return $data
EndFunc
Func CheckType($sData)
If Not IsString($sData) Then
SetError(1)
Return 0
EndIf
If StringRegExp($sData,"char") Then
Return 1
ElseIf StringRegExp($sData,"byte") Then
$sData = StringRegExpReplace($sData, "\D", "", 0)
Return 1
ElseIf StringRegExp($sData,"boolean") Then
return 1
ElseIf StringRegExp($sData,"wchar") Then
$sData = StringRegExpReplace($sData, "\D", "", 0)
Return 1
ElseIf StringRegExp($sData,"short") Then
Return 1
ElseIf StringRegExp($sData,"ushort") Then
Return 1
ElseIf StringRegExp($sData,"word") Then
Return 1
ElseIf StringRegExp($sData,"int") Then
Return 1
ElseIf StringRegExp($sData,"long") Then
Return 1
ElseIf StringRegExp($sData,"bool") Then
Return 1
ElseIf StringRegExp($sData,"uint") Then
Return 1
ElseIf StringRegExp($sData,"ulong") Then
Return 1
ElseIf StringRegExp($sData,"dword") Then
Return 1
ElseIf StringRegExp($sData,"float") Then
Return 1
ElseIf StringRegExp($sData,"double") Then
Return 1
ElseIf StringRegExp($sData,"double") Then
Return 1
Else
Return 2
EndIf
EndFunc
; #FUNCTION# =============================================================================
; Name...........: getSize
; Description ...: Get size of type.
; Syntax.........: getSize($sData)
; Parameters ....: $sData - String contening the DataType
; Optional.......:
; Return values .: Success - Returns an int egal to the size of the DataType
; Failure - Returns a 0
; @Error - 0 = No error.
; 1 = Path is not a string
; 2 = Undefine DataType
; Author ........: sea78
; ========================================================================================
Func getSize($sData)
If Not IsString($sData) Then
SetError(1)
Return 0
EndIf
If StringRegExp($sData,"char") Then
$sData = StringRegExpReplace($sData, "\D", "", 0)
Return $sData
ElseIf StringRegExp($sData,"byte") Then
$sData = StringRegExpReplace($sData, "\D", "", 0)
Return $sData*2
ElseIf StringRegExp($sData,"boolean") Then
return 1
ElseIf StringRegExp($sData,"wchar") Then
$sData = StringRegExpReplace($sData, "\D", "", 0)
Return $sData*2
ElseIf StringRegExp($sData,"short") Then
return 2
ElseIf StringRegExp($sData,"ushort") Then
return 2
ElseIf StringRegExp($sData,"word") Then
return 2
ElseIf StringRegExp($sData,"int") Then
return 4
ElseIf StringRegExp($sData,"long") Then
Return 4
ElseIf StringRegExp($sData,"bool") Then
Return 4
ElseIf StringRegExp($sData,"uint") Then
Return 4
ElseIf StringRegExp($sData,"ulong") Then
Return 4
ElseIf StringRegExp($sData,"dword") Then
Return 4
ElseIf StringRegExp($sData,"float") Then
Return 4
ElseIf StringRegExp($sData,"double") Then
Return 8
ElseIf StringRegExp($sData,"double") Then
Return 8
Else
SetError(2)
Return 0
EndIf
EndFunc
; #FUNCTION# =============================================================================
; Name...........: readStruct
; Description ...: Read data with structure.
; Syntax.........: readStruct($sFile,$aData)
; Parameters ....: $sFile - path of the file to read
; $aData - Array with structure & Size [0] = Autoit string struct
; [1] = Size of the structure
; [2] = Number of data
; Optional.......:
; Return values .: Success - Returns an array who contening the data read
; Failure - Returns a 0
; @Error - 0 = No error.
; 1 = sFile is not a string
; 2 = aData is not an array
; 3 = aData[0] is not a string
; 4 = aData[1] is not an int
; 5 = aData[2] is not an int
; 6 = Can't open file
; Failure - Returns a 1
; @Error - Look the error code for DllStructCreate
; Author ........: sea78
; ========================================================================================
Func readStruct($sFile,$aData)
If Not IsString($sFile) Then
SetError(1)
Return 0
EndIf
If Not IsArray($aData) Then
SetError(2)
Return 0
EndIf
If Not IsString($aData[0]) Then
SetError(3)
Return 0
EndIf
If Not IsInt($aData[1]) Then
SetError(4)
Return 0
EndIf
If Not IsInt($aData[2]) Then
SetError(5)
Return 0
EndIf
Dim $aBuffer[$aData[2]+1]
$hFile = _WinAPI_CreateFile($sFile, 2, 2)
If $hFile = 0 Then
SetError(6)
Return 0
EndIf
$tBuffer = DllStructCreate($aData[0])
If $tBuffer = 0 Then
Return 1
EndIf
_WinAPI_ReadFile($hFile, DllStructGetPtr($tBuffer), $aData[1], $nBytes)
For $i = 0 to $aData[2]
$aBuffer[$i] = DllStructGetData($tBuffer, $i+1)
Next
_WinAPI_CloseHandle($hFile)
Return $aBuffer
EndFunc