한땀한땀 정성들인 코딩
파일관리 본문
파일시스템 정의
-os에서 보조기억장치에 저장되는 파일을 관리하는 자료구조
윈도우
파일할당 테이블 FAT
-속해 있는 영역
-여유공간
-저장되어있는 디스크
FAT32
-윈도우98
-속도빠름
-파일 4gb이상 사용불가
-드라이브 32gb사용 불가
NTFS
-윈도우 xp
-보안성
-대용량 파일
-사용자 제한
FAT
-부트레코드 : 볼륨의 첫번쨰 섹터
-파일 할당 테이블 : 클러스터를 관리하는 테이블 저장공간
-루트 디렉토리 : fat16에만
출처: http://hyd3.tistory.com/125 [hYd3's Diary]
fat의 구조
출처: http://hyd3.tistory.com/125 [hYd3's Diary]
출처: http://hyd3.tistory.com/125 [hYd3's Diary]
http://hyd3.tistory.com/125
NTFS
-부트레코드
-윈도우 부팅을 위한 기계어코드
-볼륨의 크기
-크럴스터 크기
-MFT시작주소
-1개의 섹터
-마스터 파일 테이블 MFT
-파일,디렉터리정보
-MFT entry의 집합
-MFT entry는 하나의 파일,디렉토리에 대한 내용
-파일의 정보가 많은경우 여러개의 MFT entry사용
-0~16 entry는 시스템 파일용
-데이터영역
-클러스터 단위로 읽기 쓰기 진행
#define U8 unsigned char
#define S8 char
#define U16 unsigned short
#define U32 unsigned int
#define S32 int
#define U64 unsigned __int64
typedef struct _VOL_struct{
U32 Drive;
U64 VolBeginSec;
U64 MFTStartSec;
U64 MFTMirrStartSec;
U32 ClusSize;
U32 SecPerClus;
U64 TotalSec;
U32 SizeOfMFTEntry;
U32 SizeOfIndexRecord;
}Volstruct;
#pragma pack(1)
typedef struct _NTFS_BPB_struct{
U8 JmpBoot[3];
U8 OEMName[8];
U16 BytsPerSec;
U8 SecPerClus;
U16 RsvdSecCnt;
U8 Unused1[5];
U8 Media;
U8 Unsed2[18];
U64 TotalSector;
U64 StartOfMFT;
U64 StartOfMFTMirr;
S8 SizeOfMFTEntry;
U8 Unused3[3];
S8 SizeOfIndexRecord;
U8 Unused4[3];
U64 SerialNumber;
U32 Unused;
U8 BootCodeArea[426];
U16 Signature;
}NTFS_BPB;
#pragma pack()
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include "ntfs.h"
U32 HDD_read(U8 drv, U32 SecAddr, U32 blocks, U8* buf);
U32 get_BPB_info(NTFS_BPB* pBPB, Volstruct * pVol);
Volstruct gVol;
int main(void){
NTFS_BPB boot;
gVol.Drive = 0x0; //드라이브 설정
gVol.VolBeginSec = 0x800; //섹터 설정
//저장 장치로부터 부트 레코드가 담긴 섹터를 읽어 메모리로 올림
if(HDD_read(gVol.Drive, gVol.VolBeginSec, 1, (U8*) &boot) == 0){
printf("Boot Sector Read Failed \n");
return 1;
}
get_BPB_info(&boot, &gVol); // 읽어 들인 정보 분석
printf("[[[[[ Volume Information ]]]]]\n"); //정보 출력
printf("Total Sector \t = %I64d\n", gVol.TotalSec);
printf("Cluster Size \t = %d\n", gVol.ClusSize);
printf("MFT Start Sec \t = %d \n", gVol.MFTStartSec);
printf("MFTMIRR Start Sec \t =%d \n", gVol.MFTMirrStartSec);
printf("Size of MFT Entry \t = %d\n", gVol.SizeOfMFTEntry);
printf("Size of Index Record \t = %d\n",gVol.SizeOfIndexRecord);
return 0;
}
U32 get_BPB_info(NTFS_BPB* pBPB, Volstruct* pVol){
pVol->ClusSize = pBPB->SecPerClus * pBPB->BytsPerSec;
pVol->SecPerClus = pBPB->SecPerClus;
pVol->MFTStartSec = pBPB->StartOfMFT * pBPB->SecPerClus + pVol->VolBeginSec;
pVol->MFTMirrStartSec = pBPB->StartOfMFTMirr * pBPB->SecPerClus + pVol->VolBeginSec;
pVol->TotalSec = pBPB->TotalSector;
if(pBPB->SizeOfMFTEntry < 0){
pVol->SizeOfMFTEntry = 1 << (pBPB->SizeOfMFTEntry * -1);
}else{
pVol->SizeOfMFTEntry = pBPB->SizeOfMFTEntry * pVol->ClusSize;
}
pVol->SizeOfIndexRecord = pBPB->SizeOfIndexRecord * pVol->ClusSize;
return 1;
}
U32 HDD_read (U8 drv, U32 SecAddr, U32 blocks, U8* buf){
U32 ret;
U32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread;
char cur_drv[100];
HANDLE g_hDevice;
sprintf_s(cur_drv,sizeof(cur_drv),"\\\\.\\PhysicalDrive%d",(U32)drv);
g_hDevice=CreateFile(cur_drv, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(g_hDevice==INVALID_HANDLE_VALUE) return 0;
ldistanceLow = SecAddr << 9;
ldistanceHigh = SecAddr >> (32 - 9);
dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN);
if(dwpointer != 0xFFFFFFFF) {
bytestoread = blocks * 512;
ret = ReadFile(g_hDevice, buf, bytestoread, (unsigned long*)&numread, NULL);
if(ret) ret = 1;
else ret = 0;
}
CloseHandle(g_hDevice);
return ret;
}
부트 레코드를 읽는 코드