diff --git a/include/ntapi/nt_tty.h b/include/ntapi/nt_tty.h index f0d7c5d..fd41753 100644 --- a/include/ntapi/nt_tty.h +++ b/include/ntapi/nt_tty.h @@ -55,6 +55,7 @@ typedef enum _nt_tty_opcode { NT_TTY_CLIENT_PROCESS_UNREGISTER, /* session information */ NT_TTY_QUERY_INFORMATION_SERVER, + NT_TTY_QUERY_INFORMATION_SERVICE, NT_TTY_QUERY_INFORMATION_SESSION, NT_TTY_QUERY_INFORMATION_PROCESS, NT_TTY_QUERY_INFORMATION_THREAD, @@ -159,6 +160,14 @@ typedef struct __attr_ptr_size_aligned__ _nt_tty_server_info { uintptr_t info_buffer[]; } nt_tty_server_info; + +typedef struct __attr_ptr_size_aligned__ _nt_tty_service_info { + nt_port_attr attr; + uint32_t key; + uint32_t id; +} nt_tty_service_info; + + typedef struct __attr_ptr_size_aligned__ _nt_tty_vms_info { void * hroot; uint32_t hash; @@ -272,6 +281,15 @@ typedef struct __attr_ptr_size_aligned__ _nt_tty_server_msg { } nt_tty_server_msg; +typedef struct __attr_ptr_size_aligned__ _nt_tty_service_msg { + nt_port_message header; + struct { + nt_tty_msg_info ttyinfo; + nt_tty_service_info svcinfo; + } data; +} nt_tty_service_msg; + + typedef struct __attr_ptr_size_aligned__ _nt_tty_vms_msg { nt_port_message header; struct { @@ -356,6 +374,7 @@ typedef struct __attr_ptr_size_aligned__ _nt_tty_port_msg { nt_pty_io_info ioinfo; nt_pty_client_info clientinfo; nt_tty_session_info sessioninfo; + nt_tty_service_info svcinfo; nt_sem_info seminfo; }; } nt_tty_port_msg; @@ -427,6 +446,15 @@ typedef int32_t __stdcall ntapi_tty_query_information_server( __in int tty_info_class); +typedef int32_t __stdcall ntapi_tty_query_information_service( + __in void * hport, + __out nt_io_status_block * iosb, + __out nt_tty_service_info * svcinfo, + __in const nt_guid * guid, + __in uint32_t key, + __in uint32_t id); + + /* pty api */ typedef struct nt_pty_context nt_pty; diff --git a/include/ntapi/ntapi.h b/include/ntapi/ntapi.h index a3d514e..c2ff0e5 100644 --- a/include/ntapi/ntapi.h +++ b/include/ntapi/ntapi.h @@ -530,6 +530,7 @@ typedef struct _ntapi_vtbl { ntapi_tty_client_session_set * tty_client_session_set; ntapi_tty_client_process_register * tty_client_process_register; ntapi_tty_query_information_server * tty_query_information_server; + ntapi_tty_query_information_service * tty_query_information_service; ntapi_tty_request_peer * tty_request_peer; ntapi_tty_vms_query * tty_vms_query; ntapi_tty_vms_request * tty_vms_request; diff --git a/project/common.mk b/project/common.mk index e04e1f3..c1b5b1b 100644 --- a/project/common.mk +++ b/project/common.mk @@ -99,6 +99,7 @@ COMMON_SRCS = \ src/tty/ntapi_tty_create_session.c \ src/tty/ntapi_tty_join_session.c \ src/tty/ntapi_tty_query_information_server.c \ + src/tty/ntapi_tty_query_information_service.c \ src/tty/ntapi_tty_request_peer.c \ src/tty/ntapi_tty_vms_query.c \ src/tty/ntapi_tty_vms_request.c \ diff --git a/src/internal/ntapi.c b/src/internal/ntapi.c index 12ef163..336b5db 100644 --- a/src/internal/ntapi.c +++ b/src/internal/ntapi.c @@ -305,6 +305,7 @@ static int32_t __fastcall __ntapi_init_once(ntapi_vtbl ** pvtbl) __ntapi->tty_client_session_set = __ntapi_tty_client_session_set; __ntapi->tty_client_process_register = __ntapi_tty_client_process_register; __ntapi->tty_query_information_server = __ntapi_tty_query_information_server; + __ntapi->tty_query_information_service = __ntapi_tty_query_information_service; __ntapi->tty_request_peer = __ntapi_tty_request_peer; __ntapi->tty_vms_query = __ntapi_tty_vms_query; __ntapi->tty_vms_request = __ntapi_tty_vms_request; diff --git a/src/internal/ntapi_fnapi.h b/src/internal/ntapi_fnapi.h index 84a8e59..546c335 100644 --- a/src/internal/ntapi_fnapi.h +++ b/src/internal/ntapi_fnapi.h @@ -193,6 +193,7 @@ ntapi_tty_client_session_query __ntapi_tty_client_session_query; ntapi_tty_client_session_set __ntapi_tty_client_session_set; ntapi_tty_client_process_register __ntapi_tty_client_process_register; ntapi_tty_query_information_server __ntapi_tty_query_information_server; +ntapi_tty_query_information_service __ntapi_tty_query_information_service; ntapi_tty_request_peer __ntapi_tty_request_peer; ntapi_tty_vms_query __ntapi_tty_vms_query; ntapi_tty_vms_request __ntapi_tty_vms_request; diff --git a/src/tty/ntapi_tty_query_information_service.c b/src/tty/ntapi_tty_query_information_service.c new file mode 100644 index 0000000..e3ea8b5 --- /dev/null +++ b/src/tty/ntapi_tty_query_information_service.c @@ -0,0 +1,55 @@ +/********************************************************/ +/* ntapi: Native API core library */ +/* Copyright (C) 2013--2017 Z. Gilboa */ +/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */ +/********************************************************/ + +#include +#include +#include +#include +#include "ntapi_impl.h" + +int32_t __stdcall __ntapi_tty_query_information_service( + __in void * hport, + __out nt_io_status_block * iosb, + __out nt_tty_service_info * svcinfo, + __in const nt_guid * guid, + __in uint32_t key, + __in uint32_t id) +{ + int32_t status; + nt_tty_service_msg msg; + + __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 = NT_TTY_QUERY_INFORMATION_SERVICE; + msg.data.svcinfo.key = key; + msg.data.svcinfo.id = id; + + __ntapi->tt_guid_copy( + &msg.data.svcinfo.attr.guid, + guid); + + if (!hport) + hport = __ntapi_internals()->hport_tty_session; + + if ((status = __ntapi->zw_request_wait_reply_port(hport,&msg,&msg))) + return status; + else if (msg.data.ttyinfo.status) + return msg.data.ttyinfo.status; + + __ntapi->tt_generic_memcpy( + svcinfo, + &msg.data.svcinfo, + sizeof(*svcinfo)); + + iosb->status = NT_STATUS_SUCCESS; + iosb->info = sizeof(*svcinfo); + + return NT_STATUS_SUCCESS; +}