summaryrefslogtreecommitdiffhomepage
path: root/src/process/ntapi_tt_fork_v2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/process/ntapi_tt_fork_v2.c')
-rw-r--r--src/process/ntapi_tt_fork_v2.c58
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;
}