#ifndef _NT_PORT_H_ #define _NT_PORT_H_ #include "nt_abi.h" #include "nt_object.h" #include "nt_process.h" typedef enum _nt_lpc_type { NT_LPC_NEW_MESSAGE = 0, NT_LPC_REQUEST = 1, NT_LPC_REPLY = 2, NT_LPC_DATAGRAM = 3, NT_LPC_LOST_REPLY = 4, NT_LPC_PORT_CLOSED = 5, NT_LPC_CLIENT_DIED = 6, NT_LPC_EXCEPTION = 7, NT_LPC_DEBUG_EVENT = 8, NT_LPC_ERROR_EVENT = 9, NT_LPC_CONNECTION_REQUEST = 10, NT_ALPC_REQUEST = 0x2000 | NT_LPC_REQUEST, NT_ALPC_CONNECTION_REQUEST = 0x2000 | NT_LPC_CONNECTION_REQUEST, } nt_lpc_type; typedef enum _nt_port_info_class { NT_PORT_BASIC_INFORMATION } nt_port_info_class; /* friendly port types */ typedef enum _nt_port_type { NT_PORT_TYPE_DEFAULT, /* {'s','v','c','a','n','y'} */ NT_PORT_TYPE_SUBSYSTEM, /* {'n','t','c','t','t','y'} */ NT_PORT_TYPE_VMOUNT, /* {'v','m','o','u','n','t'} */ NT_PORT_TYPE_DAEMON, /* {'d','a','e','m','o','n'} */ NT_PORT_TYPE_BRIDGE, /* {'b','r','i','d','g','e'} */ NT_PORT_TYPE_NTPROC, /* {'n','t','p','r','o','c'} */ NT_PORT_TYPE_SEMCTL, /* {'s','e','m','c','t','l'} */ NT_PORT_TYPE_SEMSVC, /* {'s','e','m','s','v','c'} */ NT_PORT_TYPE_MSQCTL, /* {'m','s','q','c','t','l'} */ NT_PORT_TYPE_MSQSVC, /* {'m','s','q','s','v','c'} */ NT_PORT_TYPE_AFLCTL, /* {'a','f','l','c','t','l'} */ NT_PORT_TYPE_AFLSVC, /* {'a','f','l','s','v','c'} */ NT_PORT_TYPE_CAP } nt_port_type; typedef enum _nt_port_subtype { NT_PORT_SUBTYPE_DEFAULT, NT_PORT_SUBTYPE_PRIVATE, NT_PORT_SUBTYPE_CAP } nt_port_subtype; /* port access bits */ #define NT_PORT_CONNECT 0x00000001 #define NT_STANDARD_RIGHTS_REQUIRED 0x000F0000 #define NT_PORT_ALL_ACCESS NT_PORT_CONNECT | NT_SEC_STANDARD_RIGHTS_ALL /* friendly port guids */ #define NT_PORT_GUID_DEFAULT {0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} #define NT_PORT_GUID_SUBSYSTEM {0xce7f8d40,0x81cd,0x41c6,{0xa4,0xb7,0xb8,0x35,0x67,0xdf,0x15,0xd9}} #define NT_PORT_GUID_VMOUNT {0x893d63d2,0x23e8,0x4caa,{0xa8,0x41,0x7f,0x6e,0x77,0x6b,0xd5,0x70}} #define NT_PORT_GUID_DAEMON {0xcf765d9e,0x6bd8,0x4a8d,{0x8a,0x21,0x17,0x34,0xcd,0x3a,0x8d,0xa7}} #define NT_PORT_GUID_BRIDGE {0xf5e259cc,0x8bab,0x4c1f,{0x9b,0xf9,0xa8,0xad,0x5a,0xd1,0x34,0xf6}} #define NT_PORT_GUID_NTPROC {0xd7f3f3a5,0x3e82,0x4f3e,{0x9d,0x6c,0x36,0x18,0xde,0xfa,0xc6,0x69}} #define NT_PORT_GUID_SEMCTL {0x7850be42,0x7eef,0x4c3d,{0xa7,0x05,0xa4,0xd8,0x47,0x3f,0x67,0x56}} #define NT_PORT_GUID_SEMSVC {0xa50f4380,0x854a,0x4260,{0x9d,0x8d,0xc2,0xc2,0xa1,0x16,0xde,0xf3}} #define NT_PORT_GUID_MSQCTL {0xd2a8c20a,0x0e4b,0x4a7b,{0xb2,0x3a,0x86,0xa4,0x3b,0x87,0x9a,0x26}} #define NT_PORT_GUID_MSQSVC {0x3e443cd7,0xdd08,0x4133,{0x9c,0x92,0x02,0x5d,0x9e,0xbd,0x3a,0xcd}} #define NT_PORT_GUID_AFLCTL {0xb76ce06d,0x60c6,0x4404,{0xa8,0x31,0xc1,0x82,0xea,0xb8,0x1d,0xa2}} #define NT_PORT_GUID_AFLSVC {0xdb346154,0xa096,0x450d,{0x80,0xb7,0x33,0x97,0x73,0xde,0xf4,0xbd}} /* lpc messages */ #define NT_LPC_REFUSE_CONNECTION 0x0000 #define NT_LPC_ACCEPT_CONNECTION 0x0001 #define NT_LPC_MAX_MSG_DATA_SIZE 0x0104 typedef struct _nt_port_basic_information { void * dummy_invalid; } nt_port_basic_information; typedef struct _nt_port_message { uint16_t data_size; uint16_t msg_size; uint16_t msg_type; uint16_t virtual_ranges_offset; nt_client_id client_id; uint32_t msg_id; size_t section_size; } nt_port_message; /* csrss port message structure: new process, first thread */ typedef struct _nt_port_message_csrss_process { nt_port_message header; uintptr_t unknown_1st; uint32_t opcode; int32_t status; uintptr_t unknown_2nd; void * hprocess; void * hthread; uintptr_t unique_process_id; uintptr_t unique_thread_id; void * reserved[8]; } nt_port_message_csrss_process; /* csrss port message structure: existing process, new thread */ typedef struct _nt_port_message_csrss_thread { nt_port_message header; uintptr_t unknown_1st; uint32_t opcode; int32_t status; uintptr_t unknown_2nd; void * hthread; uintptr_t unique_process_id; uintptr_t unique_thread_id; void * reserved[8]; } nt_port_message_csrss_thread; typedef struct _nt_port_section_write { uint32_t length; void * hsection; uint32_t offset; size_t view_size; void * view_base; void * target_vew_base; } nt_port_section_write; typedef struct _nt_port_section_read { uint32_t length; size_t view_size; void * view_base; } nt_port_section_read; /* attributes of a friendly port */ typedef struct _nt_port_keys { uint32_t reserved; uint32_t key[6]; uint32_t padding; } nt_port_keys; typedef struct _nt_port_attr { nt_guid guid; nt_port_type type; nt_port_subtype subtype; int32_t ver_major; int32_t ver_minor; uint32_t options; uint32_t flags; nt_port_keys keys; } nt_port_attr; /* guid component of a friendly port name */ typedef struct _nt_port_guid { wchar16_t uscore_guid; wchar16_t port_guid[36]; wchar16_t uscore_keys; } nt_port_guid; /* keys component of a friendly port name */ typedef struct _nt_port_name_keys { wchar16_t key_1st[8]; wchar16_t uscore_1st; wchar16_t key_2nd[8]; wchar16_t uscore_2nd; wchar16_t key_3rd[8]; wchar16_t uscore_3rd; wchar16_t key_4th[8]; wchar16_t uscore_4th; wchar16_t key_5th[8]; wchar16_t uscore_5th; wchar16_t key_6th[8]; } nt_port_name_keys; /* friendly port name */ typedef struct _nt_port_name { wchar16_t base_named_objects[17]; wchar16_t backslash; wchar16_t svc_prefix[6]; nt_port_guid port_guid; nt_port_name_keys port_name_keys; wchar16_t null_termination; } nt_port_name; typedef int32_t __stdcall ntapi_zw_create_port( __out void ** hport, __in nt_object_attributes * obj_attr, __out uint32_t max_data_size, __out uint32_t max_msg_size, __in_out uint32_t reserved); typedef int32_t __stdcall ntapi_zw_create_waitable_port( __out void ** hport, __in nt_object_attributes * obj_attr, __out uint32_t max_data_size, __out uint32_t max_msg_size, __in_out uint32_t reserved); typedef int32_t __stdcall ntapi_zw_connect_port( __out void ** hport, __in nt_unicode_string * port_name, __in nt_security_quality_of_service * sec_qos, __in_out nt_port_section_write * write_section __optional, __in_out nt_port_section_read * read_section __optional, __out uint32_t * max_msg_size __optional, __in_out void * msg_data __optional, __in_out uint32_t * msg_data_length __optional); typedef int32_t __stdcall ntapi_zw_secure_connect_port( __out void ** hport, __in nt_unicode_string * port_name, __in nt_security_quality_of_service * sec_qos, __in_out nt_port_section_write * write_section __optional, __in nt_sid * server_dis __optional, __in_out nt_port_section_read * read_section __optional, __out uint32_t * max_msg_size __optional, __in_out void * msg_data __optional, __in_out uint32_t * msg_data_length __optional); typedef int32_t __stdcall ntapi_zw_listen_port( __in void * hport, __in nt_port_message * port_message); typedef int32_t __stdcall ntapi_zw_accept_connect_port( __out void ** hport, __in intptr_t port_id, __in nt_port_message * port_message, __in int32_t response, __out nt_port_section_write * write_section __optional, __out nt_port_section_read * read_section __optional); typedef int32_t __stdcall ntapi_zw_complete_connect_port( __in void * hport); typedef int32_t __stdcall ntapi_zw_request_port( __in void * hport, __in void * request_msg); typedef int32_t __stdcall ntapi_zw_request_wait_reply_port( __in void * hport, __in void * request_msg, __out void * reply_msg); typedef int32_t __stdcall ntapi_zw_reply_port( __in void * hport, __in nt_port_message * reply_message); typedef int32_t __stdcall ntapi_zw_reply_wait_reply_port( __in void * hport, __in_out nt_port_message * reply_message); typedef int32_t __stdcall ntapi_zw_reply_wait_receive_port( __in void * hport, __out intptr_t * port_id __optional, __in nt_port_message * reply_message __optional, __out nt_port_message * receive_message); typedef int32_t __stdcall ntapi_zw_reply_wait_receive_port_ex( __in void * hport, __out intptr_t * port_id __optional, __in nt_port_message * reply_message __optional, __out nt_port_message * receive_message, __in nt_large_integer * timeout); typedef int32_t __stdcall ntapi_zw_read_request_data( __in void * hport, __in nt_port_message * message, __in uint32_t index, __out void * buffer, __in size_t buffer_length, __out size_t * returned_length __optional); typedef int32_t __stdcall ntapi_zw_write_request_data( __in void * hport, __in nt_port_message * message, __in uint32_t index, __in void * buffer, __in size_t buffer_length, __out size_t * returned_length __optional); typedef int32_t __stdcall ntapi_zw_query_information_port( __in void * hport, __in nt_port_info_class port_info_class, __out void * port_info, __in size_t port_info_length, __out size_t * returned_length __optional); typedef int32_t __stdcall ntapi_zw_impersonate_client_of_port( __in void * hport, __in nt_port_message * message); typedef int32_t __stdcall ntapi_csr_client_call_server( __in void * msg_csrss, __in void * msg_unknown, __in uint32_t msg_opcode, __in uint32_t msg_size); typedef void * __cdecl ntapi_csr_port_handle(int32_t * pstatus); /* extensions */ typedef int32_t __stdcall ntapi_tt_port_guid_from_type( __out nt_guid * guid, __in nt_port_type type, __in nt_port_subtype subtype); typedef int32_t __stdcall ntapi_tt_port_type_from_guid( __out nt_port_type * type, __out nt_port_subtype * subtype, __in const nt_guid * guid); typedef int32_t __stdcall ntapi_tt_port_prefix_from_type( __out wchar16_t (*prefix)[6], __in nt_port_type type, __in nt_port_subtype subtype); typedef int32_t __stdcall ntapi_tt_port_generate_keys( __out nt_port_keys * keys); typedef void __stdcall ntapi_tt_port_format_keys( __in nt_port_keys * keys, __out nt_port_name_keys * name_keys); typedef void __stdcall ntapi_tt_port_name_from_attr( __out nt_port_name * name, __in nt_port_attr * attr); typedef int32_t __stdcall ntapi_tt_port_attr_from_name( __out nt_port_attr * attr, __in const nt_port_name * name); typedef int32_t __stdcall ntapi_tt_port_attr_from_string( __out nt_port_attr * attr, __in const nt_unicode_string*str); typedef int32_t __stdcall ntapi_tt_port_attr_from_symlink( __out nt_port_attr * attr, __in void * symlink); #endif