diff options
Diffstat (limited to 'src/process/ntapi_tt_fork_v2.c')
-rw-r--r-- | src/process/ntapi_tt_fork_v2.c | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/src/process/ntapi_tt_fork_v2.c b/src/process/ntapi_tt_fork_v2.c index 1927b9c..b7a2ad5 100644 --- a/src/process/ntapi_tt_fork_v2.c +++ b/src/process/ntapi_tt_fork_v2.c @@ -20,19 +20,19 @@ static intptr_t __tt_fork_cancel(void * hprocess,int32_t status) { __ntapi->zw_terminate_process(hprocess, status); __ntapi->zw_close(hprocess); - return (intptr_t)(-1); + return status; } static intptr_t __tt_fork_impl_v2( - __out void ** hprocess, - __out void ** hthread) + __out void ** hprocess, + __out void ** hthread, + __out nt_cid * cid) { int32_t status; void ** hport_session; nt_object_attributes oa_process; nt_object_attributes oa_thread; nt_create_process_info process_info; - nt_cid cid; nt_sec_img_inf sec_img_inf; nt_timeout timeout; ntapi_internals * __internals; @@ -58,6 +58,8 @@ static intptr_t __tt_fork_impl_v2( oa_thread.sec_desc = 0; oa_thread.sec_qos = 0; + cid->process_id = 0; + cid->thread_id = 0; __ntapi->tt_aligned_block_memset( &process_info,0,sizeof(process_info)); @@ -67,13 +69,12 @@ static intptr_t __tt_fork_impl_v2( process_info.init_state.init_flags = NT_PROCESS_CREATE_FLAGS_NO_OBJECT_SYNC; __ntapi->tt_aligned_block_memset(&ext_params,0,sizeof(ext_params)); - __ntapi->tt_aligned_block_memset(&cid,0,sizeof(cid)); __ntapi->tt_aligned_block_memset(&sec_img_inf,0,sizeof(sec_img_inf)); ext_params.size_in_bytes = sizeof(ext_params); ext_params.process_info.ext_param_type = NT_CREATE_PROCESS_EXT_PARAM_GET_CLIENT_ID; - ext_params.process_info.ext_param_size = sizeof(cid); - ext_params.process_info.ext_param_addr = &cid; + ext_params.process_info.ext_param_size = sizeof(*cid); + ext_params.process_info.ext_param_addr = cid; ext_params.section_info.ext_param_type = NT_CREATE_PROCESS_EXT_PARAM_GET_SECTION_IMAGE_INFO; ext_params.section_info.ext_param_size = sizeof(sec_img_inf); @@ -94,10 +95,16 @@ static intptr_t __tt_fork_impl_v2( &process_info, (nt_create_process_ext_params *)&ext_params); - if (status == NT_STATUS_PROCESS_CLONED) - return 0; - else if (status) - return (intptr_t)(-1); + switch (status) { + case NT_STATUS_PROCESS_CLONED: + return NT_STATUS_SUCCESS; + + case NT_STATUS_SUCCESS: + break; + + default: + return status; + } __internals = __ntapi_internals(); hport_session = &__internals->hport_tty_session; @@ -106,7 +113,7 @@ static intptr_t __tt_fork_impl_v2( if (hport_session && *hport_session) if ((status = __ntapi->tty_client_process_register( *hport_session, - cid.process_id, + cid->process_id, 0,0,&timeout))) return __tt_fork_cancel(*hprocess,status); @@ -116,15 +123,15 @@ static intptr_t __tt_fork_impl_v2( return __tt_fork_cancel(*hprocess,status); /* hoppla */ - return (int32_t)cid.process_id; + return NT_STATUS_SUCCESS; } -intptr_t __fastcall __ntapi_tt_fork_v2( +int32_t __fastcall __ntapi_tt_fork_v2( __out void ** hprocess, - __out void ** hthread) + __out void ** hthread, + __out nt_cid * cid) { int32_t status; - intptr_t pid; nt_large_integer timeout; void ** hport_session; void * htty_connected; @@ -136,20 +143,19 @@ intptr_t __fastcall __ntapi_tt_fork_v2( htty_connected = 0; if (hport_session && *hport_session) - if (__ntapi_tt_create_inheritable_event( + if ((status = __ntapi_tt_create_inheritable_event( &htty_connected, NT_NOTIFICATION_EVENT, - NT_EVENT_NOT_SIGNALED)) - return (intptr_t)(-1); + NT_EVENT_NOT_SIGNALED))) + return status; - pid = __tt_fork_impl_v2(hprocess,hthread); + if ((status = __tt_fork_impl_v2(hprocess,hthread,cid))) + return status; if (!hport_session || !*hport_session) - return pid; - else if (pid < 0) - return pid; + return NT_STATUS_SUCCESS; - if (pid == 0) { + if (cid->process_id == 0) { at_store(&__internals->hlock,0); if ((status = __ntapi->tty_connect( @@ -177,11 +183,11 @@ intptr_t __fastcall __ntapi_tt_fork_v2( htty_connected, NT_SYNC_NON_ALERTABLE, 0))) - pid = __tt_fork_cancel(*hprocess,status); + status = __tt_fork_cancel(*hprocess,status); } __ntapi->zw_close(htty_connected); - return pid; + return status; } |