summaryrefslogtreecommitdiffhomepage
path: root/src/daemon/ntapi_dsr_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon/ntapi_dsr_init.c')
-rw-r--r--src/daemon/ntapi_dsr_init.c95
1 files changed, 63 insertions, 32 deletions
diff --git a/src/daemon/ntapi_dsr_init.c b/src/daemon/ntapi_dsr_init.c
index 8f29eec..afade50 100644
--- a/src/daemon/ntapi_dsr_init.c
+++ b/src/daemon/ntapi_dsr_init.c
@@ -19,9 +19,7 @@ static int32_t __stdcall __ntapi_dsr_once(nt_daemon_params * params);
int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
{
int32_t status;
-
nt_thread_params tparams;
- nt_large_integer timeout;
/* report status */
at_store_32(
@@ -36,6 +34,9 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
&params->exit_code_internal_client,
NT_STATUS_PENDING);
+ at_locked_or((intptr_t *)params->port_name,0);
+ at_locked_or((intptr_t *)&params->port_name,0);
+
/* port_keys */
if (params->flags & NT_DSR_INIT_GENERATE_KEYS)
if ((status = __ntapi->tt_port_generate_keys(params->port_keys)))
@@ -47,6 +48,20 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
params->port_keys,
params->port_name_keys);
+ /* 'port-created' event */
+ if (!params->hevent_daemon_port) {
+ if ((status = __ntapi->tt_create_private_event(
+ &params->hevent_daemon_port,
+ NT_NOTIFICATION_EVENT,
+ NT_EVENT_NOT_SIGNALED)))
+ return status;
+
+ if (params->pevent_daemon_port)
+ at_store(
+ (intptr_t *)params->pevent_daemon_port,
+ (intptr_t)params->hevent_daemon_port);
+ }
+
/* 'daemon-is-ready' event */
if (!params->hevent_daemon_ready) {
if ((status = __ntapi->tt_create_private_event(
@@ -91,27 +106,25 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
if ((status = __ntapi->tt_create_local_thread(&tparams)))
return status;
- params->hthread_daemon_loop = tparams.hthread;
-
- /* wait for the server to be ready */
- timeout.quad = NT_DSR_INIT_MAX_WAIT;
-
- if ((status = __ntapi->zw_wait_for_single_object(
- params->hevent_daemon_ready,
- NT_SYNC_NON_ALERTABLE,&timeout))) {
- __ntapi->zw_terminate_thread(
- tparams.hthread,
- status);
- return status;
- }
-
+ at_store(
+ (intptr_t *)&params->hthread_daemon_loop,
+ (intptr_t)tparams.hthread);
/* daemon dedicated thread: actual stack size */
params->stack_size_commit = tparams.stack_size_commit;
params->stack_size_reserve = tparams.stack_size_reserve;
+ /* wait for the port to be created */
+ if ((status = __ntapi->zw_wait_for_single_object(
+ params->hevent_daemon_port,
+ NT_SYNC_NON_ALERTABLE,0)))
+ return status;
+
+ /* verify the port's successful creation */
+ if (params->exit_code_daemon_start)
+ return NT_STATUS_PORT_NOT_SET;
- /* establish internal connection */
+ /* internal connection task-specific thread */
__ntapi->tt_aligned_block_memset(
&tparams,0,sizeof(tparams));
@@ -121,17 +134,27 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
if ((status = __ntapi->tt_create_local_thread(&tparams)))
return status;
- params->hthread_internal_client = tparams.hthread;
-
- /* wait until the internal connection had been established */
- timeout.quad = NT_DSR_INIT_MAX_WAIT;
+ at_store(
+ (intptr_t *)&params->hthread_internal_client,
+ (intptr_t)tparams.hthread);
+ /* wait for the task-specific thread to exit */
if ((status = __ntapi->zw_wait_for_single_object(
- params->hevent_internal_client_ready,
- NT_SYNC_NON_ALERTABLE,&timeout)))
+ params->hthread_internal_client,
+ NT_SYNC_NON_ALERTABLE,0)))
return status;
+ /* verify a successful internal connection */
+ if (params->exit_code_internal_client)
+ return params->exit_code_internal_client;
+
+ /* all_done */
+ __ntapi->zw_set_event(
+ params->hevent_daemon_ready,
+ 0);
+
if (params->flags & NT_DSR_INIT_CLOSE_EVENTS) {
+ __ntapi->zw_close(params->hevent_daemon_port);
__ntapi->zw_close(params->hevent_daemon_ready);
__ntapi->zw_close(params->hevent_internal_client_ready);
}
@@ -208,6 +231,10 @@ static int32_t __stdcall __ntapi_dsr_create_port_exit(
&params->exit_code_daemon_start,
status);
+ __ntapi->zw_set_event(
+ params->hevent_daemon_port,
+ 0);
+
return status;
}
@@ -219,9 +246,9 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params)
nt_unicode_string server_name;
/* 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);
@@ -231,7 +258,7 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params)
/* 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 = params->port_sd;
@@ -251,11 +278,15 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params)
(intptr_t *)params->pport_daemon,
(intptr_t)params->hport_daemon);
- /* signal the daemon-is-ready event */
- status = __ntapi->zw_set_event(
- params->hevent_daemon_ready,
- (int32_t *)0);
+ /* set status */
+ at_store_32(
+ &params->exit_code_daemon_start,
+ NT_STATUS_SUCCESS);
+
+ /* signal the port-created event */
+ __ntapi->zw_set_event(
+ params->hevent_daemon_port,
+ 0);
- return __ntapi_dsr_create_port_exit(
- params,status);
+ return NT_STATUS_SUCCESS;
}