Removed client-side wait functions; all waiting is now done through
the server.

diff --git a/files/change.c b/files/change.c
index 5b99ca5..331700c 100644
--- a/files/change.c
+++ b/files/change.c
@@ -15,22 +15,13 @@
 #include "process.h"
 #include "thread.h"
 #include "heap.h"
+#include "server.h"
 #include "debug.h"
 
-static BOOL32 CHANGE_Signaled( K32OBJ *obj, DWORD thread_id );
-static BOOL32 CHANGE_Satisfied( K32OBJ *obj, DWORD thread_id );
-static void CHANGE_AddWait( K32OBJ *obj, DWORD thread_id );
-static void CHANGE_RemoveWait( K32OBJ *obj, DWORD thread_id );
 static void CHANGE_Destroy( K32OBJ *obj );
 
 const K32OBJ_OPS CHANGE_Ops =
 {
-    CHANGE_Signaled,    /* signaled */
-    CHANGE_Satisfied,   /* satisfied */
-    CHANGE_AddWait,     /* add_wait */
-    CHANGE_RemoveWait,  /* remove_wait */
-    NULL,               /* read */
-    NULL,               /* write */
     CHANGE_Destroy      /* destroy */
 };
 
@@ -48,51 +39,6 @@
 
 } CHANGE_OBJECT;
 
-/***********************************************************************
- *           CHANGE_Signaled
- */
-static BOOL32 CHANGE_Signaled( K32OBJ *obj, DWORD thread_id )
-{
-    CHANGE_OBJECT *change = (CHANGE_OBJECT *)obj;
-    assert( obj->type == K32OBJ_CHANGE );
-    return change->notify;
-}
-
-/***********************************************************************
- *           CHANGE_Satisfied
- *
- * Wait on this object has been satisfied.
- */
-static BOOL32 CHANGE_Satisfied( K32OBJ *obj, DWORD thread_id )
-{
-    assert( obj->type == K32OBJ_CHANGE );
-    return FALSE;  /* Not abandoned */
-}
-
-/***********************************************************************
- *           CHANGE_AddWait
- *
- * Add thread to object wait queue.
- */
-static void CHANGE_AddWait( K32OBJ *obj, DWORD thread_id )
-{
-    CHANGE_OBJECT *change = (CHANGE_OBJECT *)obj;
-    assert( obj->type == K32OBJ_CHANGE );
-    THREAD_AddQueue( &change->wait_queue, THREAD_ID_TO_THDB(thread_id) );
-}
-
-/***********************************************************************
- *           CHANGE_RemoveWait
- *
- * Remove thread from object wait queue.
- */
-static void CHANGE_RemoveWait( K32OBJ *obj, DWORD thread_id )
-{
-    CHANGE_OBJECT *change = (CHANGE_OBJECT *)obj;
-    assert( obj->type == K32OBJ_CHANGE );
-    THREAD_RemoveQueue( &change->wait_queue, THREAD_ID_TO_THDB(thread_id) );
-}
-
 /****************************************************************************
  *		CHANGE_Destroy
  */
@@ -118,11 +64,24 @@
                                                 BOOL32 bWatchSubtree,
                                                 DWORD dwNotifyFilter ) 
 {
-    HANDLE32 handle;
     CHANGE_OBJECT *change;
+    struct create_change_notification_request req;
+    struct create_change_notification_reply reply;
+    int len;
+
+    req.subtree = bWatchSubtree;
+    req.filter  = dwNotifyFilter;
+    CLIENT_SendRequest( REQ_CREATE_CHANGE_NOTIFICATION, -1, 1, &req, sizeof(req) );
+    CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) );
+    CHECK_LEN( len, sizeof(reply) );
+    if (reply.handle == -1) return INVALID_HANDLE_VALUE32;
 
     change = HeapAlloc( SystemHeap, 0, sizeof(CHANGE_OBJECT) );
-    if (!change) return INVALID_HANDLE_VALUE32;
+    if (!change)
+    {
+        CLIENT_CloseHandle( reply.handle );
+        return INVALID_HANDLE_VALUE32;
+    }
 
     change->header.type = K32OBJ_CHANGE;
     change->header.refcount = 1;
@@ -134,11 +93,9 @@
     change->wait_queue = NULL;
     change->notify = FALSE;
 
-    handle = HANDLE_Alloc( PROCESS_Current(), &change->header, 
-                           FILE_ALL_ACCESS /*FIXME*/, TRUE, -1 );
-    /* If the allocation failed, the object is already destroyed */
-    if (handle == INVALID_HANDLE_VALUE32) change = NULL;
-    return handle;
+    return HANDLE_Alloc( PROCESS_Current(), &change->header, 
+                         STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE /*FIXME*/,
+                         FALSE, reply.handle );
 }
 
 /****************************************************************************