微软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("成功"); } else { printf("失败"); } } 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的最后一个回调函数没弄懂具体的参数,但是定义一个空的函数体还是可行的
留言