#ifndef __KERNEL_PROC_H
#define __KERNEL_PROC_H
#ifdef __cplusplus
extern "C"
{
#endif
//#include <os/com.h>
#include <kernel/obj.h>
/*!
* \defgroup proc Process Services
* \ingroup kernel
* @{
*/
struct vm_area_t;
typedef struct process_t process_t;
struct process_info_t;
struct module_info_t;
struct file_t;
typedef struct module_t module_t;
struct module_t
{
module_t *prev, *next;
wchar_t *name;
addr_t base;
size_t length;
addr_t entry;
//void *raw_data;
struct file_t *file;
size_t sizeof_headers;
bool imported;
};
struct process_t
{
dword* page_dir;
module_t *mod_first, *mod_last;
addr_t stack_end, vmm_end;
byte level;
struct vm_area_t *first_vm_area, *last_vm_area;
struct process_info_t* info;
struct module_info_t* module_last;
marshal_map_t* marshal_map;
marshal_t last_marshal;
unsigned id;
semaphore_t sem_vmm;
};
process_t* procLoad(byte level, const wchar_t* file, const wchar_t* cmdline,
unsigned priority, struct file_t* input, struct file_t* output);
void procDelete(process_t* proc);
void procTerminate(process_t* proc);
process_t* procCurrent();
bool procPageFault(process_t* proc, addr_t virt);
module_t* peLoad(process_t* proc, const wchar_t* file, dword base);
module_t* peLoadMemory(process_t* proc, const wchar_t* file,
struct file_t *fd, dword base);
bool pePageFault(process_t* proc, module_t* mod, addr_t addr);
addr_t peGetExport(module_t* mod, const char* name);
void peUnload(process_t* proc, module_t* mod);
#include <os/pe.h>
//@}
#ifdef __cplusplus
}
#endif
#endif