기술자료/Win32 MFC WinCE
Dos exe file Loader (Code/Text, BSS, Data area) 소스
by 와이즈캣
2019. 4. 7.
static unsigned char *mem; // 동적할당의 시작 위치
static unsigned char *mem_end; // 동적할당의 끝 위치
static unsigned char *code; // 프로그램 저장공간의 시작 위치 - Code
static unsigned char *data; // 프로그램 저장공간의 시작 위치 - Data
static unsigned char Load_Flag; // 프로그램이 로드 유무 표시
static unsigned char Display_Flag; // 메모리 값 출력시 계속해서 출력하는
// 경우를 위해
static unsigned char File_Name[255]; // 읽어올 파일 이름의 임시 저장소
static int File_DS; // 저수준 파일의 데스크립터
static context stat_old; // 기존의 레지스터 값 저장 |
void load() // Program Load Function
/*******************************************************************************
기능 : 프로그램의 이름을 입력받아 그 프로그램을 64K만큼 할당한 임의의 주소
공간에 적재
인수 : void
반환값 : void
*******************************************************************************/
{
int Read_Num;
int Header_Size;
int Total_Read=0;
IMAGE_DOS_HEADER *dhp;
IMAGE_NT_HEADERS *php;
IMAGE_FILE_HEADER *fhp;
IMAGE_OPTIONAL_HEADER32 *ohp;
Clear_mem();
printf("\n읽어 들일 파일 이름을 입력하세요 : ");
Read_Num = read(stdin, File_Name,sizeof(File_Name));
File_Name[Read_Num-1] = 0; File_DS = open(File_Name, O_RDONLY | O_BINARY);
if (0 > File_DS) { printf("파일을 찾을 수 없거나 읽을 수 없습니다.\n"); printf("파일이 존재하는지 확인해 주세요.\n"); printf("(경로명 사이에 '\'를 '\\'로 바꾸어 보십시오)\n"); return; } else { Read_Num = read(File_DS, code, MAX_PROGRAM_SIZE); }
if(0 > Read_Num) { printf("파일이 존재하지만 읽을 수 없습니다.\n"); close(File_DS); return; } else { Total_Read = Total_Read + Read_Num; dhp = (IMAGE_DOS_HEADER *)code; php = (IMAGE_NT_HEADERS *)(code+(dhp->e_lfanew)); fhp = (IMAGE_FILE_HEADER *)((char *)php+sizeof(php->Signature)); ohp = ( IMAGE_OPTIONAL_HEADER32 *) ((char *)fhp+sizeof(IMAGE_FILE_HEADER) ); Header_Size = ohp->SizeOfHeaders; Clear_mem(); }
if (0 > lseek(File_DS, Header_Size, SEEK_SET)) { printf("파일의 헤더정보 Skip 실패!!\n"); printf("파일을 적재할 수 없습니다..\n"); close(File_DS); return; } else { Read_Num = read(File_DS, code, SECTION_SIZE); }
if(0 > Read_Num) { printf("파일이 존재하지만 읽을 수 없습니다.\n"); close(File_DS); return; } else { Total_Read = Total_Read + Read_Num; Read_Num = read(File_DS, data, SECTION_SIZE); }
close(File_DS);
if (0 > Read_Num) { printf("파일이 존재하지만 읽을 수 없습니다.\n"); return; } else { Total_Read = Total_Read + Read_Num; File_DS = 0; Load_Flag = 1; printf("파일을 성공적으로 메모리에 적재하였습니다.\n"); printf("읽어 들인 파일의 크기는 [%d]Bytes입니다.\n\n", Total_Read); }
return; }
|
본 내용은 x86 assembly 의 태스트 스위칭 테스트용 소스