Что нового

Добавление ресурса в EXE файл средствами AutoIt

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Написал функцию для внедрения ресурса в exe файл, но она отказывается работать, так как я гдето допустил ошибки:

1. Выходной файл имеет вид RCX...tmp
2. После того как пропустить RCX...tmp (вручную переименованный в RCX...exe) через UPX, то
при запуске вылетает ошибка.

Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

AddResource(@ScriptDir & '\test.exe', @ScriptDir & '\1.exe', 'RCData', 'TEST')

Func AddResource($sModule, $sResource, $sResType, $sResName, $iResLanguage = 0)

	$hFile = _WinAPI_CreateFileEx($sResource, $OPEN_EXISTING, $GENERIC_READ)
	$iSize = _WinAPI_GetFileSize($hFile)
	If Not $iSize Then
	    _WinAPI_CloseHandle($hFile)
		Return SetError(1, 0, 0)
	EndIf	

	$tByte = DllStructCreate('byte[' & $iSize & ']')
	$pByte = DllStructGetPtr($tByte)
	
	If _WinAPI_ReadFile($hFile, $pByte, DllStructGetSize($tByte), $iSize) Then
	    $hUpdate = _WinAPI_BeginUpdateResource($sModule)
		If (@error) Or (Not $hUpdate) Then Return SetError(2, 0, 0)
		If $hUpdate Then 
	        If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $iResLanguage, DllStructGetPtr($tByte), DllStructGetSize($tByte)) Then
                _WinAPI_EndUpdateResource($hUpdate, 0)
			EndIf
		EndIf
	EndIf
	_WinAPI_CloseHandle($hFile)
	
	Return True
EndFunc


Для теста, написал функцию по извлечению ресурса из файла

Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

$hInstance = _WinAPI_LoadLibraryEx(@ScriptDir & '\Test.exe', $LOAD_LIBRARY_AS_DATAFILE)
ExtractResource($hInstance, @ScriptDir & '\Msg.exe', 'RCData', 'TEST')

Func ExtractResource($hInstance, $sExtractPath, $sResType, $sResName, $iResLanguage = 0)
	Local $hResource, $aResSize, $aResLoad, $pMemRes
	
	If $iResLanguage Then
        $hResource = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hResource = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
	$iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
	$aResLoad = _WinAPI_LoadResource($hInstance, $hResource)
	$pMemRes = _WinAPI_LockResource($aResLoad)
	If @error Then
        Return SetError(@error, @extended, 0)
    EndIf
	
	$tByte = DllStructCreate('byte[' & $iSize & ']', $pMemRes)
	
	$hFile = _WinAPI_CreateFileEx($sExtractPath, $CREATE_ALWAYS, $GENERIC_WRITE)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($tByte), DllStructGetSize($tByte), $tByte)
	If $hFile Then
        _WinAPI_CloseHandle($hFile)
    EndIf
	_WinAPI_FreeLibrary($hInstance)
EndFunc



Добавлено:
Сообщение автоматически объединено:

Протестировал эти 2 функции, сначало добавляю в exe ресурс, потом извлекаю, всё работает правильно, но если exe в который был добавлен ресурс сжать, то exe вылетает, я чёт не пойму

и ресурс добавляется не в сам exe который прописали, а появляется копия этого exe с названием
RCX48.tmp с добавленным ресурсом :scratch:

Наверное всё дело в том что при добавлении ресурса нужно распаковать exe упакованный UPX'ом, а потом обратно запокавать, подскажите как распаковать exe?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Распаковка

Код:
upx -d --no-backup test.exe

Упаковка

Код:
upx --best --no-backup --overlay=copy --compress-exports=1 --compress-resources=0 --strip-relocs=1 test.exe
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Всё таки всё дело в функции AddResource()

EXE в который нужно добавить ресурсы, должен при запуске их распаковать из себя, если ресурсы добавлять в ручную через Restorator, а потом полученный EXE пропустить через UPX, то он работает, тоесть распаковывает нужные ресурсы из себя, а если всё делать с помощью AddResource(), то полученные EXE просто вылетает.

Мои действия при добавлении ресурсов:

1. Распаковываю EXE (если требуется)
2. Добавляю ресурсы в RCData
3. Упаковываю EXE UPX'ом

Запускаю и вижу окно MsgBox'a информирующего об ошибке EXE, самое главное что у этого MsgBox нет ни заголовка ни текста :blink:

Прикрепляю пример EXE, как должно быть после добавления ресурсов, там же искодник этого EXE и функция для добавления ресурсов.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Похоже что функции на WinAPI по работе с ресурсами не хотят работать, нашёл пример на C++, портировал на AutoIt, на AutoIt не работает :stars:


Добавлено:
Сообщение автоматически объединено:

C AutoIt'ом не прокатывает добавление, редактирование и удаление ресурсов, решил провести тест:

Скомпилировал исходник с MsgBox на AutoIt
Скомпилировал исходник с MsgBox на PureBasic

Запускаю функцию для удаления ресурса (Manifest) из EXE

После удаления, EXE скомпилированное на PureBasic запускается и работает, EXE скомпилированное на AutoIt выдаёт ошибку:

Ошибка при инициализации приложения (0xc0000005). Для выхода из приложения нажмите кнопку "OK".
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Не забывай, что AutoIt скрипт после компиляции не является самостоятельной программой в полном смысле этого слова. Сам скрипт сидит в оверлее, а при добавлении ресурсов размер файла увеличивается и адресация на блок данных со скриптом сбивается. Тебе нужно поправить этот адрес после добавления всех ресурсов.

Для примера возьми исходник AutoIt3Wrapper'а (лежит в папке SciTE\AutoIt3Wrapper), там это должно присутствовать, т.к. задачи примерно одинаковые.

Я с этим не разбирался, т.к. не было необходимости, так что, если разберешься, отпишись здесь пожалуйста.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Yashied, отпишусь и выложу примеры, спасибо за подсказку, так и думал что нужно править exe.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
OffTopic:

suicide.gif




Добавлено:
Сообщение автоматически объединено:


Нашёл решение, всё работает, позже выложу готовый пример.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вот то что получилось:

Код:
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>

Global $AutoitScriptCodeDataStruct = 0 ,$ImageFileName = ""
;test.exe     - Файл в который будем добавлять ресурс
;out_test.exe - Файл который у нас получится (выходной)
;1.exe        - Файл который будем добавлять в ресурсы

$hUpdate = BeginUpdateResource('test.exe', 'out_test.exe')
$hFile = _WinAPI_CreateFileEx('1.exe', $OPEN_EXISTING, $GENERIC_READ)
$iSize = _WinAPI_GetFileSize($hFile)
$tByte = DllStructCreate('byte[' & $iSize & ']')
$pByte = DllStructGetPtr($tByte)
_WinAPI_ReadFile($hFile, $pByte, $iSize, $iSize)
UpdateResource($hUpdate, 10, 'EXE1', $pByte, DllStructGetSize($tByte))
EndUpdateResource($hUpdate)

Func BeginUpdateResource($pFileName = "Autoit.exe",$OutFile = "NewExeFile.exe", $bDeleteExistingResources = False)
    Local $OF_READWRITE = 0x00000002 ,$OF_CREATE = 0x00001000 
    Local $FullPath = ""
    If $pFileName == $OutFile Then 
        $SplitA = StringSplit($OutFile,"\")
        For $i = 1 To $SplitA[0] 
			If $i = $SplitA[0] Then 
                $FullPath &= "New_" & $SplitA[$i] 
			Else
                $FullPath &= $SplitA[$i] & "\"
            EndIf
        Next
        $OutFile = $FullPath
    EndIf
    $ImageFileName = $OutFile
    $hFile = _WinAPI_CreateFile($pFileName, 2, 2)
	If (Not $hFile) Then Return -1
    $HFILE1 = _WinAPI_FileOpen($OutFile, 0x00001000 + 0x00000002)
    $HFILE2 = _WinAPI_FileOpen($OutFile, 0x00001000 + 0x00000002)
	If Not ($HFILE1) Or Not ($HFILE2) Then Return -2
    $IMAGE_DOS_HEADER = READ_IMAGE_DOS_HEADER($hFile,0)
    WRITE_IMAGE_DOS_HEADER($HFILE1, 0, $IMAGE_DOS_HEADER)
    $MovePos = DllStructGetData($IMAGE_DOS_HEADER, 'lfanew')
    $lfanew = $MovePos
    $Signature = READ_Signature($hFile, $MovePos)
    If DllStructGetData($Signature, 'Signature') <> 0x00004550 And DllStructGetData($Signature, 'Signature') <> 0x50450000 Then Return -3
    WRITE_Signature($HFILE1, $MovePos, $Signature)
    $MovePos += DllStructGetSize($Signature)
    $IMAGE_FILE_HEADER = READ_IMAGE_FILE_HEADER($hFile, $MovePos)
    WRITE_IMAGE_FILE_HEADER($HFILE1, $MovePos, $IMAGE_FILE_HEADER)
    $MovePos += DllStructGetSize($IMAGE_FILE_HEADER)
    $IMAGE_OPTIONAL_HEADER = READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
    If DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x10b And DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x20b Then Return -4
    $IMovePos = $MovePos
    WRITE_IMAGE_OPTIONAL_HEADER($HFILE1, $MovePos, $IMAGE_OPTIONAL_HEADER)
    $NumberOfSections = DllStructGetData($IMAGE_FILE_HEADER, 'NumberOfSections')
    $MovePos += DllStructGetSize($IMAGE_OPTIONAL_HEADER)
    $JMovePos = $MovePos
    $SizeOfHeaders = DllStructGetData($IMAGE_OPTIONAL_HEADER, 'SizeOfHeaders')
    ;SizeOf IMAGE_SECTION_HEADER ==> 40
    $RemainderSize = $SizeOfHeaders - ($MovePos + $NumberOfSections * 40)
    $DataPos = ($MovePos + $NumberOfSections * 40)
    $DataStruct = READ_Data($hFile, $DataPos, $RemainderSize)
    WRITE_Data($HFILE2, $DataPos, $DataStruct)
    For $i = 1 To $NumberOfSections
        $IMAGE_SECTION_HEADER = READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
        WRITE_IMAGE_SECTION_HEADER($HFILE1, $MovePos, $IMAGE_SECTION_HEADER)
        $PointerToRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'PointerToRawData')
        $SizeOfRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'SizeOfRawData')
        $VirtualAddress = DllStructGetData($IMAGE_SECTION_HEADER, 'VirtualAddress')
        $ByteStruct = READ_SECTION($hFile, $PointerToRawData, $SizeOfRawData)
        WRITE_SECTION($HFILE2, $PointerToRawData, $byteStruct)
        $MovePos += DllStructGetSize($IMAGE_SECTION_HEADER)
    Next
    _WinAPI_CloseHandle($hFile)
    _WinAPI_CloseHandle($HFILE1)
    _WinAPI_CloseHandle($HFILE2)

    $ImageFileSize = FileGetSize($OutFile) ;Get Image File Size WithOut Autoit Script Code
    $AutoitFileSize = FileGetSize($pFileName) ;Get Autoit File Size With Autoit Script Code $pFileName = "Autoit.exe"
    $AutoitScriptCodeSize = $AutoitFileSize - $ImageFileSize ;Get Autoit Script Code Size
    $AutoitScriptCodeDataStruct = FileToDataStruct($pFileName, 2, $ImageFileSize, 0) ;Flag = 2 Char ;$iPos = $ImageFileSize ;$iMethod = $FILE_BEGIN 

    $aRet = DllCall('kernel32.dll', 'handle', 'BeginUpdateResource', 'str', $OutFile, 'bool', $bDeleteExistingResources)
    If (@error) Or (Not $aRet[0]) Then Return -5
	Return $aRet[0]
EndFunc

Func UpdateResource($hUpdate, $sResType, $sResName, $pData, $iData, $iResLanguage = 0)
	
    If IsString($sResType) Then
        $aResType = 'str'
        $lpType = StringUpper($sResType)
    Else
        $aResType = 'long'
        $lpType = Int($sResType)
    EndIf
	
    If IsString($sResName) Then
        $aNameType = 'str'
        $lpName = StringUpper($sResName)
    Else
        $aNameType = 'long'
        $lpName = Int($sResName)
    EndIf

    Local $aRet = DllCall('kernel32.dll', 'bool', 'UpdateResource', 'handle', $hUpdate, $aResType, $sResType, $aNameType, $sResName, 'word', $iResLanguage, 'ptr', $pData, 'dword', $iData)
    If @error Then Return 0
    Return $aRet[0]
EndFunc

Func EndUpdateResource($hUpdate, $fDiscard = False)
    Local $nBytes
    Local $aRet = DllCall("kernel32.dll", "bool", "EndUpdateResource", "handle", $hUpdate, "bool", $fDiscard)
    If (@error) Or (Not $aRet[0]) Then Return -1
    $hFile = _WinAPI_CreateFile($ImageFileName, 2, 4) ;$ImageFileName = $OutFile
    If Not($hFile) Then Return -2
    _WinAPI_SetFilePointer($hFile, 0, 2)

    $bool = _WinAPI_WriteFile($hFile, DllStructGetPtr($AutoitScriptCodeDataStruct), DllStructGetSize($AutoitScriptCodeDataStruct), $nBytes)
    If (Not $bool) Then Return -3
    _WinAPI_CloseHandle($hFile)
    Return 1
EndFunc

Func FileToDataStruct($sFile, $Flag = 1, $iPos = 0 ,$iMethod = 0)
    Local $iRead
    Local $iSize = FileGetSize($sFile)
    If (Not $iSize) Then Return -1
    Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
    If (Not $hFile) Then Return -2
    _WinAPI_SetFilePointer($hFile, $iPos, $iMethod)
	If $Flag <> 1 Then
        $DataStruct = DllStructCreate("char[" & $iSize & "]")
    Else
        $DataStruct = DllStructCreate("byte[" & $iSize & "]")
    EndIf
    $aRet = _WinAPI_ReadFile($hFile, DllStructGetPtr($DataStruct), $iSize, $iRead)
    If @error Then Return -3
    _WinAPI_CloseHandle($hFile)
    If Not $aRet Then Return -3
    Return $DataStruct
EndFunc

Func CRE_IMAGE_SECTION_HEADER($pByte = 0)
    Local $tagIMAGE_SECTION_HEADER = '' & _ ;// IMAGE_SECTION_HEADER C++6 WINNT.H without union
    "byte    Name[8];" & _
    "dword   Misc;" & _
    "dword   VirtualAddress;" & _
    "dword   SizeOfRawData;" & _
    "dword   PointerToRawData;" & _
    "dword   PointerToRelocations;" & _
    "dword   PointerToLinenumbers;" & _
    "ushort  NumberOfRelocations;" & _
    "ushort  NumberOfLinenumbers;" & _
    "dword   Characteristics"
    If ($pByte) Then Return MRtlMoveMemory($tagIMAGE_SECTION_HEADER, $pByte, 40)
    Return DllStructCreate($tagIMAGE_SECTION_HEADER) ;Create
EndFunc

Func CRE_IMAGE_OPTIONAL_HEADER($pByte = 0)
    Local $tagIMAGE_OPTIONAL_HEADER = '' & _   ;// IMAGE_OPTIONAL_HEADER C++6 WINNT.H
    "ushort  Magic;" & _
    "ubyte   MajorLinkerVersion;" & _
    "ubyte   MinorLinkerVersion;" & _
    "dword   SizeOfCode;" & _
    "dword   SizeOfInitializedData;" & _
    "dword   SizeOfUninitializedData;" & _
    "dword   AddressOfEntryPoint;" & _
    "dword   BaseOfCode;" & _
    "dword   BaseOfData;" & _
    "dword   ImageBase;" & _
    "dword   SectionAlignment;" & _
    "dword   FileAlignment;" & _
    "ushort  MajorOperatingSystemVersion;" & _
    "ushort  MinorOperatingSystemVersion;" & _
    "ushort  MajorImageVersion;" & _
    "ushort  MinorImageVersion;" & _
    "ushort  MajorSubsystemVersion;" & _
    "ushort  MinorSubsystemVersion;" & _
    "dword   Win32VersionValue;" & _
    "dword   SizeOfImage;" & _
    "dword   SizeOfHeaders;" & _
    "dword   CheckSum;" & _
    "ushort  Subsystem;" & _
    "ushort  DllCharacteristics;" & _
    "dword   SizeOfStackReserve;" & _
    "dword   SizeOfStackCommit;" & _
    "dword   SizeOfHeapReserve;" & _
    "dword   SizeOfHeapCommit;" & _
    "dword   LoaderFlags;" & _
    "dword   NumberOfRvaAndSizes;" & _
    "byte byteData[128]"
    ; 128 ==> sizeof(IMAGE_DATA_DIRECTORY) * IMAGE_NUMBEROF_DIRECTORY_ENTRIES
    If ($pByte) Then Return MRtlMoveMemory($tagIMAGE_OPTIONAL_HEADER, $pByte, 224)
    Return DllStructCreate($tagIMAGE_OPTIONAL_HEADER) ;Create
EndFunc

Func CRE_IMAGE_FILE_HEADER ($pByte = 0)
    Local $tagIMAGE_FILE_HEADER = 'ushort Machine;ushort NumberOfSections;dword TimeDateStamp;' & _
	'dword PointerToSymbolTable;dword NumberOfSymbols;ushort SizeOfOptionalHeader;ushort Characteristics'
    If ($pByte) Then Return MRtlMoveMemory($tagIMAGE_FILE_HEADER, $pByte, 20) ;reading the File header format
    Return DllStructCreate($tagIMAGE_FILE_HEADER)
EndFunc

Func CRE_IMAGE_DOS_HEADER($pByte = 0)
    Local $tagIMAGE_DOS_HEADER =  '' & _      ;// DOS .EXE header C++6 WINNT.H
    "ushort   magic;" & _                     ;// Magic number
    "ushort   cblp;" & _                      ;// Bytes on last page of file
    "ushort   cp;" & _                        ;// Pages in file
    "ushort   crlc;" & _                      ;// Relocations
    "ushort   cparhdr;" & _                   ;// Size of header in paragraphs
    "ushort   minalloc;" & _                  ;// Minimum extra paragraphs needed
    "ushort   maxalloc;" & _                  ;// Maximum extra paragraphs needed
    "ushort   ss;" & _                        ;// Initial (relative) SS value
    "ushort   sp;" & _                        ;// Initial SP value
    "ushort   csum;" & _                      ;// Checksum
    "ushort   ip;" & _                        ;// Initial IP value
    "ushort   cs;" & _                        ;// Initial (relative) CS value
    "ushort   lfarlc;" & _                    ;// File address of relocation table
    "ushort   ovno;" & _                      ;// Overlay number
    "ushort   res[4];" & _                    ;// Reserved words
    "ushort   oemid;" & _                     ;// OEM identifier (for e_oeminfo)
    "ushort   oeminfo;" & _                   ;// OEM information; e_oemid specific
    "ushort   res2[10];" & _                  ;// Reserved words
    "dword    lfanew"                         ;// File address of new e
    If ($pByte) Then Return MRtlMoveMemory($tagIMAGE_DOS_HEADER, $pByte, 64) ;reading the dos header
    Return DllStructCreate($tagIMAGE_DOS_HEADER)
EndFunc

Func READ_SECTION($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_SECTION($hFile, $MovePos, $byteStruct)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_Data($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_Data($hFile, $MovePos, $byteStruct)
	Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_IMAGE_DOS_HEADER($hFile, $MovePos)
    Local $nBytes, $IMAGE_DOS_HEADER = CRE_IMAGE_DOS_HEADER()
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER),$nBytes)
    Return $IMAGE_DOS_HEADER
EndFunc

Func WRITE_IMAGE_DOS_HEADER($hFile, $MovePos, $IMAGE_DOS_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $nBytes)
EndFunc

Func READ_Signature($hFile, $MovePos)
    Local $nBytes, $hSignature = DllStructCreate('dword Signature')
    _WinAPI_SetFilePointer($hFile,$MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($hSignature), DllStructGetSize($hSignature), $nBytes)
    Return $hSignature
EndFunc

Func WRITE_Signature($hFile, $MovePos, $Signature)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($Signature), DllStructGetSize($Signature), $nBytes)
EndFunc

Func READ_IMAGE_FILE_HEADER($hFile, $MovePos)
    Local $nBytes, $IMAGE_FILE_HEADER = CRE_IMAGE_FILE_HEADER()
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $nBytes)
    Return $IMAGE_FILE_HEADER
EndFunc

Func WRITE_IMAGE_FILE_HEADER($hFile, $MovePos, $IMAGE_FILE_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
    Local $nBytes, $IMAGE_OPTIONAL_HEADER = CRE_IMAGE_OPTIONAL_HEADER()
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $nBytes)
    Return $IMAGE_OPTIONAL_HEADER
EndFunc

Func WRITE_IMAGE_OPTIONAL_HEADER($hFile, $MovePos, $IMAGE_OPTIONAL_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
	Local $nBytes, $IMAGE_SECTION_HEADER = CRE_IMAGE_SECTION_HEADER()
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER),$nBytes)
    Return $IMAGE_SECTION_HEADER
EndFunc

Func WRITE_IMAGE_SECTION_HEADER($hFile, $MovePos, $IMAGE_SECTION_HEADER)
    Local $nBytes
    If $MovePos <> 0 Then _WinAPI_SetFilePointer($hFile, $MovePos) 
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $nBytes)
EndFunc

Func RtlMoveMemory($pSource, $pDest, $iMemPos)
    DllCall('Kernel32.dll', 'none', 'RtlMoveMemory', 'ptr', $pSource, 'ptr', $pDest, 'dword', $iMemPos)
EndFunc

Func MRtlMoveMemory($tagSTRUCT, $pAddress, $iMemPos)
    Local $tMOVEMEMORY = DllStructCreate($tagSTRUCT)
    DllCall('Kernel32.dll', 'none', 'RtlMoveMemory', 'ptr', DllStructGetPtr($tMOVEMEMORY), 'ptr', $pAddress, 'dword', $iMemPos)
    Return $tMOVEMEMORY
EndFunc

Func _WinAPI_FileOpen($sFile,$uStyle)
    Local $tOPENFILE = DllStructCreate('byte cBytes;byte fFixedDisk;ushort nErrCode;ushort Reserved1;ushort Reserved2;char szPathName[260]')
    Local $hRet = DllCall('Kernel32.dll', 'hwnd', 'OpenFile', 'str', $sFile, 'ptr', DllStructGetPtr($tOPENFILE), 'long', $uStyle)
    If (@error) Or (Not IsArray($hRet)) Then 
		Return SetError(@error, @extended, 0)
	EndIf	
    Return $hRet[0]
EndFunc

Привёл код в порядок для лучшего понимая, но в будующем нужно его доделать чтоб небыло ни каких внешних глобальных переменных и сразу написать функции по работе с ресурсами, главное что основа есть.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Уменьшил исходник и вывел переадресацию на блок данных в отдельную функцию RELOCATION()

Код:
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>

Global $AutoitScriptCodeDataStruct = 0 ,$ImageFileName = ""
;test.exe     - Файл в который будем добавлять ресурс
;out_test.exe - Файл который у нас получится (выходной)
;1.exe        - Файл который будем добавлять в ресурсы

$hUpdate = BeginUpdateResource('test.exe', 'out_test.exe')
$hFile = _WinAPI_CreateFileEx('1.exe', $OPEN_EXISTING, $GENERIC_READ)
$iSize = _WinAPI_GetFileSize($hFile)
$tByte = DllStructCreate('byte[' & $iSize & ']')
$pByte = DllStructGetPtr($tByte)
_WinAPI_ReadFile($hFile, $pByte, $iSize, $iSize)
UpdateResource($hUpdate, 10, 'EXE1', $pByte, DllStructGetSize($tByte))
EndUpdateResource($hUpdate)

Func BeginUpdateResource($pFileName = "Autoit.exe", $OutFile = "NewExeFile.exe", $bDeleteExistingResources = False)
    Local $FullPath = ""
    If $pFileName == $OutFile Then 
        $SplitA = StringSplit($OutFile,"\")
        For $i = 1 To $SplitA[0] 
			If $i = $SplitA[0] Then 
                $FullPath &= "New_" & $SplitA[$i] 
			Else
                $FullPath &= $SplitA[$i] & "\"
            EndIf
        Next
        $OutFile = $FullPath
    EndIf
    $ImageFileName = $OutFile
	
    RELOCATION($pFileName, $OutFile)

    $ImageFileSize = FileGetSize($OutFile) ;Get Image File Size WithOut Autoit Script Code
    $AutoitFileSize = FileGetSize($pFileName) ;Get Autoit File Size With Autoit Script Code $pFileName = "Autoit.exe"
    $AutoitScriptCodeSize = $AutoitFileSize - $ImageFileSize ;Get Autoit Script Code Size
    $AutoitScriptCodeDataStruct = FileToDataStruct($pFileName, 2, $ImageFileSize, 0) ;Flag = 2 Char ;$iPos = $ImageFileSize ;$iMethod = $FILE_BEGIN 

    $aRet = DllCall('kernel32.dll', 'handle', 'BeginUpdateResource', 'str', $OutFile, 'bool', $bDeleteExistingResources)
    If (@error) Or (Not $aRet[0]) Then Return -5
	Return $aRet[0]
EndFunc

Func UpdateResource($hUpdate, $sResType, $sResName, $pData, $iData, $iResLanguage = 0)
	
    If IsString($sResType) Then
        $aResType = 'str'
        $lpType = StringUpper($sResType)
    Else
        $aResType = 'long'
        $lpType = Int($sResType)
    EndIf
	
    If IsString($sResName) Then
        $aNameType = 'str'
        $lpName = StringUpper($sResName)
    Else
        $aNameType = 'long'
        $lpName = Int($sResName)
    EndIf

    Local $aRet = DllCall('kernel32.dll', 'bool', 'UpdateResource', 'handle', $hUpdate, $aResType, $sResType, $aNameType, $sResName, 'word', $iResLanguage, 'ptr', $pData, 'dword', $iData)
    If @error Then Return 0
    Return $aRet[0]
EndFunc

Func EndUpdateResource($hUpdate, $fDiscard = False)
    Local $nBytes
    Local $aRet = DllCall("kernel32.dll", "bool", "EndUpdateResource", "handle", $hUpdate, "bool", $fDiscard)
    If (@error) Or (Not $aRet[0]) Then Return -1
    $hFile = _WinAPI_CreateFile($ImageFileName, 2, 4) ;$ImageFileName = $OutFile
    If Not($hFile) Then Return -2
    _WinAPI_SetFilePointer($hFile, 0, 2)

    $bool = _WinAPI_WriteFile($hFile, DllStructGetPtr($AutoitScriptCodeDataStruct), DllStructGetSize($AutoitScriptCodeDataStruct), $nBytes)
    If (Not $bool) Then Return -3
    _WinAPI_CloseHandle($hFile)
    Return 1
EndFunc

Func FileToDataStruct($sFile, $Flag = 1, $iPos = 0 ,$iMethod = 0)
    Local $iRead
    Local $iSize = FileGetSize($sFile)
    If (Not $iSize) Then Return -1
    Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
    If (Not $hFile) Then Return -2
    _WinAPI_SetFilePointer($hFile, $iPos, $iMethod)
	If $Flag <> 1 Then
        $DataStruct = DllStructCreate("char[" & $iSize & "]")
    Else
        $DataStruct = DllStructCreate("byte[" & $iSize & "]")
    EndIf
    $aRet = _WinAPI_ReadFile($hFile, DllStructGetPtr($DataStruct), $iSize, $iRead)
    If @error Then Return -3
    _WinAPI_CloseHandle($hFile)
    If Not $aRet Then Return -3
    Return $DataStruct
EndFunc

Func RELOCATION($sFile, $sOutFile)
	Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (@error) Or (Not $hFile) Then 
		Return SetError(-1, 0, 0)
	EndIf	
    $HFILE1 = _WinAPI_FileOpen($sOutFile, 0x00001000 + 0x00000002)
    $HFILE2 = _WinAPI_FileOpen($sOutFile, 0x00001000 + 0x00000002)
	If (Not $HFILE1) Or (Not $HFILE2) Then 
		Return SetError(-2, 0, 0)
	EndIf	
    $IMAGE_DOS_HEADER = READ_IMAGE_DOS_HEADER($hFile, 0)
    WRITE_IMAGE_DOS_HEADER($HFILE1, 0, $IMAGE_DOS_HEADER)
    $MovePos = DllStructGetData($IMAGE_DOS_HEADER, 'lfanew')
    $lfanew = $MovePos
    $Signature = READ_SIGNATURE($hFile, $MovePos)
    If DllStructGetData($Signature, 'Signature') <> 0x00004550 And DllStructGetData($Signature, 'Signature') <> 0x50450000 Then 
		Return SetError(-3, 0, 0)
	EndIf	
    WRITE_SIGNATURE($HFILE1, $MovePos, $Signature)
    $MovePos += DllStructGetSize($Signature)
    $IMAGE_FILE_HEADER = READ_IMAGE_FILE_HEADER($hFile, $MovePos)
    WRITE_IMAGE_FILE_HEADER($HFILE1, $MovePos, $IMAGE_FILE_HEADER)
    $MovePos += DllStructGetSize($IMAGE_FILE_HEADER)
    $IMAGE_OPTIONAL_HEADER = READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
    If DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x10b And DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x20b Then 
		Return SetError(-4, 0, 0)
	EndIf	
    $IMovePos = $MovePos
    WRITE_IMAGE_OPTIONAL_HEADER($HFILE1, $MovePos, $IMAGE_OPTIONAL_HEADER)
    $NumberOfSections = DllStructGetData($IMAGE_FILE_HEADER, 'NumberOfSections')
    $MovePos += DllStructGetSize($IMAGE_OPTIONAL_HEADER)
    $JMovePos = $MovePos
    $SizeOfHeaders = DllStructGetData($IMAGE_OPTIONAL_HEADER, 'SizeOfHeaders')
    ;SizeOf IMAGE_SECTION_HEADER ==> 40
    $RemainderSize = $SizeOfHeaders - ($MovePos + $NumberOfSections * 40)
    $DataPos = ($MovePos + $NumberOfSections * 40)
    $DataStruct = READ_DATA($hFile, $DataPos, $RemainderSize)
    WRITE_DATA($HFILE2, $DataPos, $DataStruct)
    For $i = 1 To $NumberOfSections
        $IMAGE_SECTION_HEADER = READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
        WRITE_IMAGE_SECTION_HEADER($HFILE1, $MovePos, $IMAGE_SECTION_HEADER)
        $PointerToRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'PointerToRawData')
        $SizeOfRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'SizeOfRawData')
        $VirtualAddress = DllStructGetData($IMAGE_SECTION_HEADER, 'VirtualAddress')
        $ByteStruct = READ_SECTION($hFile, $PointerToRawData, $SizeOfRawData)
        WRITE_SECTION($HFILE2, $PointerToRawData, $byteStruct)
        $MovePos += DllStructGetSize($IMAGE_SECTION_HEADER)
    Next
    _WinAPI_CloseHandle($hFile)
    _WinAPI_CloseHandle($HFILE1)
    _WinAPI_CloseHandle($HFILE2)
EndFunc	

Func READ_SECTION($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_SECTION($hFile, $MovePos, $byteStruct)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_DATA($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_DATA($hFile, $MovePos, $byteStruct)
	Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_IMAGE_DOS_HEADER($hFile, $MovePos)
	Local $tagIMAGE_DOS_HEADER =  'ushort magic;ushort cblp;ushort cp;ushort crlc;ushort cparhdr;ushort minalloc;' & _  
    'ushort maxalloc;ushort ss;ushort sp;ushort csum;ushort ip;ushort cs;ushort lfarlc;ushort ovno;ushort res[4];' & _  
    'ushort oemid;ushort oeminfo;ushort res2[10];dword lfanew'                         
	
    Local $nBytes, $tIMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_DOS_HEADER), DllStructGetSize($tIMAGE_DOS_HEADER),$nBytes)
    Return $tIMAGE_DOS_HEADER
EndFunc

Func WRITE_IMAGE_DOS_HEADER($hFile, $MovePos, $IMAGE_DOS_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $nBytes)
EndFunc

Func READ_SIGNATURE($hFile, $MovePos)
    Local $nBytes, $hSignature = DllStructCreate('dword Signature')
    _WinAPI_SetFilePointer($hFile,$MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($hSignature), DllStructGetSize($hSignature), $nBytes)
    Return $hSignature
EndFunc

Func WRITE_SIGNATURE($hFile, $MovePos, $Signature)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($Signature), DllStructGetSize($Signature), $nBytes)
EndFunc

Func READ_IMAGE_FILE_HEADER($hFile, $MovePos)
	Local $tagIMAGE_FILE_HEADER = 'ushort Machine;ushort NumberOfSections;dword TimeDateStamp;' & _
	'dword PointerToSymbolTable;dword NumberOfSymbols;ushort SizeOfOptionalHeader;ushort Characteristics'
	
    Local $nBytes, $tIMAGE_FILE_HEADER = DllStructCreate($tagIMAGE_FILE_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_FILE_HEADER), DllStructGetSize($tIMAGE_FILE_HEADER), $nBytes)
    Return $tIMAGE_FILE_HEADER
EndFunc

Func WRITE_IMAGE_FILE_HEADER($hFile, $MovePos, $IMAGE_FILE_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
	Local $tagIMAGE_OPTIONAL_HEADER = 'ushort Magic;ubyte MajorLinkerVersion;ubyte MinorLinkerVersion;dword SizeOfCode;' & _
    'dword SizeOfInitializedData;dword SizeOfUninitializedData;dword AddressOfEntryPoint;dword BaseOfCode;dword BaseOfData;' & _
    'dword ImageBase;dword SectionAlignment;dword FileAlignment;ushort MajorOperatingSystemVersion;ushort MinorOperatingSystemVersion;' & _
    'ushort MajorImageVersion;ushort MinorImageVersion;ushort MajorSubsystemVersion;ushort MinorSubsystemVersion;dword Win32VersionValue;' & _
    'dword SizeOfImage;dword SizeOfHeaders;dword CheckSum;ushort Subsystem;ushort DllCharacteristics;dword SizeOfStackReserve;' & _
    'dword SizeOfStackCommit;dword SizeOfHeapReserve;dword SizeOfHeapCommit;dword LoaderFlags;dword NumberOfRvaAndSizes;byte byteData[128]'
	
    Local $nBytes, $tIMAGE_OPTIONAL_HEADER = DllStructCreate($tagIMAGE_OPTIONAL_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_OPTIONAL_HEADER), DllStructGetSize($tIMAGE_OPTIONAL_HEADER), $nBytes)
    Return $tIMAGE_OPTIONAL_HEADER
EndFunc

Func WRITE_IMAGE_OPTIONAL_HEADER($hFile, $MovePos, $IMAGE_OPTIONAL_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
	Local $tagIMAGE_SECTION_HEADER = 'byte Name[8];dword Misc;dword VirtualAddress;dword SizeOfRawData;dword PointerToRawData;' & _
	'dword PointerToRelocations;dword PointerToLinenumbers;ushort NumberOfRelocations;ushort NumberOfLinenumbers;dword Characteristics'
	
	Local $nBytes, $tIMAGE_SECTION_HEADER = DllStructCreate($tagIMAGE_SECTION_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_SECTION_HEADER), DllStructGetSize($tIMAGE_SECTION_HEADER),$nBytes)
    Return $tIMAGE_SECTION_HEADER
EndFunc

Func WRITE_IMAGE_SECTION_HEADER($hFile, $MovePos, $IMAGE_SECTION_HEADER)
    Local $nBytes
    If $MovePos <> 0 Then _WinAPI_SetFilePointer($hFile, $MovePos) 
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $nBytes)
EndFunc

Func _WinAPI_FileOpen($sFile,$uStyle)
    Local $tOPENFILE = DllStructCreate('byte cBytes;byte fFixedDisk;ushort nErrCode;ushort Reserved1;ushort Reserved2;char szPathName[260]')
    Local $hRet = DllCall('Kernel32.dll', 'hwnd', 'OpenFile', 'str', $sFile, 'ptr', DllStructGetPtr($tOPENFILE), 'long', $uStyle)
    If (@error) Or (Not IsArray($hRet)) Then 
		Return SetError(@error, @extended, 0)
	EndIf	
    Return $hRet[0]
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
OffTopic:
Yashied
у тебя кажется появился примерный последователь по WinAPI 8)
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
OffTopic:

Благодарю Вас Kaster, но без вас всех и данного форума я бы ни чего не сделал кроме Hello World!!! ;D
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Две функции уже готовы AddResource() и ExtractResource()

Код:
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>

AddResource(@ScriptDir & '\test.exe', @ScriptDir & '\1.exe', 10, 'EXE1') ;~ Добавляем ресурс в файл 

Func AddResource($sFile, $sResFile, $sResType, $sResName, $sResLang = 0, $uFlag = 0)
	
	Local $OutFile = ($sFile & '.EXTMP'), $nBytes, $iRead, $uSize, $uFile, $hStruct, $hUpdate, $hFile, $iSize, $tByte, $pByte, $aFile, $nFile, $sRead

    RELOCATION($sFile, $OutFile)
	
	$uFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (Not $uFile) Then Return SetError(-1, 0, 0)
	_WinAPI_SetFilePointer($uFile, FileGetSize($OutFile), 0)
	$uSize = FileGetSize($sFile)
	If ($uFlag <> 1) Then
        $hStruct = DllStructCreate("char[" & $uSize & "]")
    Else
        $hStruct = DllStructCreate("byte[" & $uSize & "]")
    EndIf
	If _WinAPI_ReadFile($uFile, DllStructGetPtr($hStruct), $uSize, $iRead) Then
	    _WinAPI_CloseHandle($uFile)
        $hUpdate = _WinAPI_BeginUpdateResource($OutFile, False)
	    If $hUpdate Then
            $hFile = _WinAPI_CreateFileEx($sResFile, $OPEN_EXISTING, $GENERIC_READ)
            $iSize = _WinAPI_GetFileSize($hFile)
            $tByte = DllStructCreate('byte[' & $iSize & ']')
            $pByte = DllStructGetPtr($tByte)
            If _WinAPI_ReadFile($hFile, $pByte, $iSize, $iSize) Then
                If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $sResLang, $pByte, DllStructGetSize($tByte)) Then
                    _WinAPI_EndUpdateResource($hUpdate, False)
		        EndIf	
			EndIf	
	    EndIf	
	EndIf
	$aFile = _WinAPI_CreateFile($OutFile, 2, 4)
	If (Not $aFile) Then Return SetError(-3, 0, 0)
	_WinAPI_SetFilePointer($aFile, 0, 2)
	_WinAPI_WriteFile($aFile, DllStructGetPtr($hStruct), DllStructGetSize($hStruct), $nBytes)
	_WinAPI_CloseHandle($aFile)
	FileDelete($sFile)
	$nFile = FileOpen($OutFile)
	$sRead = FileRead($nFile)
	FileClose($nFile)
	FileWrite($sFile, $sRead)
	FileDelete($OutFile)
EndFunc

Func ExtractResource($hInstance, $sExtractPath, $sResType, $sResName, $iResLanguage = 0)
	Local $hResource, $aResSize, $aResLoad, $pMemRes
	
	If $iResLanguage Then
        $hResource = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hResource = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
	$iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
	$aResLoad = _WinAPI_LoadResource($hInstance, $hResource)
	$pMemRes = _WinAPI_LockResource($aResLoad)
	If @error Then
        Return SetError(@error, @extended, 0)
    EndIf
	
	$tByte = DllStructCreate('byte[' & $iSize & ']', $pMemRes)
	
	$hFile = _WinAPI_CreateFileEx($sExtractPath, $CREATE_ALWAYS, $GENERIC_WRITE)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($tByte), DllStructGetSize($tByte), $tByte)
	If $hFile Then
        _WinAPI_CloseHandle($hFile)
    EndIf
EndFunc

Func RELOCATION($sFile, $sOutFile)
	Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (@error) Or (Not $hFile) Then 
		Return SetError(-1, 0, 0)
	EndIf	
    $HFILE1 = _WinAPI_FileOpen($sOutFile, 0x00001000 + 0x00000002)
    $HFILE2 = _WinAPI_FileOpen($sOutFile, 0x00001000 + 0x00000002)
	If (Not $HFILE1) Or (Not $HFILE2) Then 
		Return SetError(-2, 0, 0)
	EndIf	
    $IMAGE_DOS_HEADER = READ_IMAGE_DOS_HEADER($hFile, 0)
    WRITE_IMAGE_DOS_HEADER($HFILE1, 0, $IMAGE_DOS_HEADER)
    $MovePos = DllStructGetData($IMAGE_DOS_HEADER, 'lfanew')
    $lfanew = $MovePos
    $Signature = READ_SIGNATURE($hFile, $MovePos)
    If DllStructGetData($Signature, 'Signature') <> 0x00004550 And DllStructGetData($Signature, 'Signature') <> 0x50450000 Then 
		Return SetError(-3, 0, 0)
	EndIf	
    WRITE_SIGNATURE($HFILE1, $MovePos, $Signature)
    $MovePos += DllStructGetSize($Signature)
    $IMAGE_FILE_HEADER = READ_IMAGE_FILE_HEADER($hFile, $MovePos)
    WRITE_IMAGE_FILE_HEADER($HFILE1, $MovePos, $IMAGE_FILE_HEADER)
    $MovePos += DllStructGetSize($IMAGE_FILE_HEADER)
    $IMAGE_OPTIONAL_HEADER = READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
    If DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x10b And DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x20b Then 
		Return SetError(-4, 0, 0)
	EndIf	
    $IMovePos = $MovePos
    WRITE_IMAGE_OPTIONAL_HEADER($HFILE1, $MovePos, $IMAGE_OPTIONAL_HEADER)
    $NumberOfSections = DllStructGetData($IMAGE_FILE_HEADER, 'NumberOfSections')
    $MovePos += DllStructGetSize($IMAGE_OPTIONAL_HEADER)
    $JMovePos = $MovePos
    $SizeOfHeaders = DllStructGetData($IMAGE_OPTIONAL_HEADER, 'SizeOfHeaders')
    ;SizeOf IMAGE_SECTION_HEADER ==> 40
    $RemainderSize = $SizeOfHeaders - ($MovePos + $NumberOfSections * 40)
    $DataPos = ($MovePos + $NumberOfSections * 40)
    $DataStruct = READ_DATA($hFile, $DataPos, $RemainderSize)
    WRITE_DATA($HFILE2, $DataPos, $DataStruct)
    For $i = 1 To $NumberOfSections
        $IMAGE_SECTION_HEADER = READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
        WRITE_IMAGE_SECTION_HEADER($HFILE1, $MovePos, $IMAGE_SECTION_HEADER)
        $PointerToRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'PointerToRawData')
        $SizeOfRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'SizeOfRawData')
        $VirtualAddress = DllStructGetData($IMAGE_SECTION_HEADER, 'VirtualAddress')
        $ByteStruct = READ_SECTION($hFile, $PointerToRawData, $SizeOfRawData)
        WRITE_SECTION($HFILE2, $PointerToRawData, $byteStruct)
        $MovePos += DllStructGetSize($IMAGE_SECTION_HEADER)
    Next
    _WinAPI_CloseHandle($hFile)
    _WinAPI_CloseHandle($HFILE1)
    _WinAPI_CloseHandle($HFILE2)
EndFunc	

Func READ_SECTION($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_SECTION($hFile, $MovePos, $byteStruct)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_DATA($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_DATA($hFile, $MovePos, $byteStruct)
	Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_IMAGE_DOS_HEADER($hFile, $MovePos)
	Local $tagIMAGE_DOS_HEADER =  'ushort magic;ushort cblp;ushort cp;ushort crlc;ushort cparhdr;ushort minalloc;' & _  
    'ushort maxalloc;ushort ss;ushort sp;ushort csum;ushort ip;ushort cs;ushort lfarlc;ushort ovno;ushort res[4];' & _  
    'ushort oemid;ushort oeminfo;ushort res2[10];dword lfanew'                         
	
    Local $nBytes, $tIMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_DOS_HEADER), DllStructGetSize($tIMAGE_DOS_HEADER),$nBytes)
    Return $tIMAGE_DOS_HEADER
EndFunc

Func WRITE_IMAGE_DOS_HEADER($hFile, $MovePos, $IMAGE_DOS_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $nBytes)
EndFunc

Func READ_SIGNATURE($hFile, $MovePos)
    Local $nBytes, $hSignature = DllStructCreate('dword Signature')
    _WinAPI_SetFilePointer($hFile,$MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($hSignature), DllStructGetSize($hSignature), $nBytes)
    Return $hSignature
EndFunc

Func WRITE_SIGNATURE($hFile, $MovePos, $Signature)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($Signature), DllStructGetSize($Signature), $nBytes)
EndFunc

Func READ_IMAGE_FILE_HEADER($hFile, $MovePos)
	Local $tagIMAGE_FILE_HEADER = 'ushort Machine;ushort NumberOfSections;dword TimeDateStamp;' & _
	'dword PointerToSymbolTable;dword NumberOfSymbols;ushort SizeOfOptionalHeader;ushort Characteristics'
	
    Local $nBytes, $tIMAGE_FILE_HEADER = DllStructCreate($tagIMAGE_FILE_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_FILE_HEADER), DllStructGetSize($tIMAGE_FILE_HEADER), $nBytes)
    Return $tIMAGE_FILE_HEADER
EndFunc

Func WRITE_IMAGE_FILE_HEADER($hFile, $MovePos, $IMAGE_FILE_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
	Local $tagIMAGE_OPTIONAL_HEADER = 'ushort Magic;ubyte MajorLinkerVersion;ubyte MinorLinkerVersion;dword SizeOfCode;' & _
    'dword SizeOfInitializedData;dword SizeOfUninitializedData;dword AddressOfEntryPoint;dword BaseOfCode;dword BaseOfData;' & _
    'dword ImageBase;dword SectionAlignment;dword FileAlignment;ushort MajorOperatingSystemVersion;ushort MinorOperatingSystemVersion;' & _
    'ushort MajorImageVersion;ushort MinorImageVersion;ushort MajorSubsystemVersion;ushort MinorSubsystemVersion;dword Win32VersionValue;' & _
    'dword SizeOfImage;dword SizeOfHeaders;dword CheckSum;ushort Subsystem;ushort DllCharacteristics;dword SizeOfStackReserve;' & _
    'dword SizeOfStackCommit;dword SizeOfHeapReserve;dword SizeOfHeapCommit;dword LoaderFlags;dword NumberOfRvaAndSizes;byte byteData[128]'
	
    Local $nBytes, $tIMAGE_OPTIONAL_HEADER = DllStructCreate($tagIMAGE_OPTIONAL_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_OPTIONAL_HEADER), DllStructGetSize($tIMAGE_OPTIONAL_HEADER), $nBytes)
    Return $tIMAGE_OPTIONAL_HEADER
EndFunc

Func WRITE_IMAGE_OPTIONAL_HEADER($hFile, $MovePos, $IMAGE_OPTIONAL_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
	Local $tagIMAGE_SECTION_HEADER = 'byte Name[8];dword Misc;dword VirtualAddress;dword SizeOfRawData;dword PointerToRawData;' & _
	'dword PointerToRelocations;dword PointerToLinenumbers;ushort NumberOfRelocations;ushort NumberOfLinenumbers;dword Characteristics'
	
	Local $nBytes, $tIMAGE_SECTION_HEADER = DllStructCreate($tagIMAGE_SECTION_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_SECTION_HEADER), DllStructGetSize($tIMAGE_SECTION_HEADER),$nBytes)
    Return $tIMAGE_SECTION_HEADER
EndFunc

Func WRITE_IMAGE_SECTION_HEADER($hFile, $MovePos, $IMAGE_SECTION_HEADER)
    Local $nBytes
    If $MovePos <> 0 Then _WinAPI_SetFilePointer($hFile, $MovePos) 
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $nBytes)
EndFunc

Func _WinAPI_FileOpen($sFile,$uStyle)
    Local $tOPENFILE = DllStructCreate('byte cBytes;byte fFixedDisk;ushort nErrCode;ushort Reserved1;ushort Reserved2;char szPathName[260]')
    Local $hRet = DllCall('Kernel32.dll', 'hwnd', 'OpenFile', 'str', $sFile, 'ptr', DllStructGetPtr($tOPENFILE), 'long', $uStyle)
    If (@error) Or (Not IsArray($hRet)) Then 
		Return SetError(@error, @extended, 0)
	EndIf	
    Return $hRet[0]
EndFunc

Только нужно будет внести поправки, так как работают с ресурсами типа RCDATA и User-defined, думаю стоит отметить тему решённой, в каком то смысле проблема решена.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Viktor1703 сказал(а):
Код:
$tagIMAGE_DOS_HEADER =  'ushort magic...

Не нравится мне переменные типа "magic"... Должно же быть где-то описание...

P.S

Хорошо бы еще упростить... А вообще, если не лень, то создай отдельную темку в "Полезняшках" и опиши по пунктам как и что нужно сделать для добавления ресурсов в скомпилированный AutoIt скрипт. Ну, типа как я писал "FAQ по использованию ресурсов в AutoIt ". Думаю многим было бы интересно.

:smile:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
C:\Users\11111111111111\Desktop\qaz.au3(26,48) : ERROR: _WinAPI_GetFileSize(): undefined function.
 $iSize = _WinAPI_GetFileSize($hFile)

WinApiEx.au3 последний..почему ошибка?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Александр сказал(а):
WinApiEx.au3 последний..почему ошибка?

Потому что он использовал не последний. Замени на _WinAPI_GetFileSizeEx().
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Yashied, сделал описание структур и поэтапное описание RELOCATION(), убрал лишние переменные и не задействованные функции.

Код:
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>

AddResource(@ScriptDir & '\test.exe', @ScriptDir & '\1.exe', 10, 'EXE1') ;~ Добавляем ресурс в файл 

Func AddResource($sFile, $sResFile, $sResType, $sResName, $sResLang = 0, $uFlag = 0)
	
	Local $OutFile = ($sFile & '.EXTMP'), $nBytes, $iRead, $uSize, $uFile, $hStruct, $hUpdate, $hFile, $iSize, $tByte, $pByte, $aFile, $nFile, $sRead

    RELOCATION($sFile, $OutFile) 
	
	$uFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (Not $uFile) Then Return SetError(-1, 0, 0)
	_WinAPI_SetFilePointer($uFile, FileGetSize($OutFile), 0)
	$uSize = FileGetSize($sFile)
	If ($uFlag <> 1) Then
        $hStruct = DllStructCreate("char[" & $uSize & "]")
    Else
        $hStruct = DllStructCreate("byte[" & $uSize & "]")
    EndIf
	If _WinAPI_ReadFile($uFile, DllStructGetPtr($hStruct), $uSize, $iRead) Then
	    _WinAPI_CloseHandle($uFile)
        $hUpdate = _WinAPI_BeginUpdateResource($OutFile, False)
	    If $hUpdate Then
            $hFile = _WinAPI_CreateFileEx($sResFile, $OPEN_EXISTING, $GENERIC_READ)
            $iSize = _WinAPI_GetFileSize($hFile)
            $tByte = DllStructCreate('byte[' & $iSize & ']')
            $pByte = DllStructGetPtr($tByte)
            If _WinAPI_ReadFile($hFile, $pByte, $iSize, $iSize) Then
                If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $sResLang, $pByte, DllStructGetSize($tByte)) Then
                    _WinAPI_EndUpdateResource($hUpdate, False)
		        EndIf	
			EndIf	
	    EndIf	
	EndIf
	$aFile = _WinAPI_CreateFile($OutFile, 2, 4)
	If (Not $aFile) Then Return SetError(-3, 0, 0)
	_WinAPI_SetFilePointer($aFile, 0, 2)
	_WinAPI_WriteFile($aFile, DllStructGetPtr($hStruct), DllStructGetSize($hStruct), $nBytes)
	_WinAPI_CloseHandle($aFile)
	FileDelete($sFile)
	$nFile = FileOpen($OutFile)
	$sRead = FileRead($nFile)
	FileClose($nFile)
	FileWrite($sFile, $sRead)
	FileDelete($OutFile)
EndFunc

Func ExtractResource($hInstance, $sExtractPath, $sResType, $sResName, $iResLanguage = 0)
	Local $hResource, $aResSize, $aResLoad, $pMemRes
	
	If $iResLanguage Then
        $hResource = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hResource = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
	$iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
	$aResLoad = _WinAPI_LoadResource($hInstance, $hResource)
	$pMemRes = _WinAPI_LockResource($aResLoad)
	If @error Then
        Return SetError(@error, @extended, 0)
    EndIf
	
	$tByte = DllStructCreate('byte[' & $iSize & ']', $pMemRes)
	
	$hFile = _WinAPI_CreateFileEx($sExtractPath, $CREATE_ALWAYS, $GENERIC_WRITE)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($tByte), DllStructGetSize($tByte), $tByte)
	If $hFile Then
        _WinAPI_CloseHandle($hFile)
    EndIf
EndFunc

Func RELOCATION($sFile, $sOutFile)
	Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (@error) Or (Not $hFile) Then 
		Return SetError(-1, 0, 0)
	EndIf	
    Local $hFileOut = _WinAPI_FileOpen($sOutFile, 0x00001000 + 0x00000002)
	If (Not $hFileOut) Then 
		Return SetError(-2, 0, 0)
	EndIf	
    $IMAGE_DOS_HEADER = READ_IMAGE_DOS_HEADER($hFile, 0) ;~ Извлекаем структуры IMAGE_DOS_HEADER из исходного файла
    WRITE_IMAGE_DOS_HEADER($hFileOut, 0, $IMAGE_DOS_HEADER) ;~ Записываем структуру IMAGE_DOS_HEADER в новый файл
    $iAddress = DllStructGetData($IMAGE_DOS_HEADER, 'lfanew') ;~ Достаём адрес таблицы
    $Signature = READ_SIGNATURE($hFile, $iAddress) ;~ Извлекаем сигнатуру файла
    If DllStructGetData($Signature, 'Signature') <> 0x00004550 And DllStructGetData($Signature, 'Signature') <> 0x50450000 Then ;~ проверяем, если сигнатура не равна PE то возвращаем ошибку
		Return SetError(-3, 0, 0)
	EndIf	
    WRITE_SIGNATURE($hFileOut, $iAddress, $Signature) ;~ Пишем в новый файл сигнатуру по адрессу таблицы
    $iAddress += DllStructGetSize($Signature) ;~ Прибавляем к адресу таблицы размер сигнатуры
    $IMAGE_FILE_HEADER = READ_IMAGE_FILE_HEADER($hFile, $iAddress) ;~ Заполняем структуру IMAGE_FILE_HEADER, считываем по адресу (Таблица + сигнатура)
    WRITE_IMAGE_FILE_HEADER($hFileOut, $iAddress, $IMAGE_FILE_HEADER) ;~ Записываем в новый файл структуру IMAGE_FILE_HEADER
    $iAddress += DllStructGetSize($IMAGE_FILE_HEADER) ;~ Прибавляем ((таблица + сигнатура) + размер IMAGE_FILE_HEADER)
    $IMAGE_OPTIONAL_HEADER = READ_IMAGE_OPTIONAL_HEADER($hFile, $iAddress) ;~ Заполняем структуру IMAGE_OPTIONAL_HEADER
    If DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x10b And DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x20b Then ;~ Проверяем магическое число, если 0x10b и 0x20b то файл является исполняемым 
		Return SetError(-4, 0, 0)
	EndIf	
    WRITE_IMAGE_OPTIONAL_HEADER($hFileOut, $iAddress, $IMAGE_OPTIONAL_HEADER) ;~ Записываем в новый файл структуру IMAGE_OPTIONAL_HEADER
    $NumberOfSections = DllStructGetData($IMAGE_FILE_HEADER, 'NumberOfSections') ;~ Возвращяем число секций
    $iAddress += DllStructGetSize($IMAGE_OPTIONAL_HEADER) ;~ Прибавляем размер структуры
    $SizeOfHeaders = DllStructGetData($IMAGE_OPTIONAL_HEADER, 'SizeOfHeaders') ;~ Размер заголовка
    ;SizeOf IMAGE_SECTION_HEADER ==> 40
    $RemainderSize = $SizeOfHeaders - ($iAddress + $NumberOfSections * 40) ;~ Размер заголовка - (адресс + колличество секций и * на размер IMAGE_SECTION_HEADER = ( 40 ))
    $DataPos = ($iAddress + $NumberOfSections * 40)
    $DataStruct = READ_DATA($hFile, $DataPos, $RemainderSize) ;~ Считываем данные 
    WRITE_DATA($hFileOut, $DataPos, $DataStruct) ;~ Записываем в новый файл 
    For $i = 1 To $NumberOfSections 
		;~ Пишется столько раз, сколько существует секций 
        $IMAGE_SECTION_HEADER = READ_IMAGE_SECTION_HEADER($hFile, $iAddress) ;~ Считываем IMAGE_SECTION_HEADER из файла
        WRITE_IMAGE_SECTION_HEADER($hFileOut, $iAddress, $IMAGE_SECTION_HEADER) ;~ Записываем в новый файл IMAGE_SECTION_HEADER 
        $PointerToRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'PointerToRawData') ;~ Указатель на первую страницу в файл COFF.
        $SizeOfRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'SizeOfRawData') ;~ Размер инициализированных данных на диске в байтах.
        $VirtualAddress = DllStructGetData($IMAGE_SECTION_HEADER, 'VirtualAddress') ;~ Адрес первого байта раздела при загрузке в память
        $ByteStruct = READ_SECTION($hFile, $PointerToRawData, $SizeOfRawData) ;~ Считываем секцию
        WRITE_SECTION($hFileOut, $PointerToRawData, $byteStruct) ;~ Записываем в новый файл секцию 
        $iAddress += DllStructGetSize($IMAGE_SECTION_HEADER)
    Next
    _WinAPI_CloseHandle($hFile)
    _WinAPI_CloseHandle($hFileOut)
EndFunc	

Func READ_SECTION($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_SECTION($hFile, $MovePos, $byteStruct)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_DATA($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_DATA($hFile, $MovePos, $byteStruct)
	Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_IMAGE_DOS_HEADER($hFile, $MovePos)
	Local $tagIMAGE_DOS_HEADER =  '' & _
	'ushort magic;' & _        ;// Сигнатура заголовка
	'ushort cblp;' & _         ;// количество байт на последней странице файла
	'ushort cp;' & _           ;// количество страниц в файле
	'ushort crlc;' & _         ;// Relocations
	'ushort cparhdr;' & _      ;// Размер заголовка в параграфах
	'ushort minalloc;' & _     ;// Минимальные дополнительные параграфы
    'ushort maxalloc;' & _     ;// Максимальные дополнительные параграфы
	'ushort ss;' & _           ;// начальное относительное значение регистра SS
	'ushort sp;' & _           ;// начальное значение регистра SP
	'ushort csum;' & _         ;// контрольная сумма
	'ushort ip;' & _           ;// начальное значение регистра IP
	'ushort cs;' & _           ;// начальное относительное значение регистра CS
	'ushort lfarlc;' & _       ;// адрес в файле на таблицу переадресации
	'ushort ovno;' & _         ;// количество оверлеев
	'ushort res[4];' & _       ;// Зарезервировано
    'ushort oemid;' & _        ;// OEM идентифкатор
	'ushort oeminfo;' & _      ;// OEM информация
	'ushort res2[10];' & _     ;// Зарезервировано
	'dword lfanew'             ;// адрес в файле нового .exe заголовка (PE)            
	
    Local $nBytes, $tIMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_DOS_HEADER), DllStructGetSize($tIMAGE_DOS_HEADER),$nBytes)
    Return $tIMAGE_DOS_HEADER
EndFunc

Func WRITE_IMAGE_DOS_HEADER($hFile, $MovePos, $IMAGE_DOS_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $nBytes)
EndFunc

Func READ_SIGNATURE($hFile, $MovePos)
    Local $nBytes, $hSignature = DllStructCreate('dword Signature')
    _WinAPI_SetFilePointer($hFile,$MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($hSignature), DllStructGetSize($hSignature), $nBytes)
    Return $hSignature
EndFunc

Func WRITE_SIGNATURE($hFile, $MovePos, $Signature)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($Signature), DllStructGetSize($Signature), $nBytes)
EndFunc

Func READ_IMAGE_FILE_HEADER($hFile, $MovePos)
	Local $tagIMAGE_FILE_HEADER = '' & _
	'ushort Machine;' & _                 ;// Машина
	'ushort NumberOfSections;' & _        ;// Колличество секторов
	'dword TimeDateStamp;' & _            ;// Временной штамп
	'dword PointerToSymbolTable;' & _     ;// Указатель на таблицу символов
	'dword NumberOfSymbols;' & _          ;// Колличество символов
	'ushort SizeOfOptionalHeader;' & _    ;// Размер дополнительного заголовка
	'ushort Characteristics'              ;// Характеристики
	
    Local $nBytes, $tIMAGE_FILE_HEADER = DllStructCreate($tagIMAGE_FILE_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_FILE_HEADER), DllStructGetSize($tIMAGE_FILE_HEADER), $nBytes)
    Return $tIMAGE_FILE_HEADER
EndFunc

Func WRITE_IMAGE_FILE_HEADER($hFile, $MovePos, $IMAGE_FILE_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
	Local $tagIMAGE_OPTIONAL_HEADER = '' & _
	'ushort Magic;' & _                       ;// Тип файла
	'ubyte MajorLinkerVersion;' & _           ;// Основной номер версии компоновщика
	'ubyte MinorLinkerVersion;' & _           ;// Дополнительный номер версии компоновщика
	'dword SizeOfCode;' & _                   ;// Размер кода раздела, в байтах, или сумма всех таких участков, если есть несколько разделов кода.
    'dword SizeOfInitializedData;' & _        ;// Размер инициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько разделов инициализируется данными.
	'dword SizeOfUninitializedData;' & _      ;// Размер неинициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько неинициализированных данных разделов.
	'dword AddressOfEntryPoint;' & _          ;// Указатель на точку входа
	'dword BaseOfCode;' & _                   ;// Указатель на начало секции кода
	'dword BaseOfData;' & _                   ;// Указатель на начало секции данных
    'dword ImageBase;' & _                    ;// Предпочтительный адрес первого байта изображения при загрузке в память. Это значение является кратной 64 байт. Значение по умолчанию для библиотек DLL 0x10000000. Значение по умолчанию для приложений 0x00400000, за исключением Windows CE, где 0x00010000.
	'dword SectionAlignment;' & _             ;// Выравнивание разделов загруженых в память, в байтах (Должно быть больше или равна FileAlignment) 
	'dword FileAlignment;' & _                ;// Согласование исходных данных разделов в файл изображения в байтах.
	'ushort MajorOperatingSystemVersion;' & _ ;// Основной номер версии необходимых операционной системы.
	'ushort MinorOperatingSystemVersion;' & _ ;// Дополнительный номер версии необходимых операционной системы.
    'ushort MajorImageVersion;' & _           ;// Основной номер версии изображения.
	'ushort MinorImageVersion;' & _           ;// Младший номер версии изображения.
	'ushort MajorSubsystemVersion;' & _       ;// Основной номер версии подсистемы.
	'ushort MinorSubsystemVersion;' & _       ;// Дополнительный номер версии подсистемы.
	'dword Win32VersionValue;' & _            ;// Зарезервирован и и должен быть 0.
    'dword SizeOfImage;' & _                  ;// Размер изображения в байтах, включая все заголовки. Должна быть кратна SectionAlignment.
	'dword SizeOfHeaders;' & _                ;// Общий размер из пунктов, округляется до кратного значения, указанного в FileAlignment
	'dword CheckSum;' & _                     ;// Контрольная сумма файла изображения. 
	'ushort Subsystem;' & _                   ;// Подсистемы, необходимые для запуска этого образа.
	'ushort DllCharacteristics;' & _          ;// DLL характеристики изображения.
	'dword SizeOfStackReserve;' & _           ;// Количество байт, резерв для стека.
    'dword SizeOfStackCommit;' & _            ;// Количество байт для совершения в стеке.
	'dword SizeOfHeapReserve;' & _            ;// Количество байт, резерв для локальной массы
	'dword SizeOfHeapCommit;' & _             ;// Количество байт для совершения в локальной массе
	'dword LoaderFlags;' & _                  ;// Этот элемент является устаревшим.
	'dword NumberOfRvaAndSizes;' & _          ;// Количество каталогов в оставшейся части дополнительного заголовка. Каждая запись описывает расположение и размер.
	'byte byteData[128]'                      ;// 
	
    Local $nBytes, $tIMAGE_OPTIONAL_HEADER = DllStructCreate($tagIMAGE_OPTIONAL_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_OPTIONAL_HEADER), DllStructGetSize($tIMAGE_OPTIONAL_HEADER), $nBytes)
    Return $tIMAGE_OPTIONAL_HEADER
EndFunc

Func WRITE_IMAGE_OPTIONAL_HEADER($hFile, $MovePos, $IMAGE_OPTIONAL_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
	Local $tagIMAGE_SECTION_HEADER = '' & _
	'byte Name[8];' & _                       ;// Имя секции
	'dword Misc;' & _                         ;// Виртуальный размер
	'dword VirtualAddress;' & _               ;// Виртуальный адресс
	'dword SizeOfRawData;' & _                ;// Размер RAW данных
	'dword PointerToRawData;' & _             ;// Указатель на RAW данные
	'dword PointerToRelocations;' & _         ;// Указатель на релокейшены
	'dword PointerToLinenumbers;' & _         ;// Указатель на номера строк
	'ushort NumberOfRelocations;' & _         ;// Колличество релокейшенов
	'ushort NumberOfLinenumbers;' & _         ;// Колличество номеров строк
	'dword Characteristics'                   ;// Характеристики
	
	Local $nBytes, $tIMAGE_SECTION_HEADER = DllStructCreate($tagIMAGE_SECTION_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_SECTION_HEADER), DllStructGetSize($tIMAGE_SECTION_HEADER),$nBytes)
    Return $tIMAGE_SECTION_HEADER
EndFunc

Func WRITE_IMAGE_SECTION_HEADER($hFile, $MovePos, $IMAGE_SECTION_HEADER)
    Local $nBytes
    If $MovePos <> 0 Then _WinAPI_SetFilePointer($hFile, $MovePos) 
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $nBytes)
EndFunc

Func _WinAPI_FileOpen($sFile,$uStyle)
    Local $tOPENFILE = DllStructCreate('byte cBytes;byte fFixedDisk;ushort nErrCode;ushort Reserved1;ushort Reserved2;char szPathName[260]')
    Local $hRet = DllCall('Kernel32.dll', 'hwnd', 'OpenFile', 'str', $sFile, 'ptr', DllStructGetPtr($tOPENFILE), 'long', $uStyle)
    If (@error) Or (Not IsArray($hRet)) Then 
		Return SetError(@error, @extended, 0)
	EndIf	
    Return $hRet[0]
EndFunc


Добавлено:
Сообщение автоматически объединено:

Добавил функцию для удаления ресурса из EXE файла или всего каталога

Код:
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>

AddResource(@ScriptDir & '\test.exe', @ScriptDir & '\1.exe', 10, 'EXE1') ;~ Добавляем ресурс в файл 
RemoveResource(@ScriptDir & '\test.exe', 14) ;~ Удаляем иконки


Func AddResource($sFile, $sResFile, $sResType, $sResName, $sResLang = 0, $uFlag = 0)
	
	Local $OutFile = ($sFile & '.EXTMP'), $nBytes, $iRead, $uSize, $uFile, $hStruct, $hUpdate, $hFile, $iSize, $tByte, $pByte, $aFile, $nFile, $sRead

    Relocation($sFile, $OutFile) 
	
	$uFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (Not $uFile) Then Return SetError(-1, 0, 0)
	_WinAPI_SetFilePointer($uFile, FileGetSize($OutFile), 0)
	$uSize = FileGetSize($sFile)
	If ($uFlag <> 1) Then
        $hStruct = DllStructCreate("char[" & $uSize & "]")
    Else
        $hStruct = DllStructCreate("byte[" & $uSize & "]")
    EndIf
	If _WinAPI_ReadFile($uFile, DllStructGetPtr($hStruct), $uSize, $iRead) Then
	    _WinAPI_CloseHandle($uFile)
        $hUpdate = _WinAPI_BeginUpdateResource($OutFile, False)
	    If $hUpdate Then
            $hFile = _WinAPI_CreateFileEx($sResFile, $OPEN_EXISTING, $GENERIC_READ)
            $iSize = _WinAPI_GetFileSize($hFile)
            $tByte = DllStructCreate('byte[' & $iSize & ']')
            $pByte = DllStructGetPtr($tByte)
            If _WinAPI_ReadFile($hFile, $pByte, $iSize, $iSize) Then
                If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $sResLang, $pByte, DllStructGetSize($tByte)) Then
                    _WinAPI_EndUpdateResource($hUpdate, False)
		        EndIf	
			EndIf	
	    EndIf	
	EndIf
	$aFile = _WinAPI_CreateFile($OutFile, 2, 4)
	If (Not $aFile) Then Return SetError(-3, 0, 0)
	_WinAPI_SetFilePointer($aFile, 0, 2)
	_WinAPI_WriteFile($aFile, DllStructGetPtr($hStruct), DllStructGetSize($hStruct), $nBytes)
	_WinAPI_CloseHandle($aFile)
	FileDelete($sFile)
	$nFile = FileOpen($OutFile)
	$sRead = FileRead($nFile)
	FileClose($nFile)
	FileWrite($sFile, $sRead)
	FileDelete($OutFile)
EndFunc

Func RemoveResource($sFile, $sResType, $sResName = '', $sResLang = 0)
	
	Local $OutFile = ($sFile & '.EXTMP')

    Relocation($sFile, $OutFile) 
	
	Local $hSourceFile = _WinAPI_CreateFile($sFile, 2, 2)
	If $hSourceFile Then
	    _WinAPI_SetFilePointer($hSourceFile, FileGetSize($OutFile), 0)
	    Local $hByte = DllStructCreate("byte[" & FileGetSize($sFile) & "]")
		Local $pByte = DllStructGetPtr($hByte)
		Local $iSize = DllStructGetSize($hByte)
	    If Not _WinAPI_ReadFile($hSourceFile, $pByte, $iSize, 0) Then 
			Return SetError(-1, 0, 0)
		EndIf	
	    _WinAPI_CloseHandle($hSourceFile)
		
		Local $hUpdate = _WinAPI_BeginUpdateResource($OutFile, False)
	    If $hUpdate Then
			If $sResName <> '' Then
		        If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $sResLang, 0, 0) Then
			        _WinAPI_EndUpdateResource($hUpdate, False)
		        EndIf
            Else
				Local $hLoadLibrary = _WinAPI_LoadLibraryEx($sFile, $LOAD_LIBRARY_AS_DATAFILE)
                Local $sEnumName = _WinAPI_EnumResourceNames($hLoadLibrary, $sResType)
                For $i = 0 To UBound($sEnumName) -1
					Local $sEnumLang = _WinAPI_EnumResourceLanguages($hLoadLibrary, $sResType, $sEnumName[$i])
					For $l = 0 To UBound($sEnumLang) -1
                        _WinAPI_UpdateResource($hUpdate, $sResType, $sEnumName[$i], $sEnumLang[$l], 0, 0)
					Next	
                Next
				_WinAPI_EndUpdateResource($hUpdate, False)
				_WinAPI_FreeLibrary($hLoadLibrary)
			EndIF	
	    EndIf	

	    Local $hDestFile = _WinAPI_CreateFile($OutFile, 2, 4)
	    If $hDestFile Then 
	        _WinAPI_SetFilePointer($hDestFile, 0, 2)
	        If Not _WinAPI_WriteFile($hDestFile, $pByte, $iSize, 0) Then
			    Return SetError(-2, 0, 0)
			EndIf	
	        _WinAPI_CloseHandle($hDestFile)
		EndIf
    EndIf
	
    FileDelete($sFile)
	$nFile = FileOpen($OutFile)
	$sRead = FileRead($nFile)
	FileClose($nFile)
	FileWrite($sFile, $sRead)
	FileDelete($OutFile)
EndFunc	

Func ExtractResource($hInstance, $sExtractPath, $sResType, $sResName, $iResLanguage = 0)
	Local $hResource, $aResSize, $aResLoad, $pMemRes
	
	If $iResLanguage Then
        $hResource = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hResource = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
	$iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
	$aResLoad = _WinAPI_LoadResource($hInstance, $hResource)
	$pMemRes = _WinAPI_LockResource($aResLoad)
	If @error Then
        Return SetError(@error, @extended, 0)
    EndIf
	
	$tByte = DllStructCreate('byte[' & $iSize & ']', $pMemRes)
	
	$hFile = _WinAPI_CreateFileEx($sExtractPath, $CREATE_ALWAYS, $GENERIC_WRITE)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($tByte), DllStructGetSize($tByte), $tByte)
	If $hFile Then
        _WinAPI_CloseHandle($hFile)
    EndIf
EndFunc


Func Relocation($sFile, $sOutFile)
	Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (@error) Or (Not $hFile) Then 
		Return SetError(-1, 0, 0)
	EndIf	
    Local $hFileOut = _WinAPI_FileOpen($sOutFile, 0x00001000 + 0x00000002)
	If (Not $hFileOut) Then 
		Return SetError(-2, 0, 0)
	EndIf	
    $IMAGE_DOS_HEADER = READ_IMAGE_DOS_HEADER($hFile, 0) ;~ Извлекаем структуры IMAGE_DOS_HEADER из исходного файла
    WRITE_IMAGE_DOS_HEADER($hFileOut, 0, $IMAGE_DOS_HEADER) ;~ Записываем структуру IMAGE_DOS_HEADER в новый файл
    $iAddress = DllStructGetData($IMAGE_DOS_HEADER, 'lfanew') ;~ Достаём адрес таблицы
    $Signature = READ_SIGNATURE($hFile, $iAddress) ;~ Извлекаем сигнатуру файла
    If DllStructGetData($Signature, 'Signature') <> 0x00004550 And DllStructGetData($Signature, 'Signature') <> 0x50450000 Then ;~ проверяем, если сигнатура не равна PE то возвращаем ошибку
		Return SetError(-3, 0, 0)
	EndIf	
    WRITE_SIGNATURE($hFileOut, $iAddress, $Signature) ;~ Пишем в новый файл сигнатуру по адрессу таблицы
    $iAddress += DllStructGetSize($Signature) ;~ Прибавляем к адресу таблицы размер сигнатуры
    $IMAGE_FILE_HEADER = READ_IMAGE_FILE_HEADER($hFile, $iAddress) ;~ Заполняем структуру IMAGE_FILE_HEADER, считываем по адресу (Таблица + сигнатура)
    WRITE_IMAGE_FILE_HEADER($hFileOut, $iAddress, $IMAGE_FILE_HEADER) ;~ Записываем в новый файл структуру IMAGE_FILE_HEADER
    $iAddress += DllStructGetSize($IMAGE_FILE_HEADER) ;~ Прибавляем ((таблица + сигнатура) + размер IMAGE_FILE_HEADER)
    $IMAGE_OPTIONAL_HEADER = READ_IMAGE_OPTIONAL_HEADER($hFile, $iAddress) ;~ Заполняем структуру IMAGE_OPTIONAL_HEADER
    If DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x10b And DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x20b Then ;~ Проверяем магическое число, если 0x10b и 0x20b то файл является исполняемым 
		Return SetError(-4, 0, 0)
	EndIf	
    WRITE_IMAGE_OPTIONAL_HEADER($hFileOut, $iAddress, $IMAGE_OPTIONAL_HEADER) ;~ Записываем в новый файл структуру IMAGE_OPTIONAL_HEADER
    $NumberOfSections = DllStructGetData($IMAGE_FILE_HEADER, 'NumberOfSections') ;~ Возвращяем число секций
    $iAddress += DllStructGetSize($IMAGE_OPTIONAL_HEADER) ;~ Прибавляем размер структуры
    $SizeOfHeaders = DllStructGetData($IMAGE_OPTIONAL_HEADER, 'SizeOfHeaders') ;~ Размер заголовка
    ;SizeOf IMAGE_SECTION_HEADER ==> 40
    $RemainderSize = $SizeOfHeaders - ($iAddress + $NumberOfSections * 40) ;~ Размер заголовка - (адресс + колличество секций и * на размер IMAGE_SECTION_HEADER = ( 40 ))
    $DataPos = ($iAddress + $NumberOfSections * 40)
    $DataStruct = READ_DATA($hFile, $DataPos, $RemainderSize) ;~ Считываем данные 
    WRITE_DATA($hFileOut, $DataPos, $DataStruct) ;~ Записываем в новый файл 
    For $i = 1 To $NumberOfSections 
		;~ Пишется столько раз, сколько существует секций 
        $IMAGE_SECTION_HEADER = READ_IMAGE_SECTION_HEADER($hFile, $iAddress) ;~ Считываем IMAGE_SECTION_HEADER из файла
        WRITE_IMAGE_SECTION_HEADER($hFileOut, $iAddress, $IMAGE_SECTION_HEADER) ;~ Записываем в новый файл IMAGE_SECTION_HEADER 
        $PointerToRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'PointerToRawData') ;~ Указатель на первую страницу в файл COFF.
        $SizeOfRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'SizeOfRawData') ;~ Размер инициализированных данных на диске в байтах.
        $VirtualAddress = DllStructGetData($IMAGE_SECTION_HEADER, 'VirtualAddress') ;~ Адрес первого байта раздела при загрузке в память
        $ByteStruct = READ_SECTION($hFile, $PointerToRawData, $SizeOfRawData) ;~ Считываем секцию
        WRITE_SECTION($hFileOut, $PointerToRawData, $byteStruct) ;~ Записываем в новый файл секцию 
        $iAddress += DllStructGetSize($IMAGE_SECTION_HEADER)
    Next
    _WinAPI_CloseHandle($hFile)
    _WinAPI_CloseHandle($hFileOut)
EndFunc	

Func READ_SECTION($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_SECTION($hFile, $MovePos, $byteStruct)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_DATA($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointer($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_DATA($hFile, $MovePos, $byteStruct)
	Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_IMAGE_DOS_HEADER($hFile, $MovePos)
	Local $tagIMAGE_DOS_HEADER =  '' & _
	'ushort magic;' & _        ;// Сигнатура заголовка
	'ushort cblp;' & _         ;// количество байт на последней странице файла
	'ushort cp;' & _           ;// количество страниц в файле
	'ushort crlc;' & _         ;// Relocations
	'ushort cparhdr;' & _      ;// Размер заголовка в параграфах
	'ushort minalloc;' & _     ;// Минимальные дополнительные параграфы
    'ushort maxalloc;' & _     ;// Максимальные дополнительные параграфы
	'ushort ss;' & _           ;// начальное относительное значение регистра SS
	'ushort sp;' & _           ;// начальное значение регистра SP
	'ushort csum;' & _         ;// контрольная сумма
	'ushort ip;' & _           ;// начальное значение регистра IP
	'ushort cs;' & _           ;// начальное относительное значение регистра CS
	'ushort lfarlc;' & _       ;// адрес в файле на таблицу переадресации
	'ushort ovno;' & _         ;// количество оверлеев
	'ushort res[4];' & _       ;// Зарезервировано
    'ushort oemid;' & _        ;// OEM идентифкатор
	'ushort oeminfo;' & _      ;// OEM информация
	'ushort res2[10];' & _     ;// Зарезервировано
	'dword lfanew'             ;// адрес в файле нового .exe заголовка (PE)            
	
    Local $nBytes, $tIMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_DOS_HEADER), DllStructGetSize($tIMAGE_DOS_HEADER),$nBytes)
    Return $tIMAGE_DOS_HEADER
EndFunc

Func WRITE_IMAGE_DOS_HEADER($hFile, $MovePos, $IMAGE_DOS_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $nBytes)
EndFunc

Func READ_SIGNATURE($hFile, $MovePos)
    Local $nBytes, $hSignature = DllStructCreate('dword Signature')
    _WinAPI_SetFilePointer($hFile,$MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($hSignature), DllStructGetSize($hSignature), $nBytes)
    Return $hSignature
EndFunc

Func WRITE_SIGNATURE($hFile, $MovePos, $Signature)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($Signature), DllStructGetSize($Signature), $nBytes)
EndFunc

Func READ_IMAGE_FILE_HEADER($hFile, $MovePos)
	Local $tagIMAGE_FILE_HEADER = '' & _
	'ushort Machine;' & _                 ;// Машина
	'ushort NumberOfSections;' & _        ;// Колличество секторов
	'dword TimeDateStamp;' & _            ;// Временной штамп
	'dword PointerToSymbolTable;' & _     ;// Указатель на таблицу символов
	'dword NumberOfSymbols;' & _          ;// Колличество символов
	'ushort SizeOfOptionalHeader;' & _    ;// Размер дополнительного заголовка
	'ushort Characteristics'              ;// Характеристики
	
    Local $nBytes, $tIMAGE_FILE_HEADER = DllStructCreate($tagIMAGE_FILE_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_FILE_HEADER), DllStructGetSize($tIMAGE_FILE_HEADER), $nBytes)
    Return $tIMAGE_FILE_HEADER
EndFunc

Func WRITE_IMAGE_FILE_HEADER($hFile, $MovePos, $IMAGE_FILE_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
	Local $tagIMAGE_OPTIONAL_HEADER = '' & _
	'ushort Magic;' & _                       ;// Тип файла
	'ubyte MajorLinkerVersion;' & _           ;// Основной номер версии компоновщика
	'ubyte MinorLinkerVersion;' & _           ;// Дополнительный номер версии компоновщика
	'dword SizeOfCode;' & _                   ;// Размер кода раздела, в байтах, или сумма всех таких участков, если есть несколько разделов кода.
    'dword SizeOfInitializedData;' & _        ;// Размер инициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько разделов инициализируется данными.
	'dword SizeOfUninitializedData;' & _      ;// Размер неинициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько неинициализированных данных разделов.
	'dword AddressOfEntryPoint;' & _          ;// Указатель на точку входа
	'dword BaseOfCode;' & _                   ;// Указатель на начало секции кода
	'dword BaseOfData;' & _                   ;// Указатель на начало секции данных
    'dword ImageBase;' & _                    ;// Предпочтительный адрес первого байта изображения при загрузке в память. Это значение является кратной 64 байт. Значение по умолчанию для библиотек DLL 0x10000000. Значение по умолчанию для приложений 0x00400000, за исключением Windows CE, где 0x00010000.
	'dword SectionAlignment;' & _             ;// Выравнивание разделов загруженых в память, в байтах (Должно быть больше или равна FileAlignment) 
	'dword FileAlignment;' & _                ;// Согласование исходных данных разделов в файл изображения в байтах.
	'ushort MajorOperatingSystemVersion;' & _ ;// Основной номер версии необходимых операционной системы.
	'ushort MinorOperatingSystemVersion;' & _ ;// Дополнительный номер версии необходимых операционной системы.
    'ushort MajorImageVersion;' & _           ;// Основной номер версии изображения.
	'ushort MinorImageVersion;' & _           ;// Младший номер версии изображения.
	'ushort MajorSubsystemVersion;' & _       ;// Основной номер версии подсистемы.
	'ushort MinorSubsystemVersion;' & _       ;// Дополнительный номер версии подсистемы.
	'dword Win32VersionValue;' & _            ;// Зарезервирован и и должен быть 0.
    'dword SizeOfImage;' & _                  ;// Размер изображения в байтах, включая все заголовки. Должна быть кратна SectionAlignment.
	'dword SizeOfHeaders;' & _                ;// Общий размер из пунктов, округляется до кратного значения, указанного в FileAlignment
	'dword CheckSum;' & _                     ;// Контрольная сумма файла изображения. 
	'ushort Subsystem;' & _                   ;// Подсистемы, необходимые для запуска этого образа.
	'ushort DllCharacteristics;' & _          ;// DLL характеристики изображения.
	'dword SizeOfStackReserve;' & _           ;// Количество байт, резерв для стека.
    'dword SizeOfStackCommit;' & _            ;// Количество байт для совершения в стеке.
	'dword SizeOfHeapReserve;' & _            ;// Количество байт, резерв для локальной массы
	'dword SizeOfHeapCommit;' & _             ;// Количество байт для совершения в локальной массе
	'dword LoaderFlags;' & _                  ;// Этот элемент является устаревшим.
	'dword NumberOfRvaAndSizes;' & _          ;// Количество каталогов в оставшейся части дополнительного заголовка. Каждая запись описывает расположение и размер.
	'byte byteData[128]'                      ;// 
	
    Local $nBytes, $tIMAGE_OPTIONAL_HEADER = DllStructCreate($tagIMAGE_OPTIONAL_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_OPTIONAL_HEADER), DllStructGetSize($tIMAGE_OPTIONAL_HEADER), $nBytes)
    Return $tIMAGE_OPTIONAL_HEADER
EndFunc

Func WRITE_IMAGE_OPTIONAL_HEADER($hFile, $MovePos, $IMAGE_OPTIONAL_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointer($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
	Local $tagIMAGE_SECTION_HEADER = '' & _
	'byte Name[8];' & _                       ;// Имя секции
	'dword Misc;' & _                         ;// Виртуальный размер
	'dword VirtualAddress;' & _               ;// Виртуальный адресс
	'dword SizeOfRawData;' & _                ;// Размер RAW данных
	'dword PointerToRawData;' & _             ;// Указатель на RAW данные
	'dword PointerToRelocations;' & _         ;// Указатель на релокейшены
	'dword PointerToLinenumbers;' & _         ;// Указатель на номера строк
	'ushort NumberOfRelocations;' & _         ;// Колличество релокейшенов
	'ushort NumberOfLinenumbers;' & _         ;// Колличество номеров строк
	'dword Characteristics'                   ;// Характеристики
	
	Local $nBytes, $tIMAGE_SECTION_HEADER = DllStructCreate($tagIMAGE_SECTION_HEADER)
    _WinAPI_SetFilePointer($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_SECTION_HEADER), DllStructGetSize($tIMAGE_SECTION_HEADER),$nBytes)
    Return $tIMAGE_SECTION_HEADER
EndFunc

Func WRITE_IMAGE_SECTION_HEADER($hFile, $MovePos, $IMAGE_SECTION_HEADER)
    Local $nBytes
    If $MovePos <> 0 Then _WinAPI_SetFilePointer($hFile, $MovePos) 
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $nBytes)
EndFunc

Func _WinAPI_FileOpen($sFile,$uStyle)
    Local $tOPENFILE = DllStructCreate('byte cBytes;byte fFixedDisk;ushort nErrCode;ushort Reserved1;ushort Reserved2;char szPathName[260]')
    Local $hRet = DllCall('Kernel32.dll', 'hwnd', 'OpenFile', 'str', $sFile, 'ptr', DllStructGetPtr($tOPENFILE), 'long', $uStyle)
    If (@error) Or (Not IsArray($hRet)) Then 
		Return SetError(@error, @extended, 0)
	EndIf	
    Return $hRet[0]
EndFunc

Подскажите, какие ещё нужны функции для работы с ресурсами?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вместо _WinAPI_FileOpen() нужно использовать _WinAPI_CreateFileEx(), а _WinAPI_SetFilePointer() лучше заменить на _WinAPI_SetFilePointerEx().
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А еще можнонаписать так:

Код:
Func ExtractResource($hInstance, $sExtractPath, $sResType, $sResName, $iResLanguage = 0x0400)
    Local $hResource, $aResSize, $aResLoad, $pMemRes
   
    $hResource = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
	
	...
	
EndFunc
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>

AddResource(@ScriptDir & '\test.exe', @ScriptDir & '\1.exe', 10, 'EXE1') ;~ Добавляем ресурс в файл 
RemoveResource(@ScriptDir & '\test.exe', 14) ;~ Удаляем иконки


Func AddResource($sFile, $sResFile, $sResType, $sResName, $sResLang = 0, $uFlag = 0)
	
	Local $OutFile = ($sFile & '.EXTMP'), $nBytes, $iRead, $uSize, $uFile, $hStruct, $hUpdate, $hFile, $iSize, $tByte, $pByte, $aFile, $nFile, $sRead

    Relocation($sFile, $OutFile) 
	
	$uFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (Not $uFile) Then Return SetError(-1, 0, 0)
	_WinAPI_SetFilePointerEx($uFile, FileGetSize($OutFile), 0)
	$uSize = FileGetSize($sFile)
	If ($uFlag <> 1) Then
        $hStruct = DllStructCreate("char[" & $uSize & "]")
    Else
        $hStruct = DllStructCreate("byte[" & $uSize & "]")
    EndIf
	If _WinAPI_ReadFile($uFile, DllStructGetPtr($hStruct), $uSize, $iRead) Then
	    _WinAPI_CloseHandle($uFile)
        $hUpdate = _WinAPI_BeginUpdateResource($OutFile, False)
	    If $hUpdate Then
            $hFile = _WinAPI_CreateFileEx($sResFile, $OPEN_EXISTING, $GENERIC_READ)
            $iSize = _WinAPI_GetFileSize($hFile)
            $tByte = DllStructCreate('byte[' & $iSize & ']')
            $pByte = DllStructGetPtr($tByte)
            If _WinAPI_ReadFile($hFile, $pByte, $iSize, $iSize) Then
                If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $sResLang, $pByte, DllStructGetSize($tByte)) Then
                    _WinAPI_EndUpdateResource($hUpdate, False)
		        EndIf	
			EndIf	
	    EndIf	
	EndIf
	$aFile = _WinAPI_CreateFile($OutFile, 2, 4)
	If (Not $aFile) Then Return SetError(-3, 0, 0)
	_WinAPI_SetFilePointerEx($aFile, 0, 2)
	_WinAPI_WriteFile($aFile, DllStructGetPtr($hStruct), DllStructGetSize($hStruct), $nBytes)
	_WinAPI_CloseHandle($aFile)
	FileDelete($sFile)
	$nFile = FileOpen($OutFile)
	$sRead = FileRead($nFile)
	FileClose($nFile)
	FileWrite($sFile, $sRead)
	FileDelete($OutFile)
EndFunc

Func RemoveResource($sFile, $sResType, $sResName = '', $sResLang = 0)
	
	Local $OutFile = ($sFile & '.EXTMP')

    Relocation($sFile, $OutFile) 
	
	Local $hSourceFile = _WinAPI_CreateFile($sFile, 2, 2)
	If $hSourceFile Then
	    _WinAPI_SetFilePointerEx($hSourceFile, FileGetSize($OutFile), 0)
	    Local $hByte = DllStructCreate("byte[" & FileGetSize($sFile) & "]")
		Local $pByte = DllStructGetPtr($hByte)
		Local $iSize = DllStructGetSize($hByte)
	    If Not _WinAPI_ReadFile($hSourceFile, $pByte, $iSize, 0) Then 
			Return SetError(-1, 0, 0)
		EndIf	
	    _WinAPI_CloseHandle($hSourceFile)
		
		Local $hUpdate = _WinAPI_BeginUpdateResource($OutFile, False)
	    If $hUpdate Then
			If $sResName <> '' Then
		        If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $sResLang, 0, 0) Then
			        _WinAPI_EndUpdateResource($hUpdate, False)
		        EndIf
            Else
				Local $hLoadLibrary = _WinAPI_LoadLibraryEx($sFile, $LOAD_LIBRARY_AS_DATAFILE)
                Local $sEnumName = _WinAPI_EnumResourceNames($hLoadLibrary, $sResType)
                For $i = 0 To UBound($sEnumName) -1
					Local $sEnumLang = _WinAPI_EnumResourceLanguages($hLoadLibrary, $sResType, $sEnumName[$i])
					For $l = 0 To UBound($sEnumLang) -1
                        _WinAPI_UpdateResource($hUpdate, $sResType, $sEnumName[$i], $sEnumLang[$l], 0, 0)
					Next	
                Next
				_WinAPI_EndUpdateResource($hUpdate, False)
				_WinAPI_FreeLibrary($hLoadLibrary)
			EndIF	
	    EndIf	

	    Local $hDestFile = _WinAPI_CreateFile($OutFile, 2, 4)
	    If $hDestFile Then 
	        _WinAPI_SetFilePointerEx($hDestFile, 0, 2)
	        If Not _WinAPI_WriteFile($hDestFile, $pByte, $iSize, 0) Then
			    Return SetError(-2, 0, 0)
			EndIf	
	        _WinAPI_CloseHandle($hDestFile)
		EndIf
    EndIf
	
    FileDelete($sFile)
	$nFile = FileOpen($OutFile)
	$sRead = FileRead($nFile)
	FileClose($nFile)
	FileWrite($sFile, $sRead)
	FileDelete($OutFile)
EndFunc	

Func ExtractResource($hInstance, $sExtractPath, $sResType, $sResName, $iResLanguage = 0x0400)
	Local $hResource, $aResSize, $aResLoad, $pMemRes
	
	$hResource = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
	$iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
	$aResLoad = _WinAPI_LoadResource($hInstance, $hResource)
	$pMemRes = _WinAPI_LockResource($aResLoad)
	If @error Then
        Return SetError(@error, @extended, 0)
    EndIf
	
	$tByte = DllStructCreate('byte[' & $iSize & ']', $pMemRes)
	
	$hFile = _WinAPI_CreateFileEx($sExtractPath, $CREATE_ALWAYS, $GENERIC_WRITE)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($tByte), DllStructGetSize($tByte), $tByte)
	If $hFile Then
        _WinAPI_CloseHandle($hFile)
    EndIf
EndFunc


Func Relocation($sFile, $sOutFile)
	Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
	If (@error) Or (Not $hFile) Then 
		Return SetError(-1, 0, 0)
	EndIf	
    Local $hFileOut = _WinAPI_CreateFileEx($sOutFile, 2, 2)
	If (Not $hFileOut) Then 
		Return SetError(-2, 0, 0)
	EndIf	
    $IMAGE_DOS_HEADER = READ_IMAGE_DOS_HEADER($hFile, 0) ;~ Извлекаем структуры IMAGE_DOS_HEADER из исходного файла
    WRITE_IMAGE_DOS_HEADER($hFileOut, 0, $IMAGE_DOS_HEADER) ;~ Записываем структуру IMAGE_DOS_HEADER в новый файл
    $iAddress = DllStructGetData($IMAGE_DOS_HEADER, 'lfanew') ;~ Достаём адрес таблицы
    $Signature = READ_SIGNATURE($hFile, $iAddress) ;~ Извлекаем сигнатуру файла
    If DllStructGetData($Signature, 'Signature') <> 0x00004550 And DllStructGetData($Signature, 'Signature') <> 0x50450000 Then ;~ проверяем, если сигнатура не равна PE то возвращаем ошибку
		Return SetError(-3, 0, 0)
	EndIf	
    WRITE_SIGNATURE($hFileOut, $iAddress, $Signature) ;~ Пишем в новый файл сигнатуру по адрессу таблицы
    $iAddress += DllStructGetSize($Signature) ;~ Прибавляем к адресу таблицы размер сигнатуры
    $IMAGE_FILE_HEADER = READ_IMAGE_FILE_HEADER($hFile, $iAddress) ;~ Заполняем структуру IMAGE_FILE_HEADER, считываем по адресу (Таблица + сигнатура)
    WRITE_IMAGE_FILE_HEADER($hFileOut, $iAddress, $IMAGE_FILE_HEADER) ;~ Записываем в новый файл структуру IMAGE_FILE_HEADER
    $iAddress += DllStructGetSize($IMAGE_FILE_HEADER) ;~ Прибавляем ((таблица + сигнатура) + размер IMAGE_FILE_HEADER)
    $IMAGE_OPTIONAL_HEADER = READ_IMAGE_OPTIONAL_HEADER($hFile, $iAddress) ;~ Заполняем структуру IMAGE_OPTIONAL_HEADER
    If DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x10b And DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x20b Then ;~ Проверяем магическое число, если 0x10b и 0x20b то файл является исполняемым 
		Return SetError(-4, 0, 0)
	EndIf	
    WRITE_IMAGE_OPTIONAL_HEADER($hFileOut, $iAddress, $IMAGE_OPTIONAL_HEADER) ;~ Записываем в новый файл структуру IMAGE_OPTIONAL_HEADER
    $NumberOfSections = DllStructGetData($IMAGE_FILE_HEADER, 'NumberOfSections') ;~ Возвращяем число секций
    $iAddress += DllStructGetSize($IMAGE_OPTIONAL_HEADER) ;~ Прибавляем размер структуры
    $SizeOfHeaders = DllStructGetData($IMAGE_OPTIONAL_HEADER, 'SizeOfHeaders') ;~ Размер заголовка
    ;SizeOf IMAGE_SECTION_HEADER ==> 40
    $RemainderSize = $SizeOfHeaders - ($iAddress + $NumberOfSections * 40) ;~ Размер заголовка - (адресс + колличество секций и * на размер IMAGE_SECTION_HEADER = ( 40 ))
    $DataPos = ($iAddress + $NumberOfSections * 40)
    $DataStruct = READ_DATA($hFile, $DataPos, $RemainderSize) ;~ Считываем данные 
    WRITE_DATA($hFileOut, $DataPos, $DataStruct) ;~ Записываем в новый файл 
    For $i = 1 To $NumberOfSections 
		;~ Пишется столько раз, сколько существует секций 
        $IMAGE_SECTION_HEADER = READ_IMAGE_SECTION_HEADER($hFile, $iAddress) ;~ Считываем IMAGE_SECTION_HEADER из файла
        WRITE_IMAGE_SECTION_HEADER($hFileOut, $iAddress, $IMAGE_SECTION_HEADER) ;~ Записываем в новый файл IMAGE_SECTION_HEADER 
        $PointerToRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'PointerToRawData') ;~ Указатель на первую страницу в файл COFF.
        $SizeOfRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'SizeOfRawData') ;~ Размер инициализированных данных на диске в байтах.
        $VirtualAddress = DllStructGetData($IMAGE_SECTION_HEADER, 'VirtualAddress') ;~ Адрес первого байта раздела при загрузке в память
        $ByteStruct = READ_SECTION($hFile, $PointerToRawData, $SizeOfRawData) ;~ Считываем секцию
        WRITE_SECTION($hFileOut, $PointerToRawData, $byteStruct) ;~ Записываем в новый файл секцию 
        $iAddress += DllStructGetSize($IMAGE_SECTION_HEADER)
    Next
    _WinAPI_CloseHandle($hFile)
    _WinAPI_CloseHandle($hFileOut)
EndFunc	

Func READ_SECTION($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointerEx($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_SECTION($hFile, $MovePos, $byteStruct)
    Local $nBytes
	_WinAPI_SetFilePointerEx($hFile, $MovePos)
	_WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_DATA($hFile, $MovePos, $iSize)
    Local $nBytes, $byteStruct = DllStructCreate("byte[" & $iSize & "]")
	_WinAPI_SetFilePointerEx($hFile, $MovePos)
	_WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $iSize, $nBytes)
    Return $byteStruct
EndFunc

Func WRITE_DATA($hFile, $MovePos, $byteStruct)
	Local $nBytes
	_WinAPI_SetFilePointerEx($hFile, $MovePos)
    _WinAPI_WriteFile($hFile, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $nBytes)
EndFunc

Func READ_IMAGE_DOS_HEADER($hFile, $MovePos)
	Local $tagIMAGE_DOS_HEADER =  '' & _
	'ushort magic;' & _        ;// Сигнатура заголовка
	'ushort cblp;' & _         ;// количество байт на последней странице файла
	'ushort cp;' & _           ;// количество страниц в файле
	'ushort crlc;' & _         ;// Relocations
	'ushort cparhdr;' & _      ;// Размер заголовка в параграфах
	'ushort minalloc;' & _     ;// Минимальные дополнительные параграфы
    'ushort maxalloc;' & _     ;// Максимальные дополнительные параграфы
	'ushort ss;' & _           ;// начальное относительное значение регистра SS
	'ushort sp;' & _           ;// начальное значение регистра SP
	'ushort csum;' & _         ;// контрольная сумма
	'ushort ip;' & _           ;// начальное значение регистра IP
	'ushort cs;' & _           ;// начальное относительное значение регистра CS
	'ushort lfarlc;' & _       ;// адрес в файле на таблицу переадресации
	'ushort ovno;' & _         ;// количество оверлеев
	'ushort res[4];' & _       ;// Зарезервировано
    'ushort oemid;' & _        ;// OEM идентифкатор
	'ushort oeminfo;' & _      ;// OEM информация
	'ushort res2[10];' & _     ;// Зарезервировано
	'dword lfanew'             ;// адрес в файле нового .exe заголовка (PE)            
	
    Local $nBytes, $tIMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER)
    _WinAPI_SetFilePointerEx($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_DOS_HEADER), DllStructGetSize($tIMAGE_DOS_HEADER),$nBytes)
    Return $tIMAGE_DOS_HEADER
EndFunc

Func WRITE_IMAGE_DOS_HEADER($hFile, $MovePos, $IMAGE_DOS_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointerEx($hFile,$MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $nBytes)
EndFunc

Func READ_SIGNATURE($hFile, $MovePos)
    Local $nBytes, $hSignature = DllStructCreate('dword Signature')
    _WinAPI_SetFilePointerEx($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($hSignature), DllStructGetSize($hSignature), $nBytes)
    Return $hSignature
EndFunc

Func WRITE_SIGNATURE($hFile, $MovePos, $Signature)
    Local $nBytes
	_WinAPI_SetFilePointerEx($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($Signature), DllStructGetSize($Signature), $nBytes)
EndFunc

Func READ_IMAGE_FILE_HEADER($hFile, $MovePos)
	Local $tagIMAGE_FILE_HEADER = '' & _
	'ushort Machine;' & _                 ;// Машина
	'ushort NumberOfSections;' & _        ;// Колличество секторов
	'dword TimeDateStamp;' & _            ;// Временной штамп
	'dword PointerToSymbolTable;' & _     ;// Указатель на таблицу символов
	'dword NumberOfSymbols;' & _          ;// Колличество символов
	'ushort SizeOfOptionalHeader;' & _    ;// Размер дополнительного заголовка
	'ushort Characteristics'              ;// Характеристики
	
    Local $nBytes, $tIMAGE_FILE_HEADER = DllStructCreate($tagIMAGE_FILE_HEADER)
    _WinAPI_SetFilePointerEx($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_FILE_HEADER), DllStructGetSize($tIMAGE_FILE_HEADER), $nBytes)
    Return $tIMAGE_FILE_HEADER
EndFunc

Func WRITE_IMAGE_FILE_HEADER($hFile, $MovePos, $IMAGE_FILE_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointerEx($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_OPTIONAL_HEADER($hFile, $MovePos)
	Local $tagIMAGE_OPTIONAL_HEADER = '' & _
	'ushort Magic;' & _                       ;// Тип файла
	'ubyte MajorLinkerVersion;' & _           ;// Основной номер версии компоновщика
	'ubyte MinorLinkerVersion;' & _           ;// Дополнительный номер версии компоновщика
	'dword SizeOfCode;' & _                   ;// Размер кода раздела, в байтах, или сумма всех таких участков, если есть несколько разделов кода.
    'dword SizeOfInitializedData;' & _        ;// Размер инициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько разделов инициализируется данными.
	'dword SizeOfUninitializedData;' & _      ;// Размер неинициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько неинициализированных данных разделов.
	'dword AddressOfEntryPoint;' & _          ;// Указатель на точку входа
	'dword BaseOfCode;' & _                   ;// Указатель на начало секции кода
	'dword BaseOfData;' & _                   ;// Указатель на начало секции данных
    'dword ImageBase;' & _                    ;// Предпочтительный адрес первого байта изображения при загрузке в память. Это значение является кратной 64 байт. Значение по умолчанию для библиотек DLL 0x10000000. Значение по умолчанию для приложений 0x00400000, за исключением Windows CE, где 0x00010000.
	'dword SectionAlignment;' & _             ;// Выравнивание разделов загруженых в память, в байтах (Должно быть больше или равна FileAlignment) 
	'dword FileAlignment;' & _                ;// Согласование исходных данных разделов в файл изображения в байтах.
	'ushort MajorOperatingSystemVersion;' & _ ;// Основной номер версии необходимых операционной системы.
	'ushort MinorOperatingSystemVersion;' & _ ;// Дополнительный номер версии необходимых операционной системы.
    'ushort MajorImageVersion;' & _           ;// Основной номер версии изображения.
	'ushort MinorImageVersion;' & _           ;// Младший номер версии изображения.
	'ushort MajorSubsystemVersion;' & _       ;// Основной номер версии подсистемы.
	'ushort MinorSubsystemVersion;' & _       ;// Дополнительный номер версии подсистемы.
	'dword Win32VersionValue;' & _            ;// Зарезервирован и и должен быть 0.
    'dword SizeOfImage;' & _                  ;// Размер изображения в байтах, включая все заголовки. Должна быть кратна SectionAlignment.
	'dword SizeOfHeaders;' & _                ;// Общий размер из пунктов, округляется до кратного значения, указанного в FileAlignment
	'dword CheckSum;' & _                     ;// Контрольная сумма файла изображения. 
	'ushort Subsystem;' & _                   ;// Подсистемы, необходимые для запуска этого образа.
	'ushort DllCharacteristics;' & _          ;// DLL характеристики изображения.
	'dword SizeOfStackReserve;' & _           ;// Количество байт, резерв для стека.
    'dword SizeOfStackCommit;' & _            ;// Количество байт для совершения в стеке.
	'dword SizeOfHeapReserve;' & _            ;// Количество байт, резерв для локальной массы
	'dword SizeOfHeapCommit;' & _             ;// Количество байт для совершения в локальной массе
	'dword LoaderFlags;' & _                  ;// Этот элемент является устаревшим.
	'dword NumberOfRvaAndSizes;' & _          ;// Количество каталогов в оставшейся части дополнительного заголовка. Каждая запись описывает расположение и размер.
	'byte byteData[128]'                      ;// 
	
    Local $nBytes, $tIMAGE_OPTIONAL_HEADER = DllStructCreate($tagIMAGE_OPTIONAL_HEADER)
    _WinAPI_SetFilePointerEx($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_OPTIONAL_HEADER), DllStructGetSize($tIMAGE_OPTIONAL_HEADER), $nBytes)
    Return $tIMAGE_OPTIONAL_HEADER
EndFunc

Func WRITE_IMAGE_OPTIONAL_HEADER($hFile, $MovePos, $IMAGE_OPTIONAL_HEADER)
    Local $nBytes
	_WinAPI_SetFilePointerEx($hFile, $MovePos)
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $nBytes)
EndFunc

Func READ_IMAGE_SECTION_HEADER($hFile, $MovePos)
	Local $tagIMAGE_SECTION_HEADER = '' & _
	'byte Name[8];' & _                       ;// Имя секции
	'dword Misc;' & _                         ;// Виртуальный размер
	'dword VirtualAddress;' & _               ;// Виртуальный адресс
	'dword SizeOfRawData;' & _                ;// Размер RAW данных
	'dword PointerToRawData;' & _             ;// Указатель на RAW данные
	'dword PointerToRelocations;' & _         ;// Указатель на релокейшены
	'dword PointerToLinenumbers;' & _         ;// Указатель на номера строк
	'ushort NumberOfRelocations;' & _         ;// Колличество релокейшенов
	'ushort NumberOfLinenumbers;' & _         ;// Колличество номеров строк
	'dword Characteristics'                   ;// Характеристики
	
	Local $nBytes, $tIMAGE_SECTION_HEADER = DllStructCreate($tagIMAGE_SECTION_HEADER)
    _WinAPI_SetFilePointerEx($hFile, $MovePos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tIMAGE_SECTION_HEADER), DllStructGetSize($tIMAGE_SECTION_HEADER),$nBytes)
    Return $tIMAGE_SECTION_HEADER
EndFunc

Func WRITE_IMAGE_SECTION_HEADER($hFile, $MovePos, $IMAGE_SECTION_HEADER)
    Local $nBytes
    If $MovePos <> 0 Then _WinAPI_SetFilePointerEx($hFile, $MovePos) 
    Return _WinAPI_WriteFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $nBytes)
EndFunc
 
Верх