#include <os/os.h> #include <os/pe.h> void conClose(); //! Starts a new process /*! * Creates a new process, loads the specified executable, and starts * execution, passing the command line provided. * * \param filespec The path to the executable required. * \param cmdline The command line to pass to the process, or NULL if * no command line is needed. * \return A handle to the new process, or NULL if the process could not * be started. */ addr_t procLoad(const wchar_t* filespec, const wchar_t* cmdline, unsigned priority, addr_t input, addr_t output) { dword ret; asm("int $0x30" : "=a" (ret) : "a" (0x200), "b" (filespec), "c" (cmdline), "d" (priority), "S" (input), "D" (output)); return ret; } //! Terminates the current process. /*! * Terminates all running threads and frees any resources (objects, files, * memory, etc.) opened by the process. * \return Does not return; the process is terminated. */ void procExit() { /*process_info_t* proc = thrGetInfo()->process; module_info_t* mod; IMAGE_DOS_HEADER* dos; IMAGE_PE_HEADERS* pe; for (mod = proc->module_first; mod; mod = mod->next) { dos = (IMAGE_DOS_HEADER*) mod->base; pe = (IMAGE_PE_HEADERS*) (mod->base + dos->e_magic); }*/ conClose(); asm("int $0x30" : : "a" (3)); } //! Returns a handle to the current process. /*! \return A handle to the current process. */ dword procCurrentId() { dword ret; asm("int $0x30" : "=a" (ret) : "a" (0x201)); return ret; } //! Returns a pointer to the command line passed to the current process. /*! * The pointer returned is not const and refers to an area within the * process's information block (or elsewhere, if it is too long to * fit in the same 4KB page). Hence, it is possible to modify the * process's command line. * \return A pointer to the command line passed to the current process. */ wchar_t* procCmdLine() { return thrGetInfo()->process->cmdline; } //! Returns a pointer to the process's current working directory. /*! * The pointer returned is not const and refers to an area within the * process's information block. Modifying the buffer returned will * change the process's working directory. * \return A pointer to the current process's working directory. */ wchar_t* procCwd() { return thrGetInfo()->process->cwd; } addr_t procBase() { return thrGetInfo()->process->base; }