📄 sys_execve.c
字号:
//////////////////////////////////////////////////////////////////////////
#include "general.h"
#include "elfhdr.h"
#include "elf_phdr.h"
#include "hd_info_struct.h"
#include "dir_entry.h"
#include "msdos_dir_entry.h"
#include "d_inode.h"
#include "m_inode.h"
#include "buffer_head.h"
#include "fat_cache.h"
#include "file.h"
#include "hd_request_struct.h"
#include "super_block.h"
#include "common_head.h"
///////////////////////////////////////////////////////////////////////////////////////////////////
int sys_execve(long none_0, long none_1, unsigned char * arg_ptr)
{
int temp_fileno;
int temp_Ret;
struct elfhdr *temp_elfhdr;
struct elf_phdr *temp_elfphdr;
unsigned char *temp_pChar;
unsigned long temp_eentry;
unsigned long temp_ephoff;
unsigned long temp_eehsize;
unsigned long temp_ephentsize;
unsigned long temp_ephnum;
unsigned long temp_ephsize;
int temp_i, temp_j, temp_k;
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
SHUTDOWN_files();
set_kernel_gs();
create_stack((unsigned char *)0x8800000, (unsigned char *)arg_ptr);
temp_pChar = exec_argptr;
while (*temp_pChar != 0)
{
if ((*temp_pChar == '/') ||
(*temp_pChar == ':') ||
(*temp_pChar == '|') ||
(*temp_pChar == '*') ||
(*temp_pChar == '?'))
return -1;
temp_pChar++;
}
if ((temp_fileno = sys1_open(exec_argptr, O_RDONLY, 0)) < 0)
return -1;
temp_Ret = sys1_read(temp_fileno, exec_buffer, 4096);
if (temp_Ret < 52)
{
sys1_close(temp_fileno);
return -1;
}
temp_elfhdr = (struct elfhdr *)exec_buffer;
if ((temp_elfhdr->e_ident[0] != 0x7f) ||
(temp_elfhdr->e_ident[1] != 'E') ||
(temp_elfhdr->e_ident[2] != 'L') ||
(temp_elfhdr->e_ident[3] != 'F') ||
(temp_elfhdr->e_ident[4] != 0x01) ||
(temp_elfhdr->e_ident[5] != 0x01) ||
(temp_elfhdr->e_ident[6] != 0x01) ||
///////////////////////////////////////
(temp_elfhdr->e_type != ET_EXEC) ||
((temp_elfhdr->e_machine != EM_386)&&
(temp_elfhdr->e_machine != EM_486)) ||
(temp_elfhdr->e_version != 0x01) ||
(temp_elfhdr->e_flags != 0x00) ||
(temp_elfhdr->e_ehsize != 0x34) ||
(temp_elfhdr->e_phentsize!= 0x20) ||
(temp_elfhdr->e_phnum > 0x80))
{
sys1_close(temp_fileno);
return -1;
}
temp_eentry = temp_elfhdr->e_entry;
temp_ephoff = temp_elfhdr->e_phoff;
temp_eehsize = temp_elfhdr->e_ehsize;
temp_ephentsize = temp_elfhdr->e_phentsize;
temp_ephnum = temp_elfhdr->e_phnum;
temp_ephsize = temp_ephentsize * temp_ephnum;
temp_Ret = sys1_lseek(temp_fileno, temp_ephoff, 0);
if (temp_Ret < 0)
{
sys1_close(temp_fileno);
return -1;
}
temp_Ret = sys1_read(temp_fileno, exec_buffer, 4096);
if (temp_Ret < temp_ephsize)
{
sys1_close(temp_fileno);
return -1;
}
temp_elfphdr = (struct elf_phdr *)exec_buffer;
for (temp_i = 0; temp_i < temp_ephnum; temp_i++)
{
if ((temp_elfphdr->p_type == PT_LOAD) && (temp_elfphdr->p_filesz != 0))
{
temp_Ret = sys1_lseek(temp_fileno, temp_elfphdr->p_offset, 0);
if (temp_Ret < 0)
{
sys1_close(temp_fileno);
return -1;
}
temp_Ret = sys1_read(temp_fileno, (char *)(temp_elfphdr->p_vaddr + 0x800000), temp_elfphdr->p_filesz);
if (temp_Ret != temp_elfphdr->p_filesz)
{
sys1_close(temp_fileno);
return -1;
}
temp_pChar = (unsigned char *)(temp_elfphdr->p_vaddr + temp_elfphdr->p_filesz + 0x800000);
temp_k = temp_elfphdr->p_memsz - temp_elfphdr->p_filesz;
for (temp_j = 0; temp_j < temp_k; temp_j++)
*temp_pChar++ = 0x00;
}
temp_elfphdr++;
}
sys1_close(temp_fileno);
backup_env(temp_eentry);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
int sys_exit(long none_0, long none_1)
{
SHUTDOWN_files();
restore_env();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -