wininet: Don't depend on is_end_of_read_data in HTTPREQ_Read.
[wine] / server / process.h
index 27ea25f..da51a0e 100644 (file)
@@ -15,7 +15,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
 #ifndef __WINE_SERVER_PROCESS_H
@@ -23,8 +23,8 @@
 
 #include "object.h"
 
-struct msg_queue;
 struct atom_table;
+struct handle_table;
 struct startup_info;
 
 /* process startup state */
@@ -34,45 +34,53 @@ enum startup_state { STARTUP_IN_PROGRESS, STARTUP_DONE, STARTUP_ABORTED };
 
 struct process_dll
 {
-    struct process_dll  *next;            /* per-process dll list */
-    struct process_dll  *prev;
-    struct file         *file;            /* dll file */
-    void                *base;            /* dll base address (in process addr space) */
-    size_t               size;            /* dll size */
-    void                *name;            /* ptr to ptr to name (in process addr space) */
+    struct list          entry;           /* entry in per-process dll list */
+    struct mapping      *mapping;         /* dll file */
+    mod_handle_t         base;            /* dll base address (in process addr space) */
+    client_ptr_t         name;            /* ptr to ptr to name (in process addr space) */
+    data_size_t          size;            /* dll size */
     int                  dbg_offset;      /* debug info offset */
     int                  dbg_size;        /* debug info size */
-    size_t               namelen;         /* length of dll file name */
-    char                *filename;        /* dll file name */
+    data_size_t          namelen;         /* length of dll file name */
+    WCHAR               *filename;        /* dll file name */
 };
 
 struct process
 {
     struct object        obj;             /* object header */
-    struct process      *next;            /* system-wide process list */
-    struct process      *prev;
+    struct list          entry;           /* entry in system-wide process list */
     struct process      *parent;          /* parent process */
-    struct thread       *thread_list;     /* head of the thread list */
+    struct list          thread_list;     /* thread list */
     struct thread       *debugger;        /* thread debugging this process */
-    struct object       *handles;         /* handle entries */
+    struct handle_table *handles;         /* handle entries */
+    struct fd           *msg_fd;          /* fd for sendmsg/recvmsg */
+    process_id_t         id;              /* id of the process */
+    process_id_t         group_id;        /* group id of the process */
+    struct timeout_user *sigkill_timeout; /* timeout for final SIGKILL */
+    enum cpu_type        cpu;             /* client CPU type */
+    int                  unix_pid;        /* Unix pid for final SIGKILL */
     int                  exit_code;       /* process exit code */
     int                  running_threads; /* number of threads running in this process */
-    struct timeval       start_time;      /* absolute time at process start */
-    struct timeval       end_time;        /* absolute time at process end */
+    timeout_t            start_time;      /* absolute time at process start */
+    timeout_t            end_time;        /* absolute time at process end */
+    affinity_t           affinity;        /* process affinity mask */
     int                  priority;        /* priority class */
-    int                  affinity;        /* process affinity mask */
     int                  suspend;         /* global process suspend count */
-    int                  create_flags;    /* process creation flags */
+    int                  is_system;       /* is it a system process? */
+    unsigned int         create_flags;    /* process creation flags */
+    struct list          locks;           /* list of file locks owned by the process */
+    struct list          classes;         /* window classes owned by the process */
     struct console_input*console;         /* console input */
     enum startup_state   startup_state;   /* startup state */
     struct startup_info *startup_info;    /* startup info while init is in progress */
     struct event        *idle_event;      /* event for input idle */
-    struct msg_queue    *queue;           /* main message queue */
-    struct atom_table   *atom_table;      /* pointer to local atom table */
-    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 */
-    void                *group_id;        /* group ID of the process */
+    obj_handle_t         winstation;      /* main handle to process window station */
+    obj_handle_t         desktop;         /* handle to desktop to use for new threads */
+    struct token        *token;           /* security token associated with this process */
+    struct list          dlls;            /* list of loaded dlls */
+    client_ptr_t         peb;             /* PEB address in client address space */
+    client_ptr_t         ldt_copy;        /* pointer to LDT copy in client addr space */
+    unsigned int         trace_data;      /* opaque data used by the process tracing mechanism */
 };
 
 struct process_snapshot
@@ -81,23 +89,25 @@ struct process_snapshot
     int             count;    /* process refcount */
     int             threads;  /* number of threads */
     int             priority; /* priority class */
+    int             handles;  /* number of handles */
 };
 
-struct module_snapshot
-{
-    void           *base;     /* module base addr */
-    size_t          size;     /* module size */
-    size_t          namelen;  /* length of file name */
-    char           *filename; /* module file name */
-};
+#define CPU_FLAG(cpu) (1 << (cpu))
+#define CPU_64BIT_MASK CPU_FLAG(CPU_x86_64)
 
 /* process functions */
 
-extern struct thread *create_process( int fd );
-extern struct process *get_process_from_id( void *id );
+extern unsigned int alloc_ptid( void *ptr );
+extern void free_ptid( unsigned int id );
+extern void *get_ptid_entry( unsigned int id );
+extern struct thread *create_process( int fd, struct thread *parent_thread, int inherit_all );
+extern data_size_t init_process( struct thread *thread );
+extern struct thread *get_process_first_thread( struct process *process );
+extern struct process *get_process_from_id( process_id_t id );
 extern struct process *get_process_from_handle( obj_handle_t handle, unsigned int access );
 extern int process_set_debugger( struct process *process, struct thread *thread );
 extern int debugger_detach( struct process* process, struct thread* debugger );
+extern int set_process_debug_flag( struct process *process, int flag );
 
 extern void add_process_thread( struct process *process,
                                 struct thread *thread );
@@ -105,18 +115,45 @@ extern void remove_process_thread( struct process *process,
                                    struct thread *thread );
 extern void suspend_process( struct process *process );
 extern void resume_process( struct process *process );
-extern void kill_process( struct process *process, struct thread *skip, int exit_code );
+extern void kill_process( struct process *process, int violent_death );
 extern void kill_console_processes( struct thread *renderer, int exit_code );
 extern void kill_debugged_processes( struct thread *debugger, int exit_code );
+extern void break_process( struct process *process );
 extern void detach_debugged_processes( struct thread *debugger );
 extern struct process_snapshot *process_snap( int *count );
-extern struct module_snapshot *module_snap( struct process *process, int *count );
 extern void enum_processes( int (*cb)(struct process*, void*), void *user);
 
-inline static void *get_process_id( struct process *process ) { return process; }
-inline static int is_process_init_done( struct process *process )
+/* console functions */
+extern void inherit_console(struct thread *parent_thread, struct process *process, obj_handle_t hconin);
+extern int free_console( struct process *process );
+extern struct thread *console_get_renderer( struct console_input *console );
+
+/* process tracing mechanism to use */
+#ifdef __APPLE__
+#define USE_MACH
+#elif defined(__sun)
+#define USE_PROCFS
+#else
+#define USE_PTRACE
+#endif
+
+extern void init_tracing_mechanism(void);
+extern void init_process_tracing( struct process *process );
+extern void finish_process_tracing( struct process *process );
+extern int read_process_memory( struct process *process, client_ptr_t ptr, data_size_t size, char *dest );
+extern int write_process_memory( struct process *process, client_ptr_t ptr, data_size_t size, const char *src );
+
+static inline process_id_t get_process_id( struct process *process ) { return process->id; }
+
+static inline int is_process_init_done( struct process *process )
 {
     return process->startup_state == STARTUP_DONE;
 }
 
+static inline struct process_dll *get_process_exe_module( struct process *process )
+{
+    struct list *ptr = list_head( &process->dlls );
+    return ptr ? LIST_ENTRY( ptr, struct process_dll, entry ) : NULL;
+}
+
 #endif  /* __WINE_SERVER_PROCESS_H */