본문 바로가기
기술자료/Win32 MFC WinCE

Dos exe file Loader (Code/Text, BSS, Data area) 소스

by 와이즈캣 2019. 4. 7.
728x90
반응형
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 의 태스트 스위칭 테스트용 소스

728x90