summaryrefslogtreecommitdiffhomepage
path: root/src/daemon/ntapi_dsr_init.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2016-10-22 15:44:48 -0400
committermidipix <writeonce@midipix.org>2016-10-23 01:00:34 -0400
commit6c2ba1325ddcb52d44cd2ffccbdf6a4bb2853365 (patch)
treea5db05d47c9b4008c13bec379b165f139325fa78 /src/daemon/ntapi_dsr_init.c
parentaf4983a66a7913432a7c254ab837bfd0180f1fc7 (diff)
downloadntapi-6c2ba1325ddcb52d44cd2ffccbdf6a4bb2853365.tar.bz2
ntapi-6c2ba1325ddcb52d44cd2ffccbdf6a4bb2853365.tar.xz
daemon service routine: set daemon status using atomic updates.
Diffstat (limited to 'src/daemon/ntapi_dsr_init.c')
-rw-r--r--src/daemon/ntapi_dsr_init.c51
1 files changed, 42 insertions, 9 deletions
diff --git a/src/daemon/ntapi_dsr_init.c b/src/daemon/ntapi_dsr_init.c
index 58888ed..f028efd 100644
--- a/src/daemon/ntapi_dsr_init.c
+++ b/src/daemon/ntapi_dsr_init.c
@@ -4,6 +4,7 @@
/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */
/********************************************************/
+#include <ntapi/nt_atomic.h>
#include <ntapi/nt_status.h>
#include <ntapi/nt_thread.h>
#include <ntapi/nt_port.h>
@@ -20,6 +21,19 @@ int32_t __stdcall __ntapi_dsr_init(nt_daemon_params * params)
nt_thread_params tparams;
nt_large_integer timeout;
+ /* report status */
+ at_store_32(
+ &params->exit_code_daemon_loop,
+ NT_STATUS_PENDING);
+
+ at_store_32(
+ &params->exit_code_daemon_start,
+ NT_STATUS_PENDING);
+
+ at_store_32(
+ &params->exit_code_internal_client,
+ NT_STATUS_PENDING);
+
/* port_keys */
if (params->flags & NT_DSR_INIT_GENERATE_KEYS)
if ((status = __ntapi->tt_port_generate_keys(params->port_keys)))
@@ -141,6 +155,10 @@ int32_t __stdcall __ntapi_dsr_start_impl(nt_daemon_params * params)
int32_t __stdcall __ntapi_dsr_start(nt_daemon_params * params)
{
+ at_store_32(
+ &params->exit_code_daemon_loop,
+ NT_STATUS_MORE_PROCESSING_REQUIRED);
+
return __ntapi->zw_terminate_thread(
NT_CURRENT_THREAD_HANDLE,
__ntapi_dsr_start_impl(params));
@@ -156,21 +174,32 @@ static int32_t __stdcall __ntapi_dsr_once(nt_daemon_params * params)
return NT_STATUS_SUCCESS;
if ((status = params->daemon_once_routine(params->daemon_loop_context)))
- params->exit_code_daemon_start = status;
+ at_store_32(
+ &params->exit_code_daemon_start,
+ status);
return status;
}
/* __ntapi_dsr_create_port executes in the daemon's dedicated thread */
+static int32_t __stdcall __ntapi_dsr_create_port_exit(
+ nt_daemon_params * params,
+ int32_t status)
+{
+ at_store_32(
+ &params->exit_code_daemon_start,
+ status);
+
+ return status;
+}
+
int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params)
{
- int32_t * pstatus;
+ int32_t status;
nt_object_attributes oa;
nt_security_quality_of_service sqos;
nt_unicode_string server_name;
- pstatus = &params->exit_code_daemon_start;
-
/* init server_name */
server_name.strlen = (uint16_t)__ntapi->tt_string_null_offset_short((const int16_t *)params->port_name);
server_name.maxlen = 0;
@@ -191,20 +220,24 @@ int32_t __stdcall __ntapi_dsr_create_port(nt_daemon_params * params)
oa.sec_qos = &sqos;
/* create the port */
- if ((*pstatus = __ntapi->zw_create_port(
+ if ((status = __ntapi->zw_create_port(
&params->hport_daemon,
&oa,0,(uint32_t)params->port_msg_size,
0)))
- return *pstatus;
+ return __ntapi_dsr_create_port_exit(
+ params,status);
/* return port info */
if (params->pport_daemon)
- *(params->pport_daemon) = params->hport_daemon;
+ at_store(
+ (intptr_t *)params->pport_daemon,
+ (intptr_t)params->hport_daemon);
/* signal the daemon-is-ready event */
- *pstatus = __ntapi->zw_set_event(
+ status = __ntapi->zw_set_event(
params->hevent_daemon_ready,
(int32_t *)0);
- return *pstatus;
+ return __ntapi_dsr_create_port_exit(
+ params,status);
}