server: Make sure that last error doesn't get set during thread cleanup.
diff --git a/server/clipboard.c b/server/clipboard.c
index 065dd2d..0c39319 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -30,6 +30,7 @@
 #define WIN32_NO_STATUS
 #include "request.h"
 #include "object.h"
+#include "process.h"
 #include "user.h"
 #include "winuser.h"
 #include "winternl.h"
@@ -112,9 +113,10 @@
 void cleanup_clipboard_thread(struct thread *thread)
 {
     struct clipboard *clipboard;
-    struct winstation *winstation = get_process_winstation( thread->process, WINSTA_ACCESSCLIPBOARD );
+    struct winstation *winstation;
 
-    if (!winstation) return;
+    if (!thread->process->winstation) return;
+    if (!(winstation = get_process_winstation( thread->process, WINSTA_ACCESSCLIPBOARD ))) return;
 
     if ((clipboard = winstation->clipboard))
     {
diff --git a/server/hook.c b/server/hook.c
index f5ebc2b..7b889d8 100644
--- a/server/hook.c
+++ b/server/hook.c
@@ -114,9 +114,10 @@
 static struct hook_table *get_global_hooks( struct thread *thread )
 {
     struct hook_table *table;
-    struct desktop *desktop = get_thread_desktop( thread, 0 );
+    struct desktop *desktop;
 
-    if (!desktop) return NULL;
+    if (!thread->desktop) return NULL;
+    if (!(desktop = get_thread_desktop( thread, 0 ))) return NULL;
     table = desktop->global_hooks;
     release_object( desktop );
     return table;
diff --git a/server/process.c b/server/process.c
index 630abe6..51193b7 100644
--- a/server/process.c
+++ b/server/process.c
@@ -632,6 +632,8 @@
     handles = process->handles;
     process->handles = NULL;
     if (handles) release_object( handles );
+    process->winstation = 0;
+    process->desktop = 0;
 
     /* close the console attached to this process, if any */
     free_console( process );