카테고리 보관물: Language (Programming)

Disk Format Source

Delphi 로 디스크 포멧 방법과 소스가 많이 알려지지 않아 이번 삽질의 결과물인 소스를 올린다.

 

이 소스는 이번에 만든 Freeware 인 Eagle Auto Downloader 에 사용된 코드이다.

 

상단에 형 정의

type
CALLBACKCOMMAND = (PROGRESS, DONEWITHSTRUCTURE, UNKNOWN2, UNKNOWN3, UNKNOWN4,
UNKNOWN5, INSUFFICIENTRIGHTS, WRITEPROTECTED, UNKNOWN8, UNKNOWN9, UNKNOWNA,
DONE, UNKNOWNC, UNKNOWND, OUTPUT, STRUCTUREPROGRESS);
type
PFMIFSCALLBAC = function (Command: CALLBACKCOMMAND; SubAction: DWORD;
ActionInfo: Pointer): BOOL; stdcall;
type
PFORMATEX = procedure (DriveRoot: PWCHAR; MediaFlag: DWORD; Format: PWCHAR;
wLabel: PWCHAR; QuickFormat: BOOL; ClusterSize: DWORD; Callback: PFMIFSCALLBAC); stdcall

 

그리고 콜백 함수를 클래스가 아닌 전역이나 지역변수에 함수를 선언한다.

이부분은 사용자 본인 구미에 맞게 넣어주면 된다.

function FormatEXCallBack(Command: CALLBACKCOMMAND; SubAction: DWORD; ActionInfo: Pointer): BOOL; stdcall;

 

그리고 이 콜백 함수의 내용은 아래와 같다.

function FormatEXCallBack(Command: CALLBACKCOMMAND; SubAction: DWORD; ActionInfo: Pointer): BOOL; stdcall;
var
piPrograss : PInteger;
pwstrMessage : PWideString;
pbState : PBoolean;
begin

case (Command) of
PROGRESS :
begin
piPrograss := ActionInfo;
form1.progressbar1.Position := piPrograss^; // 프로그래스 바가 되었든 뭐가 되었든 piPrograss 포인터의 값을 다른곳에 쓰지 않으면 포멧이 되질 않는다.  덕분에 삽질좀 제대로 했다. 여기서는 form1 에 있는 PrograssBar 에 값을 넣었다.
end;
OUTPUT :
begin
pwstrMessage := ActionInfo;
//메세지 출력부이지만 별로 쓰이지 않는 것 같다.
end;
WRITEPROTECTED:
begin
//쓰기 방지(SD 나 디스켓의 경우 쓰기방지 텝이 있다.)가 걸려있는 경우.
end;
DONE :
begin
pbState := ActionInfo;

if (pbState^ = TRUE) then
begin
// 포멧이 성공했을 경우 처리.
end else
begin
// 포멧이 실패했을 경우 처리.
end;
end;
else

end;
end;

 

그리고 이제 포멧 명령이다.

함수 상단에 아래와 같이 변수 선언을 한다.

var
pwcDrive : Array[0..5] of WideChar;
pwcDriveLabel : Array[0..49] of WideChar;
pwcFormatType : Array[0..5] of WideChar;
DllHandle : THandle;
FormatEx: PFORMATEX;

 

함수 내부에 아래와 같이 코딩한다.

StringToWideChar({드라이버 명, 예를 들어 e:\ 일 경우 e: 만 넣는다.}, pwcDrive, 5);
StringToWideChar({포멧 후 설정될 레이블 명}, pwcDriveLabel, 49);
StringToWideChar(‘FAT’, pwcFormatType, 5); //FAT 나 FAT32 나 NTFS 를 쓰면된다. 여기서는 FAT 를 사용했다.

DllHandle := LoadLibrary(‘fmifs.dll’);
FormatEx := GetProcAddress(DllHandle, ‘FormatEx’);
FormatEx(pwcDrive, DWORD($C), pwcFormatType, pwcDriveLabel, false, 512, FormatEXCallBack);

FreeLibrary(DllHandle);

 

Vista 에서는 사용가능한지 모르겠는데 2000/XP는 확실히 된다.