微软3层有一个格式化磁盘API--SHFormatDrive,但是这只是一个窗体API,不能实现后台自动格式化,于是反汇编了一下它的具体实现。

Header.h


typedef enum
{
	FMIFS_UNKNOWN0,
	FMIFS_UNKNOWN1,
	FMIFS_UNKNOWN2,
	FMIFS_UNKNOWN3,
	FMIFS_UNKNOWN4,
	FMIFS_UNKNOWN5,
	FMIFS_UNKNOWN6,
	FMIFS_UNKNOWN7,
	FMIFS_FLOPPY,
	FMIFS_UNKNOWN9,
	FMIFS_UNKNOWN10,
	FMIFS_REMOVABLE,
	FMIFS_HARDDISK,
	FMIFS_UNKNOWN13,
	FMIFS_UNKNOWN14,
	FMIFS_UNKNOWN15,
	FMIFS_UNKNOWN16,
	FMIFS_UNKNOWN17,
	FMIFS_UNKNOWN18,
	FMIFS_UNKNOWN19,
	FMIFS_UNKNOWN20,
	FMIFS_UNKNOWN21,
	FMIFS_UNKNOWN22,
	FMIFS_UNKNOWN23,
} FMIFS_MEDIA_FLAG;

typedef enum
{
	PROGRESS,
	DONEWITHSTRUCTURE,
	UNKNOWN2,
	UNKNOWN3,
	UNKNOWN4,
	UNKNOWN5,
	INSUFFICIENTRIGHTS,
	FSNOTSUPPORTED,
	VOLUMEINUSE,
	UNKNOWN9,
	UNKNOWNA,
	DONE,
	UNKNOWNC,
	UNKNOWND,
	OUTPUT,
	STRUCTUREPROGRESS,
	CLUSTERSIZETOOSMALL,
} CALLBACKCOMMAND;

typedef BOOLEAN
	(NTAPI* PFMIFSCALLBACK)(
	IN CALLBACKCOMMAND Command,
	IN ULONG SubAction,
	IN PVOID ActionInfo);

typedef struct
{
	int Unknow;
	BOOLEAN QuickFormat;
	PWCHAR Label;
	ULONG ClusterSize;
}FORMAT_INFO;

typedef LONG (WINAPI *ActiveHookFun)(PVOID *ppPointer, PVOID pDetour);

FormatDevice.cpp

#include <Windows.h>
#include <stdio.h>
#include <assert.h>
#include <tchar.h>
#include "FormatDevice.h"

BOOLEAN NTAPI callBack(
	IN CALLBACKCOMMAND Command,
	IN ULONG SubAction,
	IN PVOID ActionInfo)
{
	if(Command == DONE)
	{
		if(*(bool*)ActionInfo)
		{
			printf(&quot;成功&quot;);
		}
		else
		{
			printf(&quot;失败&quot;);
		}
	}
	return TRUE;
}

void __fastcall callBack2(DWORD a1, DWORD a2, signed int a3, signed int a4, char * a5)
{
	return;
}

void (WINAPI* FormatDevice)(
	IN PWCHAR DriveRoot,
	IN FMIFS_MEDIA_FLAG MediaFlag,
	IN PWCHAR Format,
	IN PWCHAR Label,
	IN BOOLEAN QuickFormat,
	IN ULONG ClusterSize,
	IN PFMIFSCALLBACK Callback
	);

void (WINAPI* FormatDevice2)(
	IN PWCHAR DriveRoot,
	IN FMIFS_MEDIA_FLAG MediaFlag,
	IN PWCHAR Format,
	FORMAT_INFO* FormatInfo,
	void* callBack);

//L"D:\\"
int _tmain(int argc, _TCHAR* argv[])
{
	TCHAR VolumeLabel[MAX_PATH] = {0};
	wcscpy(VolumeLabel, lpcVolumeLabel);
	HMODULE hModFmifs = LoadLibrary(TEXT("FMIFS.DLL"));
	(FARPROC&)FormatDevice	= GetProcAddress(hModFmifs, "FormatEx");
	(FARPROC&)FormatDevice2 = GetProcAddress(hModFmifs, "FormatEx2");
	//方式1 XP

	if(!isBigerThanXp)
	{
		FormatDevice(VolumeLabel, FMIFS_HARDDISK, L"NTFS", L"OK", TRUE, 4096, callBack);
	}
	else
	{
		//方式2 Win7
		FORMAT_INFO FormatInfo = {0};
		FormatInfo.Unknow = 1;
		FormatInfo.QuickFormat = 1;
		FormatInfo.Label = L"formatex2";
		FormatInfo.ClusterSize = 4096;
		FormatDevice2(VolumeLabel, FMIFS_HARDDISK, L"NTFS", &FormatInfo, callBack2);
	}
	return 0;
}

在Xp系统,调用FMIFS的FormatEx,在Win7上,调用的是FMIFS的FormatEx2
参数很简单,根据变量名就能明白是什么意思,这里就不解释了~
对于FormatEx2的最后一个回调函数没弄懂具体的参数,但是定义一个空的函数体还是可行的
9468907eca806538a14d04e397dda144ac348212

最后修改日期:2015 年 6 月 26 日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。