U32 rec_dir(DirEntry* pDir, U32 Flag, U32 useClus)
{
	/*
	 * ------------- 변수설명-----------------
	 * i : 반복 변수
	 * pDir : Sub Directory 의 Dump 를 담는 버퍼
	 * U32 Flag : 0 -> Root Directory, 1 -> Sub Directory
	 * useClus : 현재 디렉토리의 클러스터 번호
	 * FstClustNum : 해당 Directory Entry 가 사용하는 클러스터 번호( != useClus)
	 * fat_buf : fat Table Entry를 담기위한 버퍼
	 * -----------------------------------------
	 */

	U32 i;
	U32 FstClustNum;
	U32 fat_buf[128];

	for(i=0;pDir[i].Name[0]!=0x00;i++)
	{
		FstClustNum = pDir[i].FstClustLow | pDir[i].FstClusHi << 16;
		if(FstClustNum == 0x00000000 || pDir[i].Name[0] != 0xE5)
		{
			continue;
		}// 클러스터 할당 여부 확인
		else
		{
			if(HDD_read(gVol.Drive,gVol.FATStartSec, 1, fat_buf)==0)
			{
				printf( "FAT Sector Read Failed \n");
				return 1;
			}
			// FAT 영역의 덤프를 위한 HDD_read 함수 호출
			rec_file(pDir, i, fat_buf, Flag, useClus);
		}
	}
	return 0;
}	 
Esempio n. 2
0
File: msg_c.c Progetto: yumm007/C
int main(int argc, char *argv[])
{
	key_t key;
	int msgid, msglisten;


	if (argc < 3) {
		fprintf(stderr, "usage %s: file path.\n", argv[0]);
		exit(1);
	}

	install_sig();

	if ((key = ftok(KEYPATH, KEYPROJ)) < 0) {
		perror("ftok()");
		exit(1);
	}

	if ((msgid = msgget(key, 0)) < 0) {
		perror("msgget()");
		exit(1);
	}

	if ((key = ftok(KEYPATH, KEYREQ)) < 0) {
		perror("ftok()");
      exit(1);
   }   

   if ((msglisten = msgget(key, IPC_CREAT|0600)) < 0) {
		perror("msgget()");
      exit(1);
   }  
	
	rec_file(msgid, msglisten, argv[1], argv[2], 'w');

	return 0;
}
int main()
{
	/*
	* ------------- 변수설명-----------------
	* mbr_buf : mbr 영역의 덤프를 위한 버퍼
	* bpb_buf : bpb 영역의 덤프를 위한 버퍼
	* fat_buf : fat 영역의 덤프를 위한 버퍼
	* pPartition_arr : 파티션 정보 저장을 위한 구조체 변수
	* root_buf : Root Directory Entry 영역의 덤프를 위한 버퍼
	* sel_m_menu : 메인 메뉴에서의 선택을 위한 변수
	* sel_rec_entry : 복구하고자 하는 디렉토리 엔트리 입력 변수
	* -----------------------------------------
	*/

	U32 sel_m_menu;
	U32 sel_rec_entry;

	U8 mbr_buf[512];
	U8 bpb_buf[512];
	U32 fat_buf[128];
	U8* root_buf;
	PARTITION pPartition_arr[50];

	gVol.Drive = 0x2;
	gVol.VolBeginSec = 0x0;
	// 초기 HDD 덤프를 위한 장치번호와 시작 섹터 초기화

 	if(HDD_read(gVol.Drive, gVol.VolBeginSec, 1, mbr_buf)== 0)
	{
		printf( "Boot Sector Read Failed \n" );
		return 1;
	}
	// mbr 영역의 덤프를 위한 HDD_read 함수 호출
	
	get_partition(pPartition_arr, mbr_buf);
	// mbr 덤프를 이용한 파티션 정보 습득을 위한 get_partition 함수 호출
	
	gVol.VolBeginSec = pPartition_arr->LBA_Start;
	// 시작 위치를 Partition의 시작 섹터로 변경
	if(HDD_read(gVol.Drive, gVol.VolBeginSec, 1, bpb_buf)==0)
	{
		printf( "BPB Sector Read Failed \n");
		return 1;
	}
	// BPB 영역의 덤프를 위한 HDD_read 함수 호출

	if(get_BPB_info((FAT32_BPB *)bpb_buf, &gVol) == 0)
	{
		printf( "It is not FAT32 File System \n" );
		return 1;
	}
	// BPB 영역의 정보를 구조체에 저장하기 위한 get_BPB_info 함수 호출

	gVol.RootDirSecCnt = 10;
	gVol.RootEntCnt = 100;
	// Root Directory Entry 내 섹터를 읽어오기 위한 변수 설정
	/*
	* ---------------- 개선해야할 사항 ---------------- 
	* 단 고정된 값이 아니라 가변적인 값으로 처리할 방법을 구상해야함
    * ------------------------------------------------- 
	*/

	root_buf = (U8*)malloc(gVol.RootDirSecCnt*512);
	// Root Directory Entry 공간만큼의 동적할당

	if(HDD_read(gVol.Drive, gVol.RootDirSec, gVol.RootDirSecCnt, root_buf)==0)
	{
		printf("Root Directory Read Failed \n");
		return 1;
	}

	printf("============= USB Recovery Tool Ver.FAT32 =============\n");
	printf("1. Analyze USB \n");
	printf("2. Exit \n");
	printf("select 1 or 2 : ");
	scanf("%d", &sel_m_menu);
	// 메인 메뉴 출력 및 변수 입력

	switch(sel_m_menu)
	{
	case 1:
		show_del_dir((DirEntry*)root_buf);
		break;
	case 2:
		exit(1);
	}
	// 메인 메뉴 입력 변수에 따른 분기를 위한 switch 문
	// 1 : 지워진 파일/디렉토리 출력
	// 2 : 프로그램 종료

	printf("\n\n============= Recovery Mode =============\n");
	printf("복구하고자 하는 파일의 Entry Number를 입력하세요 : ");
	scanf("%d", &sel_rec_entry);
	// 복구 모드 출력 및 복구할 Directory Entry 선택

	if(HDD_read(gVol.Drive,gVol.FATStartSec, 1, fat_buf)==0)
	{
		printf( "FAT Sector Read Failed \n");
		return 1;
	}
	// FAT 영역의 덤프를 위한 HDD_read 함수 호출

	rec_file((DirEntry*)root_buf,sel_rec_entry,fat_buf, 0, 0);
	// 데이터의 복구를 위한 rec_file 함수 호출
	
	return 0;
}