From b92a12fc14551f51f02a68fdf6c0265a758f1c15 Mon Sep 17 00:00:00 2001 From: midipix Date: Fri, 4 May 2018 20:26:39 +0000 Subject: subsystem interfaces: integrated advisory file locking definitions. --- include/ntapi/nt_afl.h | 108 ++++++++++++++++++++++++++++++++++++++ include/ntapi/nt_ipc.h | 8 +++ include/ntapi/nt_port.h | 4 ++ include/ntapi/nt_tty.h | 27 +++++++++- project/headers.mk | 1 + src/ipc/ntapi_ipc_connect.c | 69 ++++++++++++++++++++++++ src/port/ntapi_port_name_helper.c | 8 ++- 7 files changed, 222 insertions(+), 3 deletions(-) create mode 100644 include/ntapi/nt_afl.h diff --git a/include/ntapi/nt_afl.h b/include/ntapi/nt_afl.h new file mode 100644 index 0000000..995df26 --- /dev/null +++ b/include/ntapi/nt_afl.h @@ -0,0 +1,108 @@ +#ifndef _NT_AFL_H_ +#define _NT_AFL_H_ + +#include "nt_abi.h" +#include "nt_object.h" + +/* advisory file locking command bits */ +#define NT_AFL_CMD_LOCK_NONE (0x0000) +#define NT_AFL_CMD_LOCK_READ (0x0001) +#define NT_AFL_CMD_LOCK_WRITE (0x0002) +#define NT_AFL_CMD_LOCK_PROBE (0x0400) +#define NT_AFL_CMD_LOCK_NOWAIT (0x0800) + +/* advisory file locking info info */ +typedef struct __attr_ptr_size_aligned__ _nt_afl_info { + void * hport; + void * hevent; + void * apc_routine; + void * apc_context; + nt_guid afldev; + void * l_hfile; + int64_t l_fileid; + int64_t l_start; + int64_t l_len; + int32_t l_pid; + uint32_t l_cmd; + nt_iosb ntiosb; + nt_iosb * riosb; +} nt_afl_info; + +/* advisory file locking operation */ +typedef struct __attr_ptr_size_aligned__ _nt_afl_op { + void * l_hfile; + int64_t l_fileid; + int64_t l_start; + int64_t l_len; + uint32_t l_pid; + uint32_t l_cmd; +} nt_afl_op; + +/* advisory file locking client interfaces */ +typedef int32_t __stdcall ntapi_afl_create( + __in void * hport, + __out nt_afl_info * afl, + __in nt_oa * oa, + __out nt_iosb * iosb); + + +typedef int32_t __stdcall ntapi_afl_open( + __in void * hport, + __out nt_afl_info * afl, + __in nt_oa * oa, + __out nt_iosb * iosb); + + +typedef int32_t __stdcall ntapi_afl_fcntl( + __in nt_afl_info * afl, + __in void * hevent __optional, + __in nt_io_apc_routine * apc_routine __optional, + __in void * apc_context __optional, + __out nt_iosb * iosb, + __in uint32_t afl_control_code, + __in void * input_buffer __optional, + __in uint32_t input_buffer_length, + __out void * output_buffer __optional, + __in uint32_t output_buffer_length); + + +typedef int32_t __stdcall ntapi_afl_ioctl( + __in nt_afl_info * afl, + __in void * hevent __optional, + __in nt_io_apc_routine * apc_routine __optional, + __in void * apc_context __optional, + __out nt_iosb * iosb, + __in uint32_t afl_control_code, + __in void * input_buffer __optional, + __in uint32_t input_buffer_length, + __out void * output_buffer __optional, + __in uint32_t output_buffer_length); + + +typedef int32_t __stdcall ntapi_afl_query( + __in nt_afl_info * afl, + __out nt_io_status_block * iosb, + __out void * afl_info, + __in uint32_t afl_info_length, + __in int32_t afl_ctl_cmd); + + +typedef int32_t __stdcall ntapi_afl_set( + __in nt_afl_info * afl, + __out nt_io_status_block * iosb, + __in void * afl_info, + __in uint32_t afl_info_length, + __in int32_t afl_ctl_cmd); + + +typedef int32_t __stdcall ntapi_afl_cancel( + __in nt_afl_info * afl, + __out nt_iosb * iosb); + + +typedef int32_t __stdcall ntapi_afl_free( + __in nt_afl_info * afl, + __out nt_iosb * iosb); + + +#endif diff --git a/include/ntapi/nt_ipc.h b/include/ntapi/nt_ipc.h index 7d80296..9eab304 100644 --- a/include/ntapi/nt_ipc.h +++ b/include/ntapi/nt_ipc.h @@ -13,6 +13,10 @@ #define NT_IPC_GUID_MSQKEY {0x8f700621,0x45d2,0x4470,{0x82,0xe4,0xbc,0xad,0x06,0x71,0xb7,0x14}} #define NT_IPC_GUID_MSQPID {0x3c6c2b5b,0x727f,0x4a2e,{0xb2,0x21,0xed,0xd2,0xe6,0xe7,0x80,0xdc}} +#define NT_IPC_GUID_AFLCTL {0xf96dd87c,0x89b7,0x4f9f,{0x81,0x78,0x0f,0x03,0xdb,0x9d,0x2e,0x97}} +#define NT_IPC_GUID_AFLDEV {0xa7a098f4,0xda85,0x4bb1,{0xba,0xa4,0x78,0x13,0x71,0x65,0x4c,0x18}} +#define NT_IPC_GUID_AFLPID {0xa50a4f60,0x1f4e,0x4963,{0x9b,0x2f,0xbf,0x39,0x23,0xbc,0x35,0x68}} + #define NT_IPC_GUID_SHMCTL {0xb6103154,0xa110,0x427e,{0x81,0x87,0x98,0xa3,0xd5,0xba,0x48,0x5a}} #define NT_IPC_GUID_SHMKEY {0xf0581270,0xcb8d,0x46e0,{0x8f,0x4f,0x03,0xfe,0x17,0xa4,0x08,0xd5}} #define NT_IPC_GUID_TMPFSL {0x63e12727,0x1653,0x402e,{0x84,0x9d,0x35,0x8d,0x01,0xcf,0x43,0xf4}} @@ -27,6 +31,10 @@ #define NT_IPC_OBJDIR_PREFIX_MSQKEY {'m','s','q','k','e','y'} #define NT_IPC_OBJDIR_PREFIX_MSQPID {'m','s','q','p','i','d'} +#define NT_IPC_OBJDIR_PREFIX_AFLCTL {'a','f','l','c','t','l'} +#define NT_IPC_OBJDIR_PREFIX_AFLDEV {'a','f','l','d','e','v'} +#define NT_IPC_OBJDIR_PREFIX_AFLPID {'a','f','l','p','i','d'} + #define NT_IPC_OBJDIR_PREFIX_SHMCTL {'s','h','m','c','t','l'} #define NT_IPC_OBJDIR_PREFIX_SHMKEY {'s','h','m','k','e','y'} #define NT_IPC_OBJDIR_PREFIX_TMPFSL {'t','m','p','f','s','l'} diff --git a/include/ntapi/nt_port.h b/include/ntapi/nt_port.h index 3e4b293..ff1cdb9 100644 --- a/include/ntapi/nt_port.h +++ b/include/ntapi/nt_port.h @@ -39,6 +39,8 @@ typedef enum _nt_port_type { 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; @@ -67,6 +69,8 @@ typedef enum _nt_port_subtype { #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 */ diff --git a/include/ntapi/nt_tty.h b/include/ntapi/nt_tty.h index 3ad46c7..07797d4 100644 --- a/include/ntapi/nt_tty.h +++ b/include/ntapi/nt_tty.h @@ -17,6 +17,7 @@ #include "nt_termios.h" #include "nt_sem.h" #include "nt_msq.h" +#include "nt_afl.h" /* tty affiliation */ typedef struct _nt_tty_affiliation { @@ -67,7 +68,7 @@ typedef enum _nt_tty_opcode { NT_TTY_QUERY_INFORMATION_PTY, NT_TTY_QUERY_INFORMATION_SEMAPHORE, NT_TTY_QUERY_INFORMATION_MSGQUEUE, - NT_TTY_QUERY_INFORMATION_RESERVED, + NT_TTY_QUERY_INFORMATION_AFLOCK, /* peer daemon calls */ NT_TTY_REQUEST_PEER, NT_TTY_SIGNAL_PEER, @@ -110,6 +111,19 @@ typedef enum _nt_tty_opcode { NT_TTY_MSQ_TRACE, NT_TTY_MSQ_TRANSFER, NT_TTY_MSQ_WAIT, + /* aflock */ + NT_TTY_AFL_ALLOC, + NT_TTY_AFL_FREE, + NT_TTY_AFL_OPEN, + NT_TTY_AFL_CLOSE, + NT_TTY_AFL_QUERY, + NT_TTY_AFL_SET, + NT_TTY_AFL_FCNTL, + NT_TTY_AFL_IOCTL, + NT_TTY_AFL_CANCEL, + NT_TTY_AFL_TRACE, + NT_TTY_AFL_TRANSFER, + NT_TTY_AFL_WAIT, /* virtual mount system */ NT_TTY_VMS_QUERY, NT_TTY_VMS_REQUEST, @@ -139,6 +153,7 @@ typedef enum _nt_tty_server_info_class { NT_TTY_SERVER_DBG_SLOT_INFORMATION, NT_TTY_SERVER_SEM_SLOT_INFORMATION, NT_TTY_SERVER_MSQ_SLOT_INFORMATION, + NT_TTY_SERVER_AFL_SLOT_INFORMATION, NT_TTY_SERVER_INFORMATION_CAP } nt_tty_server_info_class; @@ -464,6 +479,15 @@ typedef struct __attr_ptr_size_aligned__ _nt_msq_info_msg { } nt_msq_info_msg; +typedef struct __attr_ptr_size_aligned__ _nt_afl_info_msg { + nt_port_message header; + struct { + nt_tty_msg_info ttyinfo; + nt_afl_info aflinfo; + } data; +} nt_afl_info_msg; + + typedef struct __attr_ptr_size_aligned__ _nt_tty_session_msg { nt_port_message header; struct { @@ -493,6 +517,7 @@ typedef struct __attr_ptr_size_aligned__ _nt_tty_port_msg { nt_tty_section_info secinfo; nt_sem_info seminfo; nt_msq_info msqinfo; + nt_afl_info aflinfo; }; } nt_tty_port_msg; diff --git a/project/headers.mk b/project/headers.mk index a89457b..a8fe79c 100644 --- a/project/headers.mk +++ b/project/headers.mk @@ -2,6 +2,7 @@ API_HEADERS = \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_abi.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_api.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_acl.h \ + $(SOURCE_DIR)/include/$(PACKAGE)/./nt_afl.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_argv.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_atom.h \ $(SOURCE_DIR)/include/$(PACKAGE)/./nt_atomic.h \ diff --git a/src/ipc/ntapi_ipc_connect.c b/src/ipc/ntapi_ipc_connect.c index fc05efb..8b2e4a0 100644 --- a/src/ipc/ntapi_ipc_connect.c +++ b/src/ipc/ntapi_ipc_connect.c @@ -116,6 +116,54 @@ static void __ipc_init_ctrl_msg_msqsvc( } +static void __ipc_init_ctrl_msg_aflctl( + const nt_port_attr * attr, + nt_tty_ipc_msg * msg) +{ + __ntapi->tt_aligned_block_memset( + (uintptr_t *)msg, + 0,sizeof(*msg)); + + msg->data.ipcinfo.ctrlsvc.type = attr->type; + msg->data.ipcinfo.ctrlsvc.subtype = attr->subtype; + + msg->data.ipcinfo.ctrlsvc.keys.key[0] = attr->keys.key[0]; + msg->data.ipcinfo.ctrlsvc.keys.key[1] = attr->keys.key[1]; + msg->data.ipcinfo.ctrlsvc.keys.key[2] = attr->keys.key[2]; + msg->data.ipcinfo.ctrlsvc.keys.key[3] = attr->keys.key[3]; + msg->data.ipcinfo.ctrlsvc.keys.key[4] = attr->keys.key[4]; + msg->data.ipcinfo.ctrlsvc.keys.key[5] = attr->keys.key[5]; + + __ntapi->tt_guid_copy( + &msg->data.ipcinfo.ctrlsvc.guid, + &attr->guid); +} + + +static void __ipc_init_ctrl_msg_aflsvc( + nt_rtdata * rtdata, + nt_tty_ipc_msg * msg) +{ + __ntapi->tt_aligned_block_memset( + (uintptr_t *)msg, + 0,sizeof(*msg)); + + msg->data.ipcinfo.ctrlsvc.type = rtdata->aflctl_type; + msg->data.ipcinfo.ctrlsvc.subtype = rtdata->aflctl_subtype; + + msg->data.ipcinfo.ctrlsvc.keys.key[0] = rtdata->aflctl_keys[0]; + msg->data.ipcinfo.ctrlsvc.keys.key[1] = rtdata->aflctl_keys[1]; + msg->data.ipcinfo.ctrlsvc.keys.key[2] = rtdata->aflctl_keys[2]; + msg->data.ipcinfo.ctrlsvc.keys.key[3] = rtdata->aflctl_keys[3]; + msg->data.ipcinfo.ctrlsvc.keys.key[4] = rtdata->aflctl_keys[4]; + msg->data.ipcinfo.ctrlsvc.keys.key[5] = rtdata->aflctl_keys[5]; + + __ntapi->tt_guid_copy( + &msg->data.ipcinfo.ctrlsvc.guid, + &rtdata->aflctl_guid); +} + + static void __ipc_init_ctrl_msg_ipcpeer( nt_rtdata * rtdata, nt_tty_ipc_msg * msg) @@ -192,6 +240,27 @@ static int32_t __ipc_set_client_keys( opcode = NT_TTY_MSQ_FCNTL; break; + case NT_PORT_TYPE_AFLCTL: + if (rtdata->srv_type == NT_PORT_TYPE_AFLSVC) + __ipc_init_ctrl_msg_ipcpeer( + rtdata,&msg); + else + __ipc_init_ctrl_msg_aflctl( + attr,&msg); + + opcode = NT_TTY_AFL_FCNTL; + break; + + case NT_PORT_TYPE_AFLSVC: + if (rtdata->srv_type == NT_PORT_TYPE_AFLCTL) + return NT_STATUS_SUCCESS; + + __ipc_init_ctrl_msg_aflsvc( + rtdata,&msg); + + opcode = NT_TTY_AFL_FCNTL; + break; + default: return NT_STATUS_SUCCESS; } diff --git a/src/port/ntapi_port_name_helper.c b/src/port/ntapi_port_name_helper.c index b4f0065..e71b873 100644 --- a/src/port/ntapi_port_name_helper.c +++ b/src/port/ntapi_port_name_helper.c @@ -23,7 +23,9 @@ static const __port_service_prefix __port_service_prefixes[NT_PORT_TYPE_CAP][NT_ {{'s','e','m','c','t','l'}}, {{'s','e','m','s','v','c'}}, {{'m','s','q','c','t','l'}}, - {{'m','s','q','s','v','c'}}}; + {{'m','s','q','s','v','c'}}, + {{'a','f','l','c','t','l'}}, + {{'a','f','l','s','v','c'}}}; static const nt_guid __port_guids[NT_PORT_TYPE_CAP][NT_PORT_SUBTYPE_CAP] = { {NT_PORT_GUID_DEFAULT}, @@ -35,7 +37,9 @@ static const nt_guid __port_guids[NT_PORT_TYPE_CAP][NT_PORT_SUBTYPE_CAP] = { {NT_PORT_GUID_SEMCTL}, {NT_PORT_GUID_SEMSVC}, {NT_PORT_GUID_MSQCTL}, - {NT_PORT_GUID_MSQSVC}}; + {NT_PORT_GUID_MSQSVC}, + {NT_PORT_GUID_AFLCTL}, + {NT_PORT_GUID_AFLSVC}}; int32_t __stdcall __ntapi_tt_port_guid_from_type( __out nt_guid * guid, -- cgit v1.2.3