MFC를 이용하여 디스크를 포맷하는 방법은 크게 두 가지로 나눌 수 있다.
첫 번째는 Shell32.dll내의 SHFormatDrive라는 함수를 호출하는 방법이다.
이 함수의 prototype은
DWORD WINAPI SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT options);이며
이에 대한 내용은 msdn에서 자세히 볼 수 있다.
HOWTO: call SHFormatDrive in Windows 95 and Windows NT
ID : Q173688
하지만 이 함수의 경우 Shell의 Format Dialog를 띄워주는 방식으로 대부분의 개발자라면
이러한 방법 보다는 아래와 같은 방법을 더욱 필요로 할 것이라 생각한다.
두 번째는 fmifs.dll내의 FormatEx라는 함수를 호출하는 방법이다.
이 함수의 prototype은
VOID (__stdcall *PFORMATEX)(PWCHAR DriveRoot, DWORD MediaFlag,
PWCHAR Format, PWCHAR Label,
BOOL QuickFormat, DWORD ClusterSize,
PFMIFSCALLBACK Callback);이다.
추가로 위의 DLL에서는 Chkdsk 함수를 통해 Check Disk도 할 수 있는 함수가 있다.
위의 함수 중 마지막 parameter는 Callback 함수를 지정하는 곳인데
이 callback 함수를 통해 진행률과 결과를 알 수 있다.
Callback 함수의 prototype은 아래와 같다.
BOOLEAN (__stdcall *PFMIFSCALLBACK)(CALLBACKCOMMAND Command,
DWORD SubActiion, PVOID ActionInfo);
그러면 지금부터 FormatEx함수를 사용하는 방법에 대하여 이야기를 하겠다.
1. LoadLibrary를 통해 : fmifs.dll을 load한다. (fmifs.dll은 Windows 폴더의 system32에 있다.
2. GetProcAddress 함수를 통해 FormatEx 함수의 주소를 얻어온다.
ex)
PFORMATEX FormatEx = (PFORMATEX)GetProcAddress(GetModuleHandle(“fmifs.dll”), “FormatEx”);
3. Format 하고자 하는 드라이브를 WCHAR 형식으로 저장한다.
– WCHAR를 배열로 선언하고
– 0번지에는 드라이브 이름이(L”C”)
– 1번지에는 콜론이(L”:”)
– 2번지에는 back slash가(L””)
– 3번지에는 NULL값이((WCHAR)NULL) 들어간다.
4. GetDriveType 또는 GetDriveTypeW 함수를 통해 drive의 type을 알아낸다.
– WCHAR를 사용하므로 postfix가 W인 함수 사용
– DRIVE_FIXED인 경우 아래에 나올 media에 FMIFM_FLOPPY를 아닌 경우 FMIFM_HARDDISK
· FMIFM_FLOPPY : 0x08
· FMIFM_HARDDISK : 0x0C
5. GetVolumeInformationW 함수를 이용하여 disk에 대한 정보를 얻어온다.
6. FormatEx 함수를 호출하여 format을 수행한다.
– Parameter 설명
1 : Root Directory (3번의 변수)
2 : Media (4번의 media 변수)
3 : File System (5번에서 얻은 File System 혹은 WCHAR로 L”FAT”, L”FAT32″, L”NTFS” 지정)
4 : Volume Name (WCHAR로 지정할 disk의 volume 지정)
5 : Quick Format (TRUE(quick) or FALSE(normal)로 Quick 여부를 지정)
6 : Cluster Size (설정할 cluster size 지정)
7 : Callback Function (Callback 함수의 이름 지정)
7. Callback함수를 통해 format에 대한 정보를 얻는다.
ex)
BOOLEAN __stdcall FormatExCallback(CALLBACKCOMMAND Command,
DWORD Modifier, PVOID Argument)
{
PDWORD percent;
PTEXTOUTPUT output;
PBOOLEAN status;
static createStructures = FALSE;
switch(Command) {
case PROGRESS :
percent = (PDWORD)Argument;
// …
break;
case OUTPUT :
output = (PTEXTOUTPUT)Argument;
// …
break;
case DONE :
status = (PBOOLEAN)Argument;
if(*status == TRUE)
// … Success
else
// … Failure
break;
}
return TRUE;
}
출처: http://ultracap.tistory.com/