Return console handles in alloc_console request.
Fixed read_console_input parameters to conform to the reply structure
declaration.

diff --git a/server/console.c b/server/console.c
index 774e65f..8ed9ec1 100644
--- a/server/console.c
+++ b/server/console.c
@@ -99,7 +99,7 @@
 };
 
 
-int create_console( int fd, struct object *obj[2] )
+static int create_console( int fd, struct object *obj[2] )
 {
     struct console_input *console_input;
     struct screen_buffer *screen_buffer;
@@ -156,6 +156,30 @@
     return 1;
 }
 
+/* allocate a console for this process */
+int alloc_console( struct process *process )
+{
+    struct object *obj[2];
+    if (process->console_in || process->console_out)
+    {
+        SET_ERROR( ERROR_ACCESS_DENIED );
+        return 0;
+    }
+    if (!create_console( -1, obj )) return 0;
+    process->console_in  = obj[0];
+    process->console_out = obj[1];
+    return 1;
+}
+
+/* free the console for this process */
+int free_console( struct process *process )
+{
+    if (process->console_in) release_object( process->console_in );
+    if (process->console_out) release_object( process->console_out );
+    process->console_in = process->console_out = NULL;
+    return 1;
+}
+
 static int set_console_fd( int handle, int fd, int pid )
 {
     struct console_input *input;
@@ -324,12 +348,14 @@
 static int read_console_input( int handle, int count, int flush )
 {
     struct console_input *console;
+    struct read_console_input_reply reply;
 
     if (!(console = (struct console_input *)get_handle_obj( current->process, handle,
                                                             GENERIC_READ, &console_input_ops )))
         return -1;
     if ((count < 0) || (count > console->recnum)) count = console->recnum;
-    send_reply( current, -1, 1, console->records, count * sizeof(INPUT_RECORD) );
+    send_reply( current, -1, 2, &reply, sizeof(reply),
+                console->records, count * sizeof(INPUT_RECORD) );
     if (flush)
     {
         int i;
@@ -491,8 +517,23 @@
 /* allocate a console for the current process */
 DECL_HANDLER(alloc_console)
 {
-    alloc_console( current->process );
-    send_reply( current, -1, 0 );
+    struct alloc_console_reply reply = { -1, -1 };
+
+    if (!alloc_console( current->process )) goto done;
+
+    if ((reply.handle_in = alloc_handle( current->process, current->process->console_in,
+                                         req->access, req->inherit )) != -1)
+    {
+        if ((reply.handle_out = alloc_handle( current->process, current->process->console_out,
+                                              req->access, req->inherit )) != -1)
+            goto done;  /* everything is fine */
+        close_handle( current->process, reply.handle_in );
+        reply.handle_in = -1;
+    }
+    free_console( current->process );
+
+ done:
+    send_reply( current, -1, 1, &reply, sizeof(reply) );
 }
 
 /* free the console of the current process */
@@ -505,13 +546,10 @@
 /* open a handle to the process console */
 DECL_HANDLER(open_console)
 {
-    struct object *obj;
     struct open_console_reply reply = { -1 };
-    if ((obj = get_console( current->process, req->output )))
-    {
-        reply.handle = alloc_handle( current->process, obj, req->access, req->inherit );
-        release_object( obj );
-    }
+    struct object *obj= req->output ? current->process->console_out : current->process->console_in;
+
+    if (obj) reply.handle = alloc_handle( current->process, obj, req->access, req->inherit );
     send_reply( current, -1, 1, &reply, sizeof(reply) );
 }