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; }
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; }