Create a token object in wineserver

Mike McCormack mike at codeweavers.com
Mon Jul 21 04:48:03 CDT 2003


ChangeLog:
* Create a token object in wineserver
-------------- next part --------------
? server/named_pipe.c.good
? server/named_pipe.c.merged
? server/token.c
Index: dlls/ntdll/nt.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/nt.c,v
retrieving revision 1.52
diff -u -r1.52 nt.c
--- dlls/ntdll/nt.c	9 Jul 2003 02:57:57 -0000	1.52
+++ dlls/ntdll/nt.c	21 Jul 2003 09:32:03 -0000
@@ -210,10 +210,21 @@
 	DWORD DesiredAccess,
 	HANDLE *TokenHandle)
 {
-	FIXME("(%p,0x%08lx,%p): stub\n",
-	ProcessHandle,DesiredAccess, TokenHandle);
-	*TokenHandle = (HANDLE)0xcafe;
-	return 0;
+    NTSTATUS ret;
+
+    TRACE("(%p,0x%08lx,%p)\n", ProcessHandle,DesiredAccess, TokenHandle);
+
+    SERVER_START_REQ( open_token )
+    {
+        req->handle = ProcessHandle;
+        req->flags  = 0;
+        ret = wine_server_call( req );
+        if( !ret )
+            *TokenHandle = reply->handle;
+    }
+    SERVER_END_REQ;
+
+    return ret;
 }
 
 /******************************************************************************
@@ -226,10 +237,27 @@
 	BOOLEAN OpenAsSelf,
 	HANDLE *TokenHandle)
 {
-	FIXME("(%p,0x%08lx,0x%08x,%p): stub\n",
-	ThreadHandle,DesiredAccess, OpenAsSelf, TokenHandle);
-	*TokenHandle = (HANDLE)0xcafe;
-	return 0;
+    NTSTATUS ret;
+ 
+    TRACE("(%p,0x%08lx,0x%08x,%p)\n",
+          ThreadHandle,DesiredAccess, OpenAsSelf, TokenHandle);
+ 
+    SERVER_START_REQ( open_token )
+    {
+        req->handle = ThreadHandle;
+        req->flags  = OPEN_TOKEN_THREAD;
+        if( OpenAsSelf )
+            req->flags = OPEN_TOKEN_AS_SELF;
+        ret = wine_server_call( req );
+        if( !ret )
+            *TokenHandle = reply->handle;
+    }
+    SERVER_END_REQ;
+
+    return ret;
+}
+  
+  /******************************************************************************
 }
 
 /******************************************************************************
Index: include/wine/server_protocol.h
===================================================================
RCS file: /home/wine/wine/include/wine/server_protocol.h,v
retrieving revision 1.76
diff -u -r1.76 server_protocol.h
--- include/wine/server_protocol.h	11 Jul 2003 21:55:59 -0000	1.76
+++ include/wine/server_protocol.h	21 Jul 2003 09:32:05 -0000
@@ -3072,6 +3072,20 @@
     unsigned int   seqno;
 };
 
+#define OPEN_TOKEN_THREAD   1
+#define OPEN_TOKEN_AS_SELF  2
+struct open_token_request
+{
+    struct request_header __header;
+    obj_handle_t   handle;
+    unsigned int   flags;
+};
+struct open_token_reply
+{
+    struct reply_header __header;
+    obj_handle_t   handle;
+};
+
 #define SET_CB_OPEN      0x001
 #define SET_CB_OWNER     0x002
 #define SET_CB_VIEWER    0x004
@@ -3260,6 +3274,7 @@
     REQ_finish_hook_chain,
     REQ_get_next_hook,
     REQ_set_clipboard_info,
+    REQ_open_token,
     REQ_NB_REQUESTS
 };
 
@@ -3443,6 +3458,7 @@
     struct finish_hook_chain_request finish_hook_chain_request;
     struct get_next_hook_request get_next_hook_request;
     struct set_clipboard_info_request set_clipboard_info_request;
+    struct open_token_request open_token_request;
 };
 union generic_reply
 {
@@ -3624,8 +3640,9 @@
     struct finish_hook_chain_reply finish_hook_chain_reply;
     struct get_next_hook_reply get_next_hook_reply;
     struct set_clipboard_info_reply set_clipboard_info_reply;
+    struct open_token_reply open_token_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 116
+#define SERVER_PROTOCOL_VERSION 117
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
Index: server/Makefile.in
===================================================================
RCS file: /home/wine/wine/server/Makefile.in,v
retrieving revision 1.46
diff -u -r1.46 Makefile.in
--- server/Makefile.in	23 Jun 2003 23:02:03 -0000	1.46
+++ server/Makefile.in	21 Jul 2003 09:32:05 -0000
@@ -39,6 +39,7 @@
 	sock.c \
 	thread.c \
 	timer.c \
+	token.c \
 	trace.c \
 	unicode.c \
 	user.c \
Index: server/process.c
===================================================================
RCS file: /home/wine/wine/server/process.c,v
retrieving revision 1.105
diff -u -r1.105 process.c
--- server/process.c	21 Jun 2003 02:07:10 -0000	1.105
+++ server/process.c	21 Jul 2003 09:32:05 -0000
@@ -268,6 +268,7 @@
     process->exe.filename    = NULL;
     process->group_id        = 0;
     list_init( &process->locks );
+    process->token           = create_token();
 
     gettimeofday( &process->start_time, NULL );
     if ((process->next = first_process) != NULL) process->next->prev = process;
@@ -405,6 +406,7 @@
     if (process->exe.file) release_object( process->exe.file );
     if (process->exe.filename) free( process->exe.filename );
     if (process->id) free_ptid( process->id );
+    if (process->token) release_object( process->token );
 }
 
 /* dump a process on stdout for debugging purposes */
Index: server/process.h
===================================================================
RCS file: /home/wine/wine/server/process.h,v
retrieving revision 1.37
diff -u -r1.37 process.h
--- server/process.h	18 Mar 2003 05:04:33 -0000	1.37
+++ server/process.h	21 Jul 2003 09:32:05 -0000
@@ -77,6 +77,7 @@
     struct process_dll   exe;             /* main exe file */
     void                *ldt_copy;        /* pointer to LDT copy in client addr space */
     void                *ldt_flags;       /* pointer to LDT flags in client addr space */
+    struct token        *token;           /* process's security token */
 };
 
 struct process_snapshot
Index: server/protocol.def
===================================================================
RCS file: /home/wine/wine/server/protocol.def,v
retrieving revision 1.76
diff -u -r1.76 protocol.def
--- server/protocol.def	11 Jul 2003 21:55:58 -0000	1.76
+++ server/protocol.def	21 Jul 2003 09:32:06 -0000
@@ -2152,6 +2152,15 @@
     unsigned int   seqno;           /* current sequence number */
 @END
 
+#define OPEN_TOKEN_THREAD   1
+#define OPEN_TOKEN_AS_SELF  2
+ at REQ(open_token)
+    obj_handle_t   handle;
+    unsigned int   flags;
+ at REPLY
+    obj_handle_t   handle;
+ at END
+
 #define SET_CB_OPEN      0x001
 #define SET_CB_OWNER     0x002
 #define SET_CB_VIEWER    0x004
Index: server/request.h
===================================================================
RCS file: /home/wine/wine/server/request.h,v
retrieving revision 1.86
diff -u -r1.86 request.h
--- server/request.h	23 Jun 2003 23:02:03 -0000	1.86
+++ server/request.h	21 Jul 2003 09:32:07 -0000
@@ -279,6 +279,7 @@
 DECL_HANDLER(finish_hook_chain);
 DECL_HANDLER(get_next_hook);
 DECL_HANDLER(set_clipboard_info);
+DECL_HANDLER(open_token);
 
 #ifdef WANT_REQUEST_HANDLERS
 
@@ -461,6 +462,7 @@
     (req_handler)req_finish_hook_chain,
     (req_handler)req_get_next_hook,
     (req_handler)req_set_clipboard_info,
+    (req_handler)req_open_token,
 };
 #endif  /* WANT_REQUEST_HANDLERS */
 
Index: server/thread.c
===================================================================
RCS file: /home/wine/wine/server/thread.c,v
retrieving revision 1.100
diff -u -r1.100 thread.c
--- server/thread.c	9 Jul 2003 02:57:57 -0000	1.100
+++ server/thread.c	21 Jul 2003 09:32:07 -0000
@@ -178,6 +178,8 @@
         return NULL;
     }
 
+    thread->token = (struct token *) grab_object( process->token );
+
     set_fd_events( thread->request_fd, POLLIN );  /* start listening to events */
     add_process_thread( thread->process, thread );
     return thread;
@@ -246,6 +248,7 @@
     cleanup_thread( thread );
     release_object( thread->process );
     if (thread->id) free_ptid( thread->id );
+    if( thread->token ) release_object( thread->token );
 }
 
 /* dump a thread on stdout for debugging purposes */
Index: server/thread.h
===================================================================
RCS file: /home/wine/wine/server/thread.h,v
retrieving revision 1.53
diff -u -r1.53 thread.h
--- server/thread.h	3 Jul 2003 18:16:48 -0000	1.53
+++ server/thread.h	21 Jul 2003 09:32:07 -0000
@@ -32,6 +32,7 @@
 struct debug_ctx;
 struct debug_event;
 struct msg_queue;
+struct token;
 
 enum run_state
 {
@@ -92,6 +93,7 @@
     int                    suspend;       /* suspend count */
     time_t                 creation_time; /* Thread creation time */
     time_t                 exit_time;     /* Thread exit time */
+    struct token          *token;         /* security token associated with this thread */
 };
 
 struct thread_snapshot
@@ -145,5 +147,8 @@
 static inline void clear_error(void)    { set_error(0); }
 
 static inline thread_id_t get_thread_id( struct thread *thread ) { return thread->id; }
+
+/* token functions */
+struct token *create_token( void );
 
 #endif  /* __WINE_SERVER_THREAD_H */
Index: server/trace.c
===================================================================
RCS file: /home/wine/wine/server/trace.c,v
retrieving revision 1.173
diff -u -r1.173 trace.c
--- server/trace.c	11 Jul 2003 21:55:58 -0000	1.173
+++ server/trace.c	21 Jul 2003 09:32:09 -0000
@@ -2486,6 +2486,17 @@
     fprintf( stderr, " seqno=%08x", req->seqno );
 }
 
+static void dump_open_token_request( const struct open_token_request *req )
+{
+    fprintf( stderr, " handle=%p,", req->handle );
+    fprintf( stderr, " flags=%08x", req->flags );
+}
+
+static void dump_open_token_reply( const struct open_token_reply *req )
+{
+    fprintf( stderr, " handle=%p", req->handle );
+}
+
 static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_new_process_request,
     (dump_func)dump_get_new_process_info_request,
@@ -2663,6 +2674,7 @@
     (dump_func)dump_finish_hook_chain_request,
     (dump_func)dump_get_next_hook_request,
     (dump_func)dump_set_clipboard_info_request,
+    (dump_func)dump_open_token_request,
 };
 
 static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -2842,6 +2854,7 @@
     (dump_func)0,
     (dump_func)dump_get_next_hook_reply,
     (dump_func)dump_set_clipboard_info_reply,
+    (dump_func)dump_open_token_reply,
 };
 
 static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -3021,6 +3034,7 @@
     "finish_hook_chain",
     "get_next_hook",
     "set_clipboard_info",
+    "open_token",
 };
 
 /* ### make_requests end ### */
--- /dev/null	1994-07-18 08:46:18.000000000 +0900
+++ server/token.c	2003-07-21 18:38:42.000000000 +0900
@@ -0,0 +1,103 @@
+/*
+ * Tokens
+ *
+ * Copyright (C) 1998 Alexandre Julliard
+ * Copyright (C) 2003 Mike McCormack
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "windef.h"
+
+#include "handle.h"
+#include "thread.h"
+#include "process.h"
+#include "request.h"
+
+struct token
+{
+    struct object  obj;             /* object header */
+};
+
+static void token_dump( struct object *obj, int verbose );
+static void token_destroy( struct object *obj );
+
+static const struct object_ops token_ops =
+{
+    sizeof(struct token),      /* size */
+    token_dump,                /* dump */
+    no_add_queue,              /* add_queue */
+    NULL,                      /* remove_queue */
+    NULL,                      /* signaled */
+    NULL,                      /* satified */
+    no_get_fd,                 /* get_fd */
+    token_destroy              /* destroy */
+};
+
+static void token_destroy( struct object *obj )
+{
+}
+
+struct token *get_token_obj( struct process *process, obj_handle_t handle, unsigned int access )
+{
+    return (struct token *)get_handle_obj( process, handle, access, &token_ops );
+}
+
+static void token_dump( struct object *obj, int verbose )
+{
+    struct token *token = (struct token *)obj;
+    assert( obj->ops == &token_ops );
+    fprintf( stderr, "token %p\n", token );
+}
+
+struct token *create_token( void )
+{
+    struct token *token = alloc_object( &token_ops );
+    return token;
+}
+
+DECL_HANDLER(open_token)
+{
+    if( req->flags & OPEN_TOKEN_THREAD )
+    {
+        struct thread *thread;
+        thread = get_thread_from_handle( req->handle, 0 );
+        if( thread )
+        {
+            reply->handle = alloc_handle( current->process, thread->token,
+                                           TOKEN_ALL_ACCESS, 0);
+            release_object( thread );
+        }
+    }
+    else
+    {
+        struct process *process;
+        process = get_process_from_handle( req->handle, 0 );
+        if( process )
+        {
+            reply->handle = alloc_handle( current->process, process->token,
+                                           TOKEN_ALL_ACCESS, 0);
+            release_object( process );
+        }
+    }
+}
+


More information about the wine-patches mailing list