지난 호에서 NTFS(New Technology File System)의 내부구조에 대해서 알아보았는데 실제로 삭제된 파일을 복구하기 위해서 어디서부터 어떻게 개발해야 할지 막막한 느낌이 없지 않을 것이다. 가장 먼저 해야 할 일은 부트섹터를 읽어 들이는 것이다. 이 자료를 바탕으로 볼륨 전체의 경계선(boundary) 정보를 추출하고 MFT와 MFT Mirror는 어디서부터 시작되는지, 클러스터의 크기는 얼마인지 등에 대해 알아낼 수 있다.
그 후 MFT 파일레코드를 순차적으로(또는 임의로) 읽어 들여 삭제된 파일을 목록화한다. 이 때는 파일명을 기준으로 정렬하되, 날짜, 크기, 파일 내용 등 삭제된 파일을 복구하는데 필요한 정보들을 구조체 또는 클래스로 개발해 궁극적으로는 사용자들이 복구할 파일이나 폴더를 선택할 수 있는 <화면 1>과 같은 형태로 시각적으로 보여줘야 한다.
윈도우 NT, 윈도우 2000 그리고 윈도우 XP용 파일시스템과 필터 드라이버를 개발하는데 필요한 NT IFS(Installable File System) 헤더 파일은 전체가 8000줄 정도로 다소 간단한 편이다. 그러나 이번 호에 구현하는 것은 디스크 드라이버에서 읽은 섹터 내용을 참고해 NTFS를 직접 구성하고 읽어 들이는 방식이므로 이렇게 많은 코드가 필요치 않다. 여기서는 이 파일 가운데 꼭 필요한 내용을 중심으로 NTFS의 내부 자료구조들을 구조체로 정의해본다.
먼저 다음과 같은 새로운 자료형을 정의하자. 식별이 용이하도록 기존 자료형인 UCHAR, USHORT, ULONG, ULONGLONG, USN을 U8, U16, U32, U64, U64로 정의한다. 여기서 8, 16, 32, 64는 비트 수를 의미하며, 각각 1바이트, 2바이트, 4바이트, 8바이트이다. BOOLEAN은 참, 거짓을 1과 0으로 식별할 수 있는 자료형으로, 여기서는 간단하게 TF라고 재정의하자.
typedef BOOLEAN TF;
typedef UCHAR U8;
typedef USHORT U16;
typedef ULONG U32;
typedef ULONGLONG U64;
typedef USN U64;
다음은 NTFS의 레코드 헤더를 구조체로 정의한 것이다. Type에는 레코드 헤더의 매직넘버 즉 ‘FILE’이라는 식별자가 들어간다(실제로 읽어 들일 때에는 ‘ELIF’로 순서가 바뀐다). UsaOffset은 업데이트 시퀀스(Update Sequence)에 대한 오프셋이고 UsaCount는 USN(Update Sequence Number)과 배열의 워드 크기이다. Usn은 $LogFile의 시퀀스 번호(LSN)이며 NTFS_RECORD_HEADER는 구조체 변수, PNTFS_RECORD_HEADER는 구조체의 포인터 변수다.
출처 : 마이크로소프트웨어