#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 IModule;
struct IPager;
struct vm_area_t;
typedef struct process_t process_t;
struct process_info_t;
struct module_info_t;
struct process_t
{
dword* page_dir;
struct IModule *modules[10];
struct IPager* stack_pager;
addr_t stack_end, vmm_end;
byte level;
int num_modules;
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;
};
process_t* procLoad(byte level, const wchar_t* file, const wchar_t* cmdline);
void procDelete(process_t* proc);
void procTerminate(process_t* proc);
process_t* procCurrent();
#undef INTERFACE
#define INTERFACE IModule
//! Implements an executable module in the kernel.
/*!
* Modules, such as executables (EXEs) and dynamic libraries (DLLs) are
* treated transparently by the kernel by handling them as IModule
* interfaces (IPager is also used, to allow modules to load themselves
* on demand).
*
* Modules are loaded using the modLoadXXX() functions, which, given the name
* of a file, are expected to return an IModule interface to a module
* object if successful. This will then be used later by the kernel to
* import and export functions and, in the case of executables, to run
* processes.
*
* Currently only the PE (Portable Executable) format is supported.
* Theoretically any module format could be supported; to be used as a
* dynamically-linked library format, a module must be capable of
* exporting named functions.
*
* \implement If you are adding a new module format to the kernel.
* \use If you are accessing module attributes (such as exported function
* or module base addresses) from the kernel.
*/
DECLARE_INTERFACE(IModule)
{
STDMETHOD(QueryInterface)(THIS_ REFIID iid, void ** ppvObject) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
//! Retrieves the main entry point for the module.
/*!
* For executables this is the address where execution of the main thread
* will begin.
*
* For DLLs this is the address of the DLLMain function, which will be
* called when the module is loaded.
* \return The entry point of the module in the process's address space.
*/
STDMETHOD_(const void*, GetEntryPoint)(THIS) PURE;
//! Retrieves the base address of the module.
/*!
* This may be different to the base originally specified if the module
* has been relocated.
* \return The base address of the module in the process's address space.
*/
STDMETHOD_(const void*, GetBase)(THIS) PURE;
//! Retrieves the address of a named function exported by a module.
/*!
* In order to support dynamic linking, modules may support the ability to
* name functions that are accessible by other modules. This function
* allows the kernel to import functions by name.
* \param proc The name of the function, in 8-bit character format
* \return The address of the function, or NULL if the function was not
* found.
*/
STDMETHOD_(const void*, GetProcAddress)(THIS_ const char* proc) PURE;
//! Retrieves the name of the module.
/*!
* The module name is used to identify the module within a particular
* process.
* \param name Points to a buffer which will receive the module's name
* \param max Specifies the size of the buffer, in characters
* \return S_OK if successful, or a failure code.
*/
STDMETHOD(GetName)(THIS_ wchar_t* name, size_t max) PURE;
};
IModule* modLoadPe(process_t* proc, const wchar_t* file, dword base);
IModule* modLoadPeMemory(process_t* proc, const wchar_t* file, const void* ptr, dword base);
// {816B7D52-910A-4187-AEF6-F30EFEFE4AEE}
DEFINE_GUID(IID_IModule,
0x816b7d52, 0x910a, 0x4187, 0xae, 0xf6, 0xf3, 0xe, 0xfe, 0xfe, 0x4a, 0xee);
#include <os/pe.h>
//@}
#ifdef __cplusplus
}
#endif
#endif