/*********************************************************/
/* toksvc: a framework-native token broker service */
/* Copyright (C) 2020 SysDeer Technologies, LLC */
/* Released under GPLv2 and GPLv3; see COPYING.TOKSVC. */
/*********************************************************/
#include <psxtypes/psxtypes.h>
#include <ntapi/ntapi.h>
#include <toksvc/toksvc.h>
#include "toksvc_daemon_impl.h"
#include "toksvc_driver_impl.h"
#include <psxabi/sys_daemon.h>
static const nt_guid g_pidany = NT_PROCESS_GUID_PIDANY;
static const wchar16_t p_pidany[6] = NT_PROCESS_OBJDIR_PREFIX_PIDANY;
static int32_t toks_daemon_pid_connect(
struct toks_daemon_ctx * dctx,
void ** hipc)
{
int32_t status;
void * hpidany;
void * hpiddir;
nt_oa ipcoa;
nt_unicode_string pidname;
wchar16_t pidnamebuf[8];
/* hpiddir */
if (!(hpiddir = toks_get_driver_hpiddir(dctx->driver_ctx))) {
if ((status = ntapi->tt_open_ipc_object_directory(
&hpiddir,
NT_SEC_READ_CONTROL
| NT_DIRECTORY_QUERY
| NT_DIRECTORY_TRAVERSE
| NT_DIRECTORY_CREATE_OBJECT
| NT_DIRECTORY_CREATE_SUBDIRECTORY,
p_pidany,&g_pidany)))
return status;
toks_set_driver_hpiddir(dctx->driver_ctx,hpiddir);
}
/* pid entry name */
ntapi->tt_uint32_to_hex_utf16(
dctx->reqtokpid,pidnamebuf);
pidname.strlen = sizeof(pidnamebuf);
pidname.maxlen = sizeof(pidnamebuf);;
pidname.buffer = pidnamebuf;
/* open symlink */
ipcoa.len = sizeof(ipcoa);
ipcoa.root_dir = hpiddir;
ipcoa.obj_name = &pidname;
ipcoa.obj_attr = 0;
ipcoa.sec_desc = 0;
ipcoa.sec_qos = 0;
if ((status = ntapi->zw_open_symbolic_link_object(
&hpidany,
NT_SEC_STANDARD_RIGHTS_READ | NT_GENERIC_READ,
&ipcoa)))
return status;
status = ntapi->ipc_connect_by_symlink(
hipc,hpidany,false);
ntapi->zw_close(hpidany);
return status;
}
int32_t toks_daemon_pidopen(struct toks_daemon_ctx * dctx)
{
int32_t status;
nt_tty_session_msg msg;
void * hipc;
if ((status = toks_daemon_pid_connect(dctx,&hipc)))
return status;
ntapi->tt_aligned_block_memset(
&msg,0,sizeof(msg));
msg.header.msg_type = NT_LPC_NEW_MESSAGE;
msg.header.data_size = sizeof(msg.data);
msg.header.msg_size = sizeof(msg);
msg.data.ttyinfo.opcode = PSX_DAEMON_IOCTL_PIDQUERY;
if ((status = ntapi->zw_request_wait_reply_port(hipc,&msg,&msg)))
return status;
else if (msg.data.ttyinfo.status)
return msg.data.ttyinfo.status;
dctx->reqsyspid = msg.data.sessioninfo.syspid;
return NT_STATUS_SUCCESS;
}