diff options
Diffstat (limited to 'src/daemon/ntapi_dsr_internal_connection.c')
-rw-r--r-- | src/daemon/ntapi_dsr_internal_connection.c | 115 |
1 files changed, 45 insertions, 70 deletions
diff --git a/src/daemon/ntapi_dsr_internal_connection.c b/src/daemon/ntapi_dsr_internal_connection.c index fecc027..6e77d00 100644 --- a/src/daemon/ntapi_dsr_internal_connection.c +++ b/src/daemon/ntapi_dsr_internal_connection.c @@ -14,7 +14,7 @@ int32_t __ntapi_tt_seh_frame(void *, void *, void *, int32_t (*)(nt_daemon_params *)); -static int32_t __stdcall __ntapi_dsr_internal_client_connect_fail( +static int32_t __ntapi_dsr_internal_client_connect_exit( nt_daemon_params * params, int32_t status) { @@ -27,56 +27,6 @@ static int32_t __stdcall __ntapi_dsr_internal_client_connect_fail( status); } -/* __ntapi_dsr_connect_internal_client executes in the daemon's dedicated thread */ -int32_t __stdcall __ntapi_dsr_connect_internal_client(nt_daemon_params * params) -{ - int32_t status; - intptr_t port_id; - nt_port_message port_msg; - void * hport; - void * hready; - - /* avoid out-of-scope use */ - hready = params->hthread_internal_client; - - /* report state */ - at_store_32( - ¶ms->exit_code_daemon_start, - NT_STATUS_MORE_PROCESSING_REQUIRED); - - /* first connection */ - if ((status = __ntapi->zw_reply_wait_receive_port( - params->hport_daemon, - &port_id,0,&port_msg))) - return status; - - /* the internal client must be first */ - if (port_msg.client_id.process_id != pe_get_current_process_id()) - return NT_STATUS_PORT_CONNECTION_REFUSED; - - /* accept connection request */ - if ((status = __ntapi->zw_accept_connect_port( - &hport, - port_msg.client_id.process_id, - (nt_port_message *)&port_msg, - NT_LPC_ACCEPT_CONNECTION, - (nt_port_section_write *)0, - (nt_port_section_read *)0))) - return status; - - /* finalize connection */ - if ((status = __ntapi->zw_complete_connect_port(hport))) - return status; - - /* await client thread task completion */ - __ntapi->zw_wait_for_single_object( - hready,NT_SYNC_NON_ALERTABLE,0); - - /* all done */ - return NT_STATUS_SUCCESS; -} - - /* __ntapi_dsr_internal_client_connect executes in its own temporary thread */ static int32_t __ntapi_dsr_internal_client_connect_impl(nt_daemon_params * params) { @@ -85,15 +35,10 @@ static int32_t __ntapi_dsr_internal_client_connect_impl(nt_daemon_params * param nt_object_attributes oa; nt_security_quality_of_service sqos; - /* report status */ - at_store_32( - ¶ms->exit_code_internal_client, - NT_STATUS_MORE_PROCESSING_REQUIRED); - /* init server_name */ - server_name.strlen = (uint16_t)__ntapi->tt_string_null_offset_short((const int16_t *)params->port_name); + server_name.strlen = (uint16_t)__ntapi->tt_string_null_offset_short((int16_t *)params->port_name); server_name.maxlen = 0; - server_name.buffer = (uint16_t *)params->port_name; + server_name.buffer = params->port_name; /* init security structure */ sqos.length = sizeof(sqos); @@ -103,10 +48,10 @@ static int32_t __ntapi_dsr_internal_client_connect_impl(nt_daemon_params * param /* init the port's object attributes */ oa.len = sizeof(oa); - oa.root_dir = (void *)0; + oa.root_dir = 0; oa.obj_name = &server_name; oa.obj_attr = 0; - oa.sec_desc = (nt_security_descriptor *)0; + oa.sec_desc = params->port_sd; oa.sec_qos = &sqos; /* establish internal connection */ @@ -115,7 +60,7 @@ static int32_t __ntapi_dsr_internal_client_connect_impl(nt_daemon_params * param &server_name, &sqos, 0,0,0,0,0))) - return __ntapi_dsr_internal_client_connect_fail( + return __ntapi_dsr_internal_client_connect_exit( params,status); /* update port info */ @@ -124,25 +69,55 @@ static int32_t __ntapi_dsr_internal_client_connect_impl(nt_daemon_params * param (intptr_t *)params->pport_internal_client, (intptr_t)params->hport_internal_client); - /* report status */ - at_store_32( - ¶ms->exit_code_internal_client, - status); - /* signal the 'internal-client-is-ready' event */ status = __ntapi->zw_set_event( params->hevent_internal_client_ready, 0); /* exit the task-specific thread */ - return __ntapi->zw_terminate_thread( - NT_CURRENT_THREAD_HANDLE, - status); + return __ntapi_dsr_internal_client_connect_exit( + params,status); } -int32_t __stdcall __ntapi_dsr_internal_client_connect(nt_daemon_params * params) +int32_t __ntapi_dsr_internal_client_connect(nt_daemon_params * params) { return __ntapi_tt_seh_frame( params,0,0, __ntapi_dsr_internal_client_connect_impl); } + +/* __ntapi_dsr_connect_internal_client executes in the daemon's dedicated thread */ +int32_t __ntapi_dsr_connect_internal_client(nt_daemon_params * params) +{ + int32_t status; + intptr_t port_id; + nt_port_message port_msg; + void * hport; + + /* first connection */ + if ((status = __ntapi->zw_reply_wait_receive_port( + params->hport_daemon, + &port_id,0,&port_msg))) + return status; + + /* the internal client must be first */ + if (port_msg.client_id.process_id != pe_get_current_process_id()) + return NT_STATUS_PORT_CONNECTION_REFUSED; + + /* accept connection request */ + if ((status = __ntapi->zw_accept_connect_port( + &hport, + port_msg.client_id.process_id, + (nt_port_message *)&port_msg, + NT_LPC_ACCEPT_CONNECTION, + (nt_port_section_write *)0, + (nt_port_section_read *)0))) + return status; + + /* finalize connection */ + if ((status = __ntapi->zw_complete_connect_port(hport))) + return status; + + /* all done */ + return NT_STATUS_SUCCESS; +} |