| |
| |
| |
| |
| |
| |
| #include <psxtypes/psxtypes.h> |
| #include <ntapi/nt_memory.h> |
| #include <ntapi/nt_process.h> |
| #include <ntapi/ntapi.h> |
| #include "ntapi_impl.h" |
| |
| #if defined (__NT32) |
| static wchar16_t runtime_arg[12] = { |
| ' ','-','r',' ', |
| 'i','n','t','e','g','r','a','l'}; |
| #elif defined (__NT64) |
| static wchar16_t runtime_arg[20] = { |
| ' ','-','r',' ', |
| 'i','n','t','e','g','r','a','l', |
| '-','r','u','n','t','i','m','e'}; |
| #endif |
| |
| int32_t __stdcall __ntapi_tt_get_runtime_data( |
| __out nt_runtime_data ** rtdata, |
| __in wchar16_t ** argv) |
| { |
| int32_t status; |
| nt_process_parameters * process_params; |
| nt_cmd_option_meta_utf16 cmd_opt_meta; |
| nt_runtime_data buffer; |
| nt_runtime_data * prtdata; |
| ntapi_internals * __internals; |
| |
| |
| __internals = __ntapi_internals(); |
| |
| |
| if (__internals->rtdata) { |
| *rtdata = __internals->rtdata; |
| return NT_STATUS_SUCCESS; |
| } |
| |
| if (!(argv = argv ? argv : __internals->ntapi_img_sec_bss->argv_envp_array)) |
| return NT_STATUS_INVALID_PARAMETER_2; |
| |
| |
| if ((status = __ntapi->tt_get_short_option_meta_utf16( |
| __ntapi->tt_crc32_table(), |
| 'r', |
| argv, |
| &cmd_opt_meta))) |
| return status; |
| |
| else if (argv[3]) |
| status = NT_STATUS_INVALID_PARAMETER_MIX; |
| |
| if ((status = __ntapi->tt_hex_utf16_to_uintptr( |
| cmd_opt_meta.value, |
| (uintptr_t *)&prtdata))) |
| return status; |
| |
| if ((status = __ntapi->zw_read_virtual_memory( |
| NT_CURRENT_PROCESS_HANDLE, |
| prtdata, |
| (char *)&buffer, |
| sizeof(buffer),0))) |
| return status; |
| |
| |
| process_params = ((nt_peb *)pe_get_peb_address())->process_params; |
| |
| __ntapi->tt_memcpy_utf16( |
| (wchar16_t *)pe_va_from_rva( |
| process_params->command_line.buffer, |
| process_params->command_line.strlen - sizeof(runtime_arg)), |
| runtime_arg, |
| sizeof(runtime_arg)); |
| |
| *rtdata = prtdata; |
| |
| return NT_STATUS_SUCCESS; |
| } |