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/sock.c b/server/sock.c
index 3a4e514..44e0088 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -84,13 +84,15 @@
 
 static void sock_dump( struct object *obj, int verbose );
 static int sock_signaled( struct object *obj, struct thread *thread );
-static int sock_get_poll_events( struct object *obj );
-static void sock_poll_event( struct object *obj, int event );
-static int sock_get_info( struct object *obj, struct get_file_info_reply *reply, int *flags );
 static void sock_destroy( struct object *obj );
+
+static int sock_get_poll_events( struct fd *fd );
+static void sock_poll_event( struct fd *fd, int event );
+static int sock_get_info( struct fd *fd, struct get_file_info_reply *reply, int *flags );
+static void sock_queue_async( struct fd *fd, void *ptr, unsigned int status, int type, int count );
+
 static int sock_get_error( int err );
 static void sock_set_error(void);
-static void sock_queue_async(struct object *obj, void *ptr, unsigned int status, int type, int count);
 
 static const struct object_ops sock_ops =
 {
@@ -101,7 +103,6 @@
     sock_signaled,                /* signaled */
     no_satisfied,                 /* satisfied */
     default_get_fd,               /* get_fd */
-    sock_get_info,                /* get_file_info */
     sock_destroy                  /* destroy */
 };
 
@@ -192,10 +193,10 @@
 
 static int sock_reselect( struct sock *sock )
 {
-    int ev = sock_get_poll_events( &sock->obj );
+    int ev = sock_get_poll_events( sock->obj.fd_obj );
 
     if (debug_level)
-        fprintf(stderr,"sock_reselect(%d): new mask %x\n", sock->obj.fd, ev);
+        fprintf(stderr,"sock_reselect(%p): new mask %x\n", sock, ev);
 
     if (sock->obj.select == -1) {
         /* previously unconnected socket, is this reselect supposed to connect it? */
@@ -212,17 +213,11 @@
    This function is used to signal pending events nevertheless */
 static void sock_try_event ( struct sock *sock, int event )
 {
-    struct pollfd pfd;
-
-    pfd.fd = sock->obj.fd;
-    pfd.events = event;
-    pfd.revents = 0;
-    poll (&pfd, 1, 0);
-
-    if ( pfd.revents )
+    event = check_fd_events( sock->obj.fd_obj, event );
+    if (event)
     {
-        if ( debug_level ) fprintf ( stderr, "sock_try_event: %x\n", pfd.revents );
-        sock_poll_event ( &sock->obj, pfd.revents );
+        if ( debug_level ) fprintf ( stderr, "sock_try_event: %x\n", event );
+        sock_poll_event ( sock->obj.fd_obj, event );
     }
 }
 
@@ -275,23 +270,23 @@
     }
 }
 
-inline static int sock_error(int s)
+inline static int sock_error( struct fd *fd )
 {
     unsigned int optval = 0, optlen;
 
     optlen = sizeof(optval);
-    getsockopt(s, SOL_SOCKET, SO_ERROR, (void *) &optval, &optlen);
+    getsockopt( get_unix_fd(fd), SOL_SOCKET, SO_ERROR, (void *) &optval, &optlen);
     return optval ? sock_get_error(optval) : 0;
 }
 
-static void sock_poll_event( struct object *obj, int event )
+static void sock_poll_event( struct fd *fd, int event )
 {
-    struct sock *sock = (struct sock *)obj;
+    struct sock *sock = get_fd_user( fd );
     int hangup_seen = 0;
 
     assert( sock->obj.ops == &sock_ops );
     if (debug_level)
-        fprintf(stderr, "socket %d select event: %x\n", sock->obj.fd, event);
+        fprintf(stderr, "socket %p select event: %x\n", sock, event);
     if (sock->state & FD_CONNECT)
     {
         /* connecting */
@@ -303,16 +298,16 @@
             sock->pmask |= FD_CONNECT;
             sock->errors[FD_CONNECT_BIT] = 0;
             if (debug_level)
-                fprintf(stderr, "socket %d connection success\n", sock->obj.fd);
+                fprintf(stderr, "socket %p connection success\n", sock);
         }
         else if (event & (POLLERR|POLLHUP))
         {
             /* we didn't get connected? */
             sock->state &= ~FD_CONNECT;
             sock->pmask |= FD_CONNECT;
-            sock->errors[FD_CONNECT_BIT] = sock_error( sock->obj.fd );
+            sock->errors[FD_CONNECT_BIT] = sock_error( fd );
             if (debug_level)
-                fprintf(stderr, "socket %d connection failure\n", sock->obj.fd);
+                fprintf(stderr, "socket %p connection failure\n", sock);
         }
     } else
     if (sock->state & FD_WINE_LISTENING)
@@ -329,7 +324,7 @@
         {
             /* failed incoming connection? */
             sock->pmask |= FD_ACCEPT;
-            sock->errors[FD_ACCEPT_BIT] = sock_error( sock->obj.fd );
+            sock->errors[FD_ACCEPT_BIT] = sock_error( fd );
             sock->hmask |= FD_ACCEPT;
         }
     } else
@@ -342,7 +337,7 @@
 
             /* Linux 2.4 doesn't report POLLHUP if only one side of the socket
              * has been closed, so we need to check for it explicitly here */
-            nr  = recv( sock->obj.fd, &dummy, 1, MSG_PEEK );
+            nr  = recv( get_unix_fd( fd ), &dummy, 1, MSG_PEEK );
             if ( nr > 0 )
             {
                 /* incoming data */
@@ -350,7 +345,7 @@
                 sock->hmask |= (FD_READ|FD_CLOSE);
                 sock->errors[FD_READ_BIT] = 0;
                 if (debug_level)
-                    fprintf(stderr, "socket %d is readable\n", sock->obj.fd );
+                    fprintf(stderr, "socket %p is readable\n", sock );
             }
             else if ( nr == 0 )
                 hangup_seen = 1;
@@ -363,7 +358,7 @@
                 else
                 {
                     if ( debug_level )
-                        fprintf ( stderr, "recv error on socket %d: %d\n", sock->obj.fd, errno );
+                        fprintf ( stderr, "recv error on socket %p: %d\n", sock, errno );
                     event = POLLERR;
                 }
             }
@@ -379,7 +374,7 @@
             sock->hmask |= (FD_READ|FD_CLOSE);
             sock->errors[FD_READ_BIT] = 0;
             if (debug_level)
-                fprintf(stderr, "socket %d is readable\n", sock->obj.fd );
+                fprintf(stderr, "socket %p is readable\n", sock );
 
         }
 
@@ -389,7 +384,7 @@
             sock->hmask |= FD_WRITE;
             sock->errors[FD_WRITE_BIT] = 0;
             if (debug_level)
-                fprintf(stderr, "socket %d is writable\n", sock->obj.fd);
+                fprintf(stderr, "socket %p is writable\n", sock);
         }
         if (event & POLLPRI)
         {
@@ -397,27 +392,27 @@
             sock->hmask |= FD_OOB;
             sock->errors[FD_OOB_BIT] = 0;
             if (debug_level)
-                fprintf(stderr, "socket %d got OOB data\n", sock->obj.fd);
+                fprintf(stderr, "socket %p got OOB data\n", sock);
         }
         /* According to WS2 specs, FD_CLOSE is only delivered when there is
            no more data to be read (i.e. hangup_seen = 1) */
         else if ( hangup_seen && (sock->state & (FD_READ|FD_WRITE) ))
         {
-            sock->errors[FD_CLOSE_BIT] = sock_error( sock->obj.fd );
+            sock->errors[FD_CLOSE_BIT] = sock_error( fd );
             if ( (event & POLLERR) || ( sock_shutdown_type == SOCK_SHUTDOWN_EOF && (event & POLLHUP) ))
                 sock->state &= ~FD_WRITE;
             sock->pmask |= FD_CLOSE;
             sock->hmask |= FD_CLOSE;
             if (debug_level)
-                fprintf(stderr, "socket %d aborted by error %d, event: %x - removing from select loop\n",
-                        sock->obj.fd, sock->errors[FD_CLOSE_BIT], event);
+                fprintf(stderr, "socket %p aborted by error %d, event: %x - removing from select loop\n",
+                        sock, sock->errors[FD_CLOSE_BIT], event);
         }
     }
 
     if ( sock->pmask & FD_CLOSE || event & (POLLERR|POLLHUP) )
     {
         if ( debug_level )
-            fprintf ( stderr, "removing socket %d from select loop\n", sock->obj.fd );
+            fprintf ( stderr, "removing socket %p from select loop\n", sock );
         set_select_events( &sock->obj, -1 );
     }
     else
@@ -435,8 +430,8 @@
 {
     struct sock *sock = (struct sock *)obj;
     assert( obj->ops == &sock_ops );
-    printf( "Socket fd=%d, state=%x, mask=%x, pending=%x, held=%x\n",
-            sock->obj.fd, sock->state,
+    printf( "Socket fd=%p, state=%x, mask=%x, pending=%x, held=%x\n",
+            sock->obj.fd_obj, sock->state,
             sock->mask, sock->pmask, sock->hmask );
 }
 
@@ -445,16 +440,16 @@
     struct sock *sock = (struct sock *)obj;
     assert( obj->ops == &sock_ops );
 
-    return check_select_events( get_unix_fd(obj), sock_get_poll_events( &sock->obj ) );
+    return check_fd_events( sock->obj.fd_obj, sock_get_poll_events( sock->obj.fd_obj ) ) != 0;
 }
 
-static int sock_get_poll_events( struct object *obj )
+static int sock_get_poll_events( struct fd *fd )
 {
-    struct sock *sock = (struct sock *)obj;
+    struct sock *sock = get_fd_user( fd );
     unsigned int mask = sock->mask & sock->state & ~sock->hmask;
     int ev = 0;
 
-    assert( obj->ops == &sock_ops );
+    assert( sock->obj.ops == &sock_ops );
 
     if (sock->state & FD_CONNECT)
         /* connecting, wait for writable */
@@ -474,10 +469,10 @@
     return ev;
 }
 
-static int sock_get_info( struct object *obj, struct get_file_info_reply *reply, int *flags )
+static int sock_get_info( struct fd *fd, struct get_file_info_reply *reply, int *flags )
 {
-    struct sock *sock = (struct sock*) obj;
-    assert ( obj->ops == &sock_ops );
+    struct sock *sock = get_fd_user( fd );
+    assert ( sock->obj.ops == &sock_ops );
 
     if (reply)
     {
@@ -502,14 +497,14 @@
     return FD_TYPE_SOCKET;
 }
 
-static void sock_queue_async(struct object *obj, void *ptr, unsigned int status, int type, int count)
+static void sock_queue_async(struct fd *fd, void *ptr, unsigned int status, int type, int count)
 {
-    struct sock *sock = (struct sock *)obj;
+    struct sock *sock = get_fd_user( fd );
     struct async_queue *q;
     struct async *async;
     int pollev;
 
-    assert( obj->ops == &sock_ops );
+    assert( sock->obj.ops == &sock_ops );
 
     if ( !(sock->flags & WSA_FLAG_OVERLAPPED) )
     {
@@ -544,7 +539,7 @@
         else
         {
             if ( !async )
-                async = create_async ( obj, current, ptr );
+                async = create_async ( &sock->obj, current, ptr );
             if ( !async )
                 return;
 
@@ -640,7 +635,7 @@
          * return.
          */
         slen = sizeof(saddr);
-        acceptfd = accept( get_unix_fd(&sock->obj), &saddr, &slen);
+        acceptfd = accept( get_unix_fd(sock->obj.fd_obj), &saddr, &slen);
         if (acceptfd==-1) {
             sock_set_error();
             release_object( sock );