diff --git a/include/ntapi/nt_ipc.h b/include/ntapi/nt_ipc.h index d799587..80fc34c 100644 --- a/include/ntapi/nt_ipc.h +++ b/include/ntapi/nt_ipc.h @@ -4,6 +4,29 @@ #include "nt_abi.h" #include "nt_object.h" +/* friendly ipc guids */ +#define NT_IPC_GUID_SEMCTL {0xe47c05df,0x5f5c,0x4762,{0xa2,0x79,0xd2,0x82,0xf5,0x39,0xea,0xdf}} +#define NT_IPC_GUID_SEMKEY {0xc6e442c3,0x2ac5,0x4d1d,{0x92,0xf3,0x6e,0x10,0xc6,0x1f,0x53,0x79}} +#define NT_IPC_GUID_SEMPID {0x571ac9bb,0x22eb,0x43f2,{0x8d,0xd6,0x64,0x39,0x49,0xa6,0xe9,0x1f}} + +/* friendly ipc object directory prefixes */ +#define NT_IPC_OBJDIR_PREFIX_SEMCTL {'s','e','m','c','t','l'} +#define NT_IPC_OBJDIR_PREFIX_SEMKEY {'s','e','m','k','e','y'} +#define NT_IPC_OBJDIR_PREFIX_SEMPID {'s','e','m','p','i','d'} + + +/* ipc commands */ +#define NT_IPC_CMD_RMID (0) +#define NT_IPC_CMD_SET (1) +#define NT_IPC_CMD_STAT (2) +#define NT_IPC_CMD_INFO (3) + + +/* ipc special keys */ +#define NT_IPC_KEY_PRIVATE (0) + + +/* ipc extension interfaces */ typedef int32_t __stdcall ntapi_ipc_create_pipe( __out void ** hpipe_read, __out void ** hpipe_write, diff --git a/include/ntapi/nt_port.h b/include/ntapi/nt_port.h index 9bfa440..45755e0 100644 --- a/include/ntapi/nt_port.h +++ b/include/ntapi/nt_port.h @@ -35,6 +35,8 @@ typedef enum _nt_port_type { NT_PORT_TYPE_DAEMON, /* {'d','a','e','m','o','n'} */ NT_PORT_TYPE_SYMLNK, /* {'s','y','m','l','n','k'} */ 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_CAP } nt_port_type; @@ -53,6 +55,8 @@ typedef enum _nt_port_subtype { #define NT_PORT_GUID_DAEMON {0xcf765d9e,0x6bd8,0x4a8d,{0x8a,0x21,0x17,0x34,0xcd,0x3a,0x8d,0xa7}} #define NT_PORT_GUID_SYMLNK {0xfe1b8480,0x833d,0x44df,{0x90,0x99,0xc1,0xf6,0x9c,0x11,0xd4,0x0b}} #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}} /* lpc messages */ #define NT_LPC_REFUSE_CONNECTION 0x0000 diff --git a/include/ntapi/nt_sem.h b/include/ntapi/nt_sem.h new file mode 100644 index 0000000..768007d --- /dev/null +++ b/include/ntapi/nt_sem.h @@ -0,0 +1,66 @@ +#ifndef _NT_SEM_H_ +#define _NT_SEM_H_ + +#include "nt_abi.h" +#include "nt_object.h" + +/* semaphore commands */ +#define NT_SEM_CMD_GETPID (11) +#define NT_SEM_CMD_GETVAL (12) +#define NT_SEM_CMD_GETALL (13) +#define NT_SEM_CMD_GETNCNT (14) +#define NT_SEM_CMD_GETZCNT (15) +#define NT_SEM_CMD_SETVAL (16) +#define NT_SEM_CMD_SETALL (17) + + +/* semaphore command flags */ +#define NT_SEM_FLAG_NOWAIT (0x0800) +#define NT_SEM_FLAG_UNDO (0x1000) + + +/* semaphore info */ +typedef struct __attr_ptr_size_aligned__ _nt_sem_info { + void * hport; + void * hprocess; + void * hthread; + void * section; + void * section_addr; + size_t section_size; + void * apc_routine; + void * apc_context; + int32_t semkey; + int32_t semslots; + int32_t semid; + int32_t semnum; + int32_t semcmd; + int32_t sempid; + int32_t semncnt; + int32_t semzcnt; + int32_t semval; + int32_t semadj; + nt_filetime semotime; + nt_filetime semctime; + uint32_t ipcuid; + uint32_t ipcgid; + uint32_t ipccuid; + uint32_t ipccgid; + uint32_t ipcmode; + int32_t ipcseq; + uint32_t ntaccess; + uint32_t ntattr; + uint32_t ntshare; + uint32_t ntoptions; + nt_iosb * riosb; + void * hevent[2]; +} nt_sem_info; + + +/* semaphore operation */ +typedef struct _nt_sem_op { + uint16_t semnum; + int16_t semop; + int16_t semflag; +} nt_sem_op; + +#endif diff --git a/include/ntapi/nt_tty.h b/include/ntapi/nt_tty.h index dc8c4f3..f0d7c5d 100644 --- a/include/ntapi/nt_tty.h +++ b/include/ntapi/nt_tty.h @@ -15,6 +15,7 @@ #include "nt_process.h" #include "nt_port.h" #include "nt_termios.h" +#include "nt_sem.h" /* tty affiliation */ typedef struct _nt_tty_affiliation { @@ -59,6 +60,7 @@ typedef enum _nt_tty_opcode { NT_TTY_QUERY_INFORMATION_THREAD, NT_TTY_QUERY_INFORMATION_SECTION, NT_TTY_QUERY_INFORMATION_PTY, + NT_TTY_QUERY_INFORMATION_SEMAPHORE, /* peer daemon calls */ NT_TTY_REQUEST_PEER, NT_TTY_SIGNAL_PEER, @@ -73,6 +75,17 @@ typedef enum _nt_tty_opcode { NT_TTY_PTY_IOCTL, NT_TTY_PTY_CANCEL, NT_TTY_PTY_PEEK, + /* semaphore */ + NT_TTY_SEM_ALLOC, + NT_TTY_SEM_FREE, + NT_TTY_SEM_OPEN, + NT_TTY_SEM_CLOSE, + NT_TTY_SEM_QUERY, + NT_TTY_SEM_SET, + NT_TTY_SEM_FCNTL, + NT_TTY_SEM_IOCTL, + NT_TTY_SEM_CANCEL, + NT_TTY_SEM_TRACE, /* virtual mount system */ NT_TTY_VMS_QUERY, NT_TTY_VMS_REQUEST, @@ -100,6 +113,7 @@ typedef enum _nt_tty_server_info_class { NT_TTY_SERVER_PTS_SLOT_INFORMATION, NT_TTY_SERVER_DBM_SLOT_INFORMATION, NT_TTY_SERVER_DBG_SLOT_INFORMATION, + NT_TTY_SERVER_SEM_SLOT_INFORMATION, NT_TTY_SERVER_INFORMATION_CAP } nt_tty_server_info_class; @@ -312,6 +326,15 @@ typedef struct __attr_ptr_size_aligned__ _nt_pty_sigctl_msg { } nt_pty_sigctl_msg; +typedef struct __attr_ptr_size_aligned__ _nt_sem_info_msg { + nt_port_message header; + struct { + nt_tty_msg_info ttyinfo; + nt_sem_info seminfo; + } data; +} nt_sem_info_msg; + + typedef struct __attr_ptr_size_aligned__ _nt_tty_session_msg { nt_port_message header; struct { @@ -333,6 +356,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_sem_info seminfo; }; } nt_tty_port_msg; diff --git a/project/headers.mk b/project/headers.mk index bb502bf..c8d5a25 100644 --- a/project/headers.mk +++ b/project/headers.mk @@ -37,6 +37,7 @@ API_HEADERS = \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_registry.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_section.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_security.h \ + $(SOURCE_DIR)/include/$(PACKAGE)/./nt_sem.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_slist.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_socket.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_stat.h \ diff --git a/src/port/ntapi_port_name_helper.c b/src/port/ntapi_port_name_helper.c index 7e013a3..8c811fa 100644 --- a/src/port/ntapi_port_name_helper.c +++ b/src/port/ntapi_port_name_helper.c @@ -19,7 +19,9 @@ static const __port_service_prefix __port_service_prefixes[NT_PORT_TYPE_CAP][NT_ {{'v','m','o','u','n','t'}}, {{'d','a','e','m','o','n'}}, {{'s','y','m','l','n','k'}}, - {{'n','t','p','r','o','c'}}}; + {{'n','t','p','r','o','c'}}, + {{'s','e','m','c','t','l'}}, + {{'s','e','m','s','v','c'}}}; static const nt_guid __port_guids[NT_PORT_TYPE_CAP][NT_PORT_SUBTYPE_CAP] = { {NT_PORT_GUID_DEFAULT}, @@ -27,7 +29,9 @@ static const nt_guid __port_guids[NT_PORT_TYPE_CAP][NT_PORT_SUBTYPE_CAP] = { {NT_PORT_GUID_VMOUNT}, {NT_PORT_GUID_DAEMON}, {NT_PORT_GUID_SYMLNK}, - {NT_PORT_GUID_NTPROC}}; + {NT_PORT_GUID_NTPROC}, + {NT_PORT_GUID_SEMCTL}, + {NT_PORT_GUID_SEMSVC}}; int32_t __stdcall __ntapi_tt_port_guid_from_type( __out nt_guid * guid,