summaryrefslogtreecommitdiffhomepage
path: root/src/daemon/ntapi_dsr_internal_connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/ntapi_dsr_internal_connection.c')
-rw-r--r--src/daemon/ntapi_dsr_internal_connection.c115
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(
- &params->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(
- &params->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(
- &params->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;
+}