server: Implement server-side completion queues and operations on them.
diff --git a/server/protocol.def b/server/protocol.def
index 784a9f9..8eec8a7 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2931,3 +2931,55 @@
int group_count; /* the number of groups the token is a member of */
int privilege_count; /* the number of privileges the token has */
@END
+
+
+/* Create I/O completion port */
+@REQ(create_completion)
+ unsigned int access; /* desired access to a port */
+ unsigned int attributes; /* object attributes */
+ unsigned int concurrent; /* max number of concurrent active threads */
+ obj_handle_t rootdir; /* root directory */
+ VARARG(filename,string); /* port name */
+@REPLY
+ obj_handle_t handle; /* port handle */
+@END
+
+
+/* Open I/O completion port */
+@REQ(open_completion)
+ unsigned int access; /* desired access to a port */
+ unsigned int attributes; /* object attributes */
+ obj_handle_t rootdir; /* root directory */
+ VARARG(filename,string); /* port name */
+@REPLY
+ obj_handle_t handle; /* port handle */
+@END
+
+
+/* add completion to completion port */
+@REQ(add_completion)
+ obj_handle_t handle; /* port handle */
+ unsigned long ckey; /* completion key */
+ unsigned long cvalue; /* completion value */
+ unsigned long information; /* IO_STATUS_BLOCK Information */
+ unsigned int status; /* completion result */
+@END
+
+
+/* get completion from completion port queue */
+@REQ(remove_completion)
+ obj_handle_t handle; /* port handle */
+@REPLY
+ unsigned long ckey; /* completion key */
+ unsigned long cvalue; /* completion value */
+ unsigned long information; /* IO_STATUS_BLOCK Information */
+ unsigned int status; /* completion result */
+@END
+
+
+/* get completion queue depth */
+@REQ(query_completion)
+ obj_handle_t handle; /* port handle */
+@REPLY
+ unsigned int depth; /* completion queue depth */
+@END