summaryrefslogtreecommitdiffhomepage
path: root/src/tty
diff options
context:
space:
mode:
Diffstat (limited to 'src/tty')
-rw-r--r--src/tty/ntapi_tty_create_session.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/src/tty/ntapi_tty_create_session.c b/src/tty/ntapi_tty_create_session.c
index 3f8f1d7..e878160 100644
--- a/src/tty/ntapi_tty_create_session.c
+++ b/src/tty/ntapi_tty_create_session.c
@@ -28,10 +28,15 @@ int32_t __stdcall __ntapi_tty_create_session(
__out nt_port_name * port_name,
__in nt_tty_session_type type,
__in const nt_guid * guid __optional,
- __in wchar16_t * image_name __optional)
+ __in wchar16_t * image_name __optional,
+ __in void * htty __optional)
{
nt_status status;
ntapi_internals * __internals;
+ void * shport;
+ nt_port_name sport_name;
+ nt_tty_server_basic_info ttyinfo;
+ nt_iosb iosb;
nt_port_attr port_attr;
nt_runtime_data ssattr;
@@ -53,6 +58,9 @@ int32_t __stdcall __ntapi_tty_create_session(
__ntapi->tt_aligned_block_memset(
&port_attr,0,sizeof(port_attr));
+ __ntapi->tt_aligned_block_memset(
+ &ssattr,0,sizeof(ssattr));
+
switch (type) {
case NT_TTY_SESSION_PRIMARY:
port_attr.type = NT_PORT_TYPE_SUBSYSTEM;
@@ -69,6 +77,21 @@ int32_t __stdcall __ntapi_tty_create_session(
break;
+ case NT_TTY_SESSION_SECONDARY:
+ port_attr.type = NT_PORT_TYPE_SUBSYSTEM;
+ port_attr.subtype = NT_PORT_SUBTYPE_DEFAULT;
+
+ if (!hport)
+ hport = &shport;
+
+ if (!port_name)
+ port_name = &sport_name;
+
+ if (!image_name)
+ image_name = __tty_image_name_fallback;
+
+ break;
+
case NT_TTY_SESSION_PRIVATE:
port_attr.type = NT_PORT_TYPE_SUBSYSTEM;
port_attr.subtype = NT_PORT_SUBTYPE_PRIVATE;
@@ -98,10 +121,30 @@ int32_t __stdcall __ntapi_tty_create_session(
port_name,
&port_attr);
- /* subsystem attributes */
- __ntapi->tt_aligned_block_memset(
- &ssattr,0,sizeof(ssattr));
+ /* parent session) */
+ if (htty && (htty != NT_INVALID_HANDLE_VALUE)) {
+ if ((status = __ntapi->tty_query_information_server(
+ htty,&iosb,
+ &ttyinfo,sizeof(ttyinfo),
+ NT_TTY_SERVER_BASIC_INFORMATION)))
+ return status;
+ ssattr.tty_type = ttyinfo.attr.type;
+ ssattr.tty_subtype = ttyinfo.attr.subtype;
+
+ ssattr.tty_keys[0] = ttyinfo.attr.keys.key[0];
+ ssattr.tty_keys[1] = ttyinfo.attr.keys.key[1];
+ ssattr.tty_keys[2] = ttyinfo.attr.keys.key[2];
+ ssattr.tty_keys[3] = ttyinfo.attr.keys.key[3];
+ ssattr.tty_keys[4] = ttyinfo.attr.keys.key[4];
+ ssattr.tty_keys[5] = ttyinfo.attr.keys.key[5];
+
+ __ntapi->tt_guid_copy(
+ &ssattr.tty_guid,
+ &ttyinfo.attr.guid);
+ }
+
+ /* subsystem attributes */
ssattr.srv_type = port_attr.type;
ssattr.srv_subtype = port_attr.subtype;
ssattr.srv_keys[0] = port_attr.keys.key[0];
@@ -133,6 +176,7 @@ int32_t __stdcall __ntapi_tty_create_session(
params.image_name = image_name;
params.rtblock = &rtblock;
+ params.hsession = htty;
if ((status = __ntapi->tt_create_native_process(&params)))
return status;