Programming2008. 12. 3. 11:50
 

윈도우는 크게 윈도우 95, 98, ME 등의 9x 계열과 윈도우 NT, 2000, XP, 2003 등의 NT 계열로 구분된다. 이것은 파일복구 소프트웨어를 구현하는 과정에서도 매우 중요한 고려사항인데, 두 계열이 디스크에 대한 접근 방식이 서로 다르기 때문이다. 디스크는 크게 논리적 볼륨과 물리적 볼륨으로 나누어 생각할 수 있다. 논리적 볼륨은 파티션의 시작을 0으로 보는 것이고 물리적 볼륨은 디스크의 시작을 0으로 보는 것이다. 여기서 0은 오프셋 섹터(Offset Sector)를 의미하며 디스크에 물리적으로 접근할 것인지 논리적으로 접근할 것인지에 따라 차이가 있다.
예를 들어 디스크에 2개의 드라이브 즉 C:와 D:가 존재하고 디스크의 섹터수는 총 100개라면 물리적 볼륨은 0부터 99가 된다. 반면 논리적 볼륨은 C 드라이브의 경우 0부터 49가 되고 D드라이브는 50부터 99가 아닌 0부터 49가 된다. 이것은 C 드라이브라는 논리적 볼륨과 D 드라이브라는 논리적 볼륨의 오프셋 섹터가 각각 0부터 시작되기 때문이다. 물리적 볼륨은 디스크 전체에 대하여 오프셋 섹터가 0부터 시작하므로 어떤 볼륨으로 할 것인지 여부가 무의미하다. 다만 해당 볼륨의 위치부터 0으로 간주해 별도의 처리를 해야 한다. 따라서 디스크를 논리 드라이브 단위로 액세스한다면 논리 C 드라이브를 읽어들일 것인지 D 드라이브로 읽어들일 것인지 결정하는 것이 중요하다.

윈도우 9x와 NT 계열 판별하기
한편 9x 계열과 NT 계열의 차이는 앞서 살펴본 바와 같이 물리적 볼륨과 논리적 볼륨에 대한 함수 인터페이스가 동일한 지에 대한 여부이다. NT 계열은 물리적으로 디스크에 액세스하든 논리적으로 디스크에 액세스하든 입출력 장치제어 API 함수를 호출해 사용하지만, 9x 계열은 논리 볼륨에 대한 액세스의 경우 FAT 파일 시스템의 파일할당 테이블의 비트 깊이가 12인지 16인지 32인지에 따라 각각 다른 방법으로 접근해야 하고 그 외의 파일 시스템은 모두 물리 볼륨에 대한 액세스로 해야 한다. 이 때 물리 볼륨에 대한 액세스는 지난 호에 설명한 썽킹(thunking) 레이어 방식 등을 이용해 16비트와 32비트 DLL을 각각 별도로 빌드하여 연결고리가 있는 부메랑처럼 디스크를 액세스한다.
9x 계열과 NT 계열에 따라 디스크 접근방식이 다르므로 이번 호에 구현하는 소프트웨어에서는 프로그램이 실행될 때  어떤 계열인지 판별해 그에 맞는 디스크 접근방식으로 동작하도록 해야 한다. 윈도우 2000은 여러 제품군이 있지만 실질적으로 윈도우 NT 버전 5.0이다. 이 때 주 번호(Major), 부 번호(Minor), 빌드번호(Build) 등으로 나눌 수 있는데 윈도우 2000의 경우 각각 주 번호는 5, 부 번호는 00, 빌드번호는 2195이다.
윈도우 NT 4.0은 주 번호가 4, 부 번호가 00이고, NT 3.51은 주 번호가 3, 부 번호가 51이다. 윈도우 ME는 4.90.3000이고 윈도우 98 SE는 4.10.2222, 윈도우 98은 4.10.1998이다. 이러한 정보들은 구조체 OSVERSIONINFOEX를 API 함수인 GetVersionEx()에 건네주어 호출함으로써 값들을 얻어낼 수 있다. OSVERSION INFOEX가 윈도우 2000 이상에서 지원되기 때문에 윈도우 9x에서는 OSVER SIONINFO를 이용하여 호출하면 된다.

출처 : 마이크로스프트웨어

Posted by skensita