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