Changed fd operations to take a struct fd instead of a struct object.
Removed get_file_info function from object operations.
Added get_device_id request to avoid abusing get_file_info.

diff --git a/server/process.c b/server/process.c
index ba0e19a..5d808dc 100644
--- a/server/process.c
+++ b/server/process.c
@@ -52,7 +52,7 @@
 
 static void process_dump( struct object *obj, int verbose );
 static int process_signaled( struct object *obj, struct thread *thread );
-static void process_poll_event( struct object *obj, int event );
+static void process_poll_event( struct fd *fd, int event );
 static void process_destroy( struct object *obj );
 
 static const struct object_ops process_ops =
@@ -64,7 +64,6 @@
     process_signaled,            /* signaled */
     no_satisfied,                /* satisfied */
     no_get_fd,                   /* get_fd */
-    no_get_file_info,            /* get_file_info */
     process_destroy              /* destroy */
 };
 
@@ -109,7 +108,6 @@
     startup_info_signaled,         /* signaled */
     no_satisfied,                  /* satisfied */
     no_get_fd,                     /* get_fd */
-    no_get_file_info,              /* get_file_info */
     startup_info_destroy           /* destroy */
 };
 
@@ -434,12 +432,12 @@
 }
 
 
-static void process_poll_event( struct object *obj, int event )
+static void process_poll_event( struct fd *fd, int event )
 {
-    struct process *process = (struct process *)obj;
-    assert( obj->ops == &process_ops );
+    struct process *process = get_fd_user( fd );
+    assert( process->obj.ops == &process_ops );
 
-    if (event & (POLLERR | POLLHUP)) set_select_events( obj, -1 );
+    if (event & (POLLERR | POLLHUP)) set_select_events( &process->obj, -1 );
     else if (event & POLLIN) receive_fd( process );
 }