Function at 0x401000
Capabilities:
Accept command line arguments
Create process on windows
Get common file path
Read file on windows
Write and execute a file
Write file on windows

Disassembly:
push ebp
mov ebp, esp
mov eax, 0xc7e0
call fcn.00409870
mov eax, dword [0x410004]
xor eax, ebp
mov dword [ebp - 4], eax
push esi
mov esi, dword [sym.imp.KERNEL32.dll_GetCommandLineW]
push edi
lea eax, [ebp - 0xc798]
push eax
call esi
push eax
call dword [sym.imp.SHELL32.dll_CommandLineToArgvW]
mov edi, eax
mov dword [ebp - 0xc78c], edi
test edi, edi
jne 0x401065
push 0x10
push str.MSI_Proxy_Error
push str.Unable_to_parse_command_line
push eax
call dword [sym.imp.USER32.dll_MessageBoxW]
pop edi
mov eax, 0x271e
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
mov eax, dword [ebp - 0xc798]
cmp eax, 3
jge 0x4010b7
push eax
push str.Invalid_parameter_count___d_.
lea ecx, [ebp - 0x523c]
push 0x2710
push ecx
call fcn.004016ce
add esp, 0x10
push 0x10
push str.MSI_Proxy_Error
lea edx, [ebp - 0x523c]
push edx
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop edi
mov eax, 0x2711
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
push ebx
call esi
mov esi, eax
push esi
push str.Original_command_line_s
lea eax, [ebp - 0x523c]
push 0x2710
push eax
call fcn.004016ce
mov eax, dword [edi]
push eax
push str.Me_s
lea ecx, [ebp - 0x523c]
push 0x2710
push ecx
mov dword [ebp - 0xc794], eax
call fcn.004016ce
mov edx, dword [edi + 4]
push edx
call fcn.004016ec
mov ebx, eax
add esp, 0x24
test ebx, ebx
jg 0x40114c
push ebx
push str.Invalid_parameter_offset___d_.
lea eax, [ebp - 0x523c]
push 0x2710
push eax
call fcn.004016ce
add esp, 0x10
push 0x10
push str.MSI_Proxy_Error
lea ecx, [ebp - 0x523c]
push ecx
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x2712
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
mov edi, dword [edi + 8]
push edi
push str.Working_Dir_s
lea edx, [ebp - 0x523c]
push 0x2710
push edx
mov dword [ebp - 0xc790], edi
call fcn.004016ce
mov eax, esi
add esp, 0x10
xor edx, edx
lea edi, [eax + 2]
mov cx, word [eax]
add eax, 2
test cx, cx
jne 0x401176
sub eax, edi
sar eax, 1
je 0x4011b0
cmp word [esi + edx*2], 0x2a
je 0x4011a9
mov eax, esi
inc edx
lea edi, [eax + 2]
mov cx, word [eax]
add eax, 2
test cx, cx
jne 0x401194
sub eax, edi
sar eax, 1
cmp edx, eax
jb 0x401187
jmp 0x4011b0
lea eax, [edx + 1]
test eax, eax
jne 0x4011e2
push ebx
push str.Marker_not_found_in_command_line.
lea eax, [ebp - 0x523c]
push 0x2710
push eax
call fcn.004016ce
add esp, 0x10
pop ebx
pop edi
mov eax, 0x271c
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
lea edi, [esi + eax*2]
push edi
push str.Embedded_command_line__s_
lea ecx, [ebp - 0x523c]
push 0x2710
push ecx
call fcn.004016ce
add esp, 0x10
lea edx, [ebp - 0x41c]
push edx
push 0x105
call dword [sym.imp.KERNEL32.dll_GetTempPathW]
test eax, eax
jne 0x401240
push 0x10
push str.MSI_Proxy_Error
push str.Unable_to_get_temp_dir.
push eax
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x2713
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
lea eax, [ebp - 0x210]
push eax
push 0
push 0x40e5e4
lea ecx, [ebp - 0x41c]
push ecx
call dword [sym.imp.KERNEL32.dll_GetTempFileNameW]
test eax, eax
jne 0x40128a
push 0x10
push str.MSI_Proxy_Error
push str.Unable_to_get_temp_file_name.
push eax
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x2714
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
mov edx, dword [ebp - 0xc794]
push 0x40e628
push edx
lea eax, [ebp - 0xc770]
push eax
call fcn.004017c8
add esp, 0xc
test eax, eax
je 0x4012f1
push eax
push str.Error_opening_input_file._Error_number__d.
lea ecx, [ebp - 0x523c]
push 0x2710
push ecx
call fcn.004016ce
add esp, 0x10
push 0x10
push str.MSI_Proxy_Error
lea edx, [ebp - 0x523c]
push edx
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x2715
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
push 0x40e688
lea eax, [ebp - 0x210]
push eax
lea ecx, [ebp - 0xc778]
push ecx
call fcn.004017c8
add esp, 0xc
test eax, eax
je 0x401358
push eax
push str.Error_opening_output_file._Error_number__d.
lea edx, [ebp - 0x523c]
push 0x2710
push edx
call fcn.004016ce
add esp, 0x10
push 0x10
push str.MSI_Proxy_Error
lea eax, [ebp - 0x523c]
push eax
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x2715
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
mov ecx, dword [ebp - 0xc770]
push 2
neg ebx
push ebx
push ecx
call fcn.004018a5
add esp, 0xc
test eax, eax
jge 0x40139c
push 0x10
push str.MSI_Proxy_Error
push str.Error_moving_file_pointer_to_offset.
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x2717
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
mov edx, dword [ebp - 0xc770]
push edx
call fcn.0040192a
add esp, 4
test eax, eax
jne 0x401417
nop
mov eax, dword [ebp - 0xc770]
push eax
push 0x2710
lea ecx, [ebp - 0xc76c]
push 1
push ecx
call fcn.00401c32
mov edx, dword [ebp - 0xc770]
push edx
mov esi, eax
call fcn.0040195e
add esp, 0x14
test eax, eax
jne 0x40158e
mov eax, dword [ebp - 0xc778]
push eax
push esi
lea ecx, [ebp - 0xc76c]
push 1
push ecx
call fcn.00401db1
add esp, 0x10
cmp esi, eax
jne 0x4015ba
mov edx, dword [ebp - 0xc770]
push edx
call fcn.0040192a
add esp, 4
test eax, eax
je 0x4013b0
mov eax, dword [ebp - 0xc770]
push eax
call fcn.00401eaa
mov ecx, dword [ebp - 0xc778]
push ecx
call fcn.00401eaa
xor eax, eax
push 0x44
push eax
lea edx, [ebp - 0xc7e0]
push edx
mov dword [ebp - 0xc788], eax
mov dword [ebp - 0xc784], eax
mov dword [ebp - 0xc780], eax
mov dword [ebp - 0xc77c], eax
call fcn.00404010
add esp, 0x14
push 0
mov dword [ebp - 0xc7e0], 0x44
call dword [sym.imp.KERNEL32.dll_SetLastError]
xor eax, eax
push 0x4e1e
push eax
lea ecx, [ebp - 0xa05a]
push ecx
mov word [ebp - 0xa05c], ax
call fcn.00404010
push 0x40e7a4
lea edx, [ebp - 0xa05c]
push 0x2710
push edx
call fcn.00401f26
lea eax, [ebp - 0x210]
push eax
lea ecx, [ebp - 0xa05c]
push 0x2710
push ecx
call fcn.00401f26
push 0x40e7a8
lea edx, [ebp - 0xa05c]
push 0x2710
push edx
call fcn.00401f26
push edi
lea eax, [ebp - 0xa05c]
push 0x2710
push eax
call fcn.00401f26
lea ecx, [ebp - 0xa05c]
push ecx
push str.Run__s.
lea edx, [ebp - 0x523c]
push 0x2710
push edx
call fcn.004016ce
mov edx, dword [ebp - 0xc790]
add esp, 0x4c
lea eax, [ebp - 0xc788]
push eax
lea ecx, [ebp - 0xc7e0]
push ecx
push edx
push 0
push 0
push 0
push 0
push 0
lea eax, [ebp - 0xa05c]
push eax
push 0
call dword [sym.imp.KERNEL32.dll_CreateProcessW]
test eax, eax
jne 0x4015e6
mov esi, dword [sym.imp.KERNEL32.dll_GetLastError]
call esi
push eax
call esi
push eax
lea ecx, [ebp - 0xa05c]
push ecx
push str.Error_running__s._Error__ld__0x_lx_.
lea edx, [ebp - 0x523c]
push 0x2710
push edx
call fcn.004016ce
add esp, 0x18
push 0x10
push str.MSI_Proxy_Error
lea eax, [ebp - 0x523c]
push eax
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x271b
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
push 0x10
push str.MSI_Proxy_Error
push str.Error_reading_input_file.
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x2718
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
push 0x10
push str.MSI_Proxy_Error
push str.Error_writing_output_file.
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x2719
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
mov ecx, dword [ebp - 0xc788]
push 0xffffffffffffffff
push ecx
call dword [sym.imp.KERNEL32.dll_WaitForSingleObject]
mov eax, dword [ebp - 0xc788]
lea edx, [ebp - 0xc774]
push edx
push eax
mov dword [ebp - 0xc774], 0
call dword [sym.imp.KERNEL32.dll_GetExitCodeProcess]
test eax, eax
jne 0x401642
push 0x10
push str.MSI_Proxy_Error
push str.Error_getting_exit_code.
push eax
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x271d
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
mov ecx, dword [ebp - 0xc788]
mov esi, dword [sym.imp.KERNEL32.dll_CloseHandle]
push ecx
call esi
mov edx, dword [ebp - 0xc784]
push edx
call esi
lea eax, [ebp - 0x210]
push eax
call fcn.00401fa3
add esp, 4
test eax, eax
je 0x401699
push 0x10
push str.MSI_Proxy_Error
push str.Error_removing_temp_executable.
push 0
call dword [sym.imp.USER32.dll_MessageBoxW]
pop ebx
pop edi
mov eax, 0x271a
pop esi
mov ecx, dword [ebp - 4]
xor ecx, ebp
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10
mov ecx, dword [ebp - 0xc78c]
push ecx
call dword [sym.imp.KERNEL32.dll_LocalFree]
mov ecx, dword [ebp - 4]
mov eax, dword [ebp - 0xc774]
pop ebx
pop edi
xor ecx, ebp
pop esi
call fcn.004016bf
mov esp, ebp
pop ebp
ret 0x10