#NoTrayIcon
Opt('MustDeclareVars', 1)
Global $iPID, $sFileName, $sText, $iFlag
If $CmdLine[0] <> 4 Then Exit
$iPID = Number($CmdLine[1])
$sFileName = $CmdLine[2]
$sText = $CmdLine[3]
$iFlag = Number($CmdLine[4])
_Write_To_Exe($iPID, $sFileName, $sText, $iFlag)
If @error Then
MsgBox(16, 'Error', '_Write_To_Exe')
Exit
EndIf
Run($sFileName)
_ScriptDestroy()
Func _Write_To_Exe($i_PID, $s_FilePath, $s_Text, $i_Flag)
Local $h_File, $i_Len, $i_Max_Len = 255, $t_Text, $p_Text, $i_Byte, $t_Sign, $p_Sign, _
$i_Error = 1
If ProcessExists($i_PID) Then
ProcessClose($i_PID)
If Not ProcessWaitClose($i_PID, 2) Then Return SetError($i_Error)
EndIf
If $i_Flag Then $s_Text = ''
$i_Len = StringLen($s_Text)
If $i_Len > $i_Max_Len Then
$s_Text = StringLeft($s_Text, $i_Max_Len)
EndIf
For $i = $i_Len To $i_Max_Len
$s_Text &= Chr(0)
Next
$t_Text = DllStructCreate('byte[' & $i_Max_Len + 1 & ']')
DllStructSetData($t_Text, 1, $s_Text)
$h_File = _WinAPI_CreateFile($s_FilePath, 2, 6)
If Not $h_File Then
Return SetError($i_Error)
EndIf
If $i_Flag Then
$t_Sign = DllStructCreate('dword')
DllStructSetData($t_Sign, 1, 0x0144ADDA)
For $i = 1 To 1
If Not _WinAPI_SetFilePointer($h_File, 0, 2) Then ExitLoop
$p_Sign = DllStructGetPtr($t_Sign)
If Not _WinAPI_WriteFile($h_File, $p_Sign, 4, $i_Byte) Or $i_Byte <> 4 Then ExitLoop
$p_Text = DllStructGetPtr($t_Text)
If Not _WinAPI_WriteFile($h_File, $p_Text, ($i_Max_Len + 1), $i_Byte) Or $i_Byte <> ($i_Max_Len + 1) Then ExitLoop
$i_Error = 0
Next
Else
For $i = 1 To 1
If Not _WinAPI_SetFilePointer($h_File, -1 * ($i_Max_Len + 1), 2) Then ExitLoop
$p_Text = DllStructGetPtr($t_Text)
If Not _WinAPI_WriteFile($h_File, $p_Text, ($i_Max_Len + 1), $i_Byte) Or $i_Byte <> ($i_Max_Len + 1) Then ExitLoop
$i_Error = 0
Next
EndIf
_WinAPI_CloseHandle($h_File)
Return SetError($i_Error)
EndFunc ;==>_Write_To_Exe
Func _ScriptDestroy()
Local $s_Temp, $s_Path, $h_File_Temp
$s_Temp = @ScriptDir & '\~RANDOM.bat'
$s_Path = FileGetShortName(@ScriptFullPath)
$h_File_Temp = FileOpen($s_Temp, 2)
FileWriteLine($h_File_Temp, '@echo off')
FileWriteLine($h_File_Temp, ':loop')
FileWriteLine($h_File_Temp, 'del ' & $s_Path)
FileWriteLine($h_File_Temp, 'if exist ' & $s_Path & ' goto loop')
FileWriteLine($h_File_Temp, 'del %0')
FileClose($h_File_Temp)
Run($s_Temp, '', @SW_HIDE)
EndFunc ;==>_ScriptDestroy
#region From WinAPI.au3
Func _WinAPI_CloseHandle($hObject)
Local $aResult = DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hObject)
If @error Then Return SetError(@error, @extended, False)
Return $aResult[0]
EndFunc ;==>_WinAPI_CloseHandle
Func _WinAPI_WriteFile($hFile, $pBuffer, $iToWrite, ByRef $iWritten, $pOverlapped = 0)
Local $aResult = DllCall("kernel32.dll", "bool", "WriteFile", "handle", $hFile, "ptr", $pBuffer, "dword", $iToWrite, "dword*", 0, "ptr", $pOverlapped)
If @error Then Return SetError(@error, @extended, False)
$iWritten = $aResult[4]
Return $aResult[0]
EndFunc ;==>_WinAPI_WriteFile
Func _WinAPI_ReadFile($hFile, $pBuffer, $iToRead, ByRef $iRead, $pOverlapped = 0)
Local $aResult = DllCall("kernel32.dll", "bool", "ReadFile", "handle", $hFile, "ptr", $pBuffer, "dword", $iToRead, "dword*", 0, "ptr", $pOverlapped)
If @error Then Return SetError(@error, @extended, False)
$iRead = $aResult[4]
Return $aResult[0]
EndFunc ;==>_WinAPI_ReadFile
Func _WinAPI_CreateFile($sFileName, $iCreation, $iAccess = 4, $iShare = 0, $iAttributes = 0, $pSecurity = 0)
Local $iDA = 0, $iSM = 0, $iCD = 0, $iFA = 0
If BitAND($iAccess, 1) <> 0 Then $iDA = BitOR($iDA, 0x20000000);$GENERIC_EXECUTE)
If BitAND($iAccess, 2) <> 0 Then $iDA = BitOR($iDA, 0x80000000);$GENERIC_READ)
If BitAND($iAccess, 4) <> 0 Then $iDA = BitOR($iDA, 0x40000000);$GENERIC_WRITE)
If BitAND($iShare, 1) <> 0 Then $iSM = BitOR($iSM, 0x00000004);$FILE_SHARE_DELETE)
If BitAND($iShare, 2) <> 0 Then $iSM = BitOR($iSM, 0x00000001);$FILE_SHARE_READ)
If BitAND($iShare, 4) <> 0 Then $iSM = BitOR($iSM, 0x00000002);$FILE_SHARE_WRITE)
Switch $iCreation
Case 0
$iCD = 1;$CREATE_NEW
Case 1
$iCD = 2;$CREATE_ALWAYS
Case 2
$iCD = 3;$OPEN_EXISTING
Case 3
$iCD = 4;$OPEN_ALWAYS
Case 4
$iCD = 5;$TRUNCATE_EXISTING
EndSwitch
If BitAND($iAttributes, 1) <> 0 Then $iFA = BitOR($iFA, 0x00000020);$FILE_ATTRIBUTE_ARCHIVE)
If BitAND($iAttributes, 2) <> 0 Then $iFA = BitOR($iFA, 0x00000002);$FILE_ATTRIBUTE_HIDDEN)
If BitAND($iAttributes, 4) <> 0 Then $iFA = BitOR($iFA, 0x00000001);$FILE_ATTRIBUTE_READONLY)
If BitAND($iAttributes, 8) <> 0 Then $iFA = BitOR($iFA, 0x00000004);$FILE_ATTRIBUTE_SYSTEM)
Local $aResult = DllCall("kernel32.dll", "handle", "CreateFileW", "wstr", $sFileName, "dword", $iDA, "dword", $iSM, "ptr", $pSecurity, "dword", $iCD, "dword", $iFA, "ptr", 0)
If @error Or $aResult[0] = Ptr(-1) Then Return SetError(@error, @extended, 0) ; INVALID_HANDLE_VALUE
Return $aResult[0]
EndFunc ;==>_WinAPI_CreateFile
Func _WinAPI_SetFilePointer($hFile, $iPos, $iMethod = 0)
Local $aResult = DllCall("kernel32.dll", "INT", "SetFilePointer", "handle", $hFile, "long", $iPos, "ptr", 0, "long", $iMethod)
If @error Then Return SetError(@error, @extended, -1)
Return $aResult[0]
EndFunc ;==>_WinAPI_SetFilePointer
#endregion From WinAPI.au3