/* get the next process in the snapshot */ static int snapshot_next_process( struct snapshot *snapshot, struct next_process_reply *reply ) { struct process_snapshot *ptr; struct process_dll *exe_module; if (!snapshot->process_count) { set_error( STATUS_INVALID_PARAMETER ); /* FIXME */ return 0; } if (snapshot->process_pos >= snapshot->process_count) { set_error( STATUS_NO_MORE_FILES ); return 0; } ptr = &snapshot->processes[snapshot->process_pos++]; reply->count = ptr->count; reply->pid = get_process_id( ptr->process ); reply->ppid = ptr->process->parent ? get_process_id( ptr->process->parent ) : 0; reply->threads = ptr->threads; reply->priority = ptr->priority; reply->handles = ptr->handles; reply->unix_pid = ptr->process->unix_pid; if ((exe_module = get_process_exe_module( ptr->process )) && exe_module->filename) { data_size_t len = min( exe_module->namelen, get_reply_max_size() ); set_reply_data( exe_module->filename, len ); } return 1; }
static int fill_create_process_event( struct debug_event *event, const void *arg ) { struct process *debugger = event->debugger->process; struct thread *thread = event->sender; struct process *process = thread->process; struct process_dll *exe_module = get_process_exe_module( process ); const client_ptr_t *entry = arg; obj_handle_t handle; /* documented: PROCESS_VM_READ | PROCESS_VM_WRITE */ if (!(handle = alloc_handle( debugger, process, PROCESS_ALL_ACCESS, 0 ))) return 0; event->data.create_process.process = handle; /* documented: THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME */ if (!(handle = alloc_handle( debugger, thread, THREAD_ALL_ACCESS, 0 ))) { close_handle( debugger, event->data.create_process.process ); return 0; } event->data.create_process.thread = handle; event->data.create_process.file = 0; event->data.create_process.teb = thread->teb; event->data.create_process.base = exe_module->base; event->data.create_process.start = *entry; event->data.create_process.dbg_offset = exe_module->dbg_offset; event->data.create_process.dbg_size = exe_module->dbg_size; event->data.create_process.name = exe_module->name; event->data.create_process.unicode = 1; if (exe_module->mapping) /* the doc says write access too, but this doesn't seem a good idea */ event->data.create_process.file = open_mapping_file( debugger, exe_module->mapping, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE ); return 1; }