您的位置:首页 > 编程语言

调用 FormatEx 函数格式化磁盘的代码

2011-08-18 11:01 183 查看
http://hi.baidu.com/classfree/blog/item/ecc9dc8b8fd6831ec9fc7acf.html

// Output command
typedef struct
{
DWORD Lines;
PCHAR Output;
} TEXTOUTPUT, *PTEXTOUTPUT;

// Callback command types
typedef enum
{
PROGRESS,
DONEWITHSTRUCTURE,
UNKNOWN2,
UNKNOWN3,
UNKNOWN4,
UNKNOWN5,
INSUFFICIENTRIGHTS,
UNKNOWN7,
UNKNOWN8,
UNKNOWN9,
UNKNOWNA,
DONE,
UNKNOWNC,
UNKNOWND,
OUTPUT,
STRUCTUREPROGRESS
} CALLBACKCOMMAND;

// FMIFS callback definition
typedef BOOLEAN (__stdcall *PFMIFSCALLBACK)( CALLBACKCOMMAND Command, DWORD SubAction, PVOID ActionInfo );

// Chkdsk command in FMIFS
typedef VOID (__stdcall *PCHKDSK)( PWCHAR DriveRoot,
PWCHAR Format,
BOOL CorrectErrors,
BOOL Verbose,
BOOL CheckOnlyIfDirty,
BOOL ScanDrive,
PVOID Unused2,
PVOID Unused3,
PFMIFSCALLBACK Callback );

// media flags
#define FMIFS_HARDDISK 0xC
#define FMIFS_FLOPPY   0x8
// Format command in FMIFS
typedef VOID (__stdcall *PFORMATEX)( PWCHAR DriveRoot,
DWORD MediaFlag,
PWCHAR Format,
PWCHAR Label,
BOOL QuickFormat,
DWORD ClusterSize,
PFMIFSCALLBACK Callback );

// FormatExCallback
BOOLEAN __stdcall FormatExCallback( CALLBACKCOMMAND Command, DWORD Modifier, PVOID Argument )
{
PDWORD percent;
PTEXTOUTPUT output;
PBOOLEAN status;

switch( Command )
{
case PROGRESS:    //格式化进度
percent = (PDWORD) Argument;
DebugString("格式化进度: %d \n", *percent);
break;

case OUTPUT:
output = (PTEXTOUTPUT) Argument;
fprintf(stdout, "%s", output->Output);
break;

case DONE:    //格式化完成
status = (PBOOLEAN) Argument;
if( *status == FALSE )
{
DebugString("格式化未能成功完成(%d)\n", GetLastError());
MakePageFile(iMin, iMax, szPageFilePath);
Error = TRUE;
}
else
{
DebugString("格式化完成!");
MakePageFile(iMin, iMax, szPageFilePath);
}

break;
}
return TRUE;
}

//获取fsifs.dll中的格式化函数指针
BOOLEAN LoadFMIFSEntryPoints()
{
ifsModule = LoadLibrary("fmifs.dll");
FormatEx = (PFORMATEX)GetProcAddress( ifsModule, "FormatEx" );
if(FormatEx == NULL)
{
DebugString("获取FormatEx函数指针失败\n");
return FALSE;
}

if( !(EnableVolumeCompression = (PENABLEVOLUMECOMPRESSION) GetProcAddress( ifsModule, "EnableVolumeCompression" )) )
{
DebugString("获取EnableVolumeCompression函数指针失败\n");
return FALSE;
}
return TRUE;
}

// 调用格式化函数
int CallFormatDriver(char *szDriver)
{
USES_CONVERSION;

BOOL    QuickFormat = TRUE;
DWORD    ClusterSize = 4096;
PWCHAR    Label = NULL;
PWCHAR    Format = L"NTFS";

WCHAR  RootDirectory[MAX_PATH] = {0};

wcscpy( RootDirectory, A2W(szDriver) );
RootDirectory[1] = L':';
RootDirectory[2] = L'\\';
RootDirectory[3] = (WCHAR) 0;

DWORD media;
DWORD driveType;
driveType = GetDriveTypeW( RootDirectory );
if( driveType != DRIVE_FIXED )
media = FMIFS_FLOPPY;
if( driveType == DRIVE_FIXED )
media = FMIFS_HARDDISK;

if( !LoadFMIFSEntryPoints())
{
return -1;
}

FormatEx( RootDirectory, media, Format, Label, QuickFormat, ClusterSize, FormatExCallback );
FreeLibrary(ifsModule);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: