diff --git a/include/toksvc/toksvc.h b/include/toksvc/toksvc.h
index a3d0806..334b370 100644
--- a/include/toksvc/toksvc.h
+++ b/include/toksvc/toksvc.h
@@ -96,9 +96,15 @@ extern "C" {
 #define TOKS_IOCTL_IDX_GET_TOKEN_COUNT	0
 #define TOKS_IOCTL_IDX_SET_TOKEN_COUNT	1
 
+#define TOKS_IOCTL_IDX_GET_SERVICE_INFO	2
+#define TOKS_IOCTL_IDX_LOG_SERVICE_INFO	3
+
 #define TOKS_IOCTL_GET_TOKEN_COUNT	TOKS_IOCTL_GET(TOKS_IOCTL_IDX_GET_TOKEN_COUNT)
 #define TOKS_IOCTL_SET_TOKEN_COUNT	TOKS_IOCTL_GET(TOKS_IOCTL_IDX_SET_TOKEN_COUNT)
 
+#define TOKS_IOCTL_GET_SERVICE_INFO	TOKS_IOCTL_GET(TOKS_IOCTL_IDX_GET_SERVICE_INFO)
+#define TOKS_IOCTL_LOG_SERVICE_INFO	TOKS_IOCTL_GET(TOKS_IOCTL_IDX_LOG_SERVICE_INFO)
+
 enum toks_custom_error {
 	TOKS_ERR_FLOW_ERROR,
 	TOKS_ERR_FLEE_ERROR,
@@ -127,6 +133,19 @@ struct toks_token_string{
 	char            token[128];
 };
 
+struct toks_service_info {
+	struct _nt_guid		uuid;
+	int32_t			syspid;
+	int32_t			systid;
+	int32_t			ctrlpid;
+	int32_t			csyspid;
+	int32_t			allocated;
+	int32_t			available;
+	int32_t			used;
+	int32_t			free;
+	int32_t			loglevel;
+};
+
 struct toks_error_info {
 	const struct toks_driver_ctx *	edctx;
 	const struct toks_unit_ctx *	euctx;
diff --git a/src/daemon/toks_daemon_ioctl.c b/src/daemon/toks_daemon_ioctl.c
index 8d60a04..ef7157b 100644
--- a/src/daemon/toks_daemon_ioctl.c
+++ b/src/daemon/toks_daemon_ioctl.c
@@ -10,6 +10,7 @@
 
 #include "toksvc_daemon_impl.h"
 #include "toksvc_driver_impl.h"
+#include "toksvc_log_impl.h"
 
 static int32_t toks_daemon_ioctl_get_token_count(struct toks_daemon_ctx * dctx)
 {
@@ -40,6 +41,51 @@ static int32_t toks_daemon_ioctl_set_token_count(struct toks_daemon_ctx * dctx)
 	return toks_daemon_release(dctx);
 }
 
+static int32_t toks_daemon_ioctl_get_service_info(struct toks_daemon_ctx * dctx)
+{
+	nt_tty_port_msg * msg = &dctx->reply;
+
+	/* uuid */
+	msg->svcdata.meta[0]  = (dctx->driver_ctx->cctx->uuid->data1);
+
+	msg->svcdata.meta[1]  = (dctx->driver_ctx->cctx->uuid->data2);
+	msg->svcdata.meta[1] |= (dctx->driver_ctx->cctx->uuid->data3 << 16);
+
+	msg->svcdata.meta[2]  = (dctx->driver_ctx->cctx->uuid->data4[0]);
+	msg->svcdata.meta[2] |= (dctx->driver_ctx->cctx->uuid->data4[1] << 8);
+	msg->svcdata.meta[2] |= (dctx->driver_ctx->cctx->uuid->data4[2] << 16);
+	msg->svcdata.meta[2] |= (dctx->driver_ctx->cctx->uuid->data4[3] << 24);
+
+	msg->svcdata.meta[3]  = (dctx->driver_ctx->cctx->uuid->data4[4]);
+	msg->svcdata.meta[3] |= (dctx->driver_ctx->cctx->uuid->data4[5] << 8);
+	msg->svcdata.meta[3] |= (dctx->driver_ctx->cctx->uuid->data4[6] << 16);
+	msg->svcdata.meta[3] |= (dctx->driver_ctx->cctx->uuid->data4[7] << 24);
+
+	/* syspid, systid */
+	msg->svcdata.data[0]  = pe_get_current_process_id();
+	msg->svcdata.data[1]  = pe_get_current_thread_id();
+
+	/* ctrlpid, csyspid */
+	msg->svcdata.data[2]  = dctx->ctrlpid;
+	msg->svcdata.data[3]  = dctx->csyspid;
+
+	/* allocated, available */
+	msg->svcdata.data[4]  = toks_get_driver_atokens(dctx->driver_ctx);
+	msg->svcdata.data[5]  = toks_get_driver_ntokens(dctx->driver_ctx);
+
+	/* used, free */
+	msg->svcdata.data[6]  = dctx->utokens;
+	msg->svcdata.data[7]  = dctx->ftokens;
+
+	return NT_STATUS_SUCCESS;
+}
+
+static int32_t toks_daemon_ioctl_log_service_info(struct toks_daemon_ctx * dctx)
+{
+	toks_log_service_info(dctx);
+	return NT_STATUS_SUCCESS;
+}
+
 int32_t __stdcall toks_daemon_ioctl(struct toks_daemon_ctx * dctx)
 {
 	nt_tty_port_msg * msg;
@@ -55,6 +101,12 @@ int32_t __stdcall toks_daemon_ioctl(struct toks_daemon_ctx * dctx)
 		case TOKS_IOCTL_SET_TOKEN_COUNT:
 			return toks_daemon_ioctl_set_token_count(dctx);
 
+		case TOKS_IOCTL_GET_SERVICE_INFO:
+			return toks_daemon_ioctl_get_service_info(dctx);
+
+		case TOKS_IOCTL_LOG_SERVICE_INFO:
+			return toks_daemon_ioctl_log_service_info(dctx);
+
 		default:
 			return NT_STATUS_NOT_IMPLEMENTED;
 	}