⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sys_execve.c

📁 阿基米德操作系统的源代码
💻 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 + -