`
helloyesyes
  • 浏览: 1303832 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

使用未公开函数编写磁盘格式化应用程序

阅读更多


如果想在自己的应用程序中加入操作系统的Format(格式化)功能,就象系统的那个format utility,应该怎么做呢?用Google搜索的话,中文资料最多的一篇是《磁盘格式化的编程实现》,讲的是借用SHFormatDrive函数来调用系统的格式化工具完成格式化功能。有没有办法使用自己的代码实现呢?参考sysinternals里的一篇文章,尝试用FMIFS.dll里的一个未公开函数实现了Format功能,所有的参数都由自己给定,比如每簇大小、文件系统等待。这里我只演示了最基本的功能,如果要想程序更健壮些,则还需要做更多的工作。

FormatEx函数原型:

VOID FormatEx ( PWCHAR DriveRoot,
DWORD MediaFlag ,
PWCHAR Format,
PWCHAR Label,
BOOL QuickFormat,
DWORD ClusterSize,
PFMIFSCALLBACK Callback);

其中FMIFSCALLBACK是:

typedef BOOLEAN (__stdcall *PFMIFSCALLBACK)(
CALLBACKCOMMAND Command,
DWORD SubAction,
PVOID ActionInfo );

下面是具体工作:
先定义一个头文件Fmifs.h:
//======================================================================
//
// Fmifs.h
//
//======================================================================

//
// 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 );

//
// Format command in FMIFS
//

// media flags
#define FMIFS_HARDDISK 0xC
#define FMIFS_FLOPPY 0x8

typedef VOID (__stdcall *PFORMATEX)( PWCHAR DriveRoot,
DWORD MediaFlag,
PWCHAR Format,
PWCHAR Label,
BOOL QuickFormat,
DWORD ClusterSize,
PFMIFSCALLBACK Callback );

//
// Enable/Disable volume compression
//
typedef BOOLEAN (__stdcall *PENABLEVOLUMECOMPRESSION)(PWCHAR DriveRoot,
BOOL Enable );
//////////////////////////////////////////////////////////////////////////

下面是主文件:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include "fmifs.h"
#define _UNICODE 1
#include "tchar.h"

BOOLError = FALSE;

BOOLQuickFormat = FALSE;
DWORD ClusterSize = 0;
BOOLCompressDrive = FALSE;
BOOL GotALabel = FALSE;
PWCHAR Label = L"";
PWCHAR Drive = NULL;
PWCHAR Format = L"FAT32";

WCHAR RootDirectory[MAX_PATH];
WCHAR LabelString[12];

PFORMATEX FormatEx;
PENABLEVOLUMECOMPRESSION EnableVolumeCompression;

typedef struct {
WCHAR SizeString[16];
DWORD ClusterSize;
} SIZEDEFINITION, *PSIZEDEFINITION;

SIZEDEFINITION LegalSizes[] = {
{ L"512", 512 },
{ L"1024", 1024 },
{ L"2048", 2048 },
{ L"4096", 4096 },
{ L"8192", 8192 },
{ L"16K", 16384 },
{ L"32K", 32768 },
{ L"64K", 65536 },
{ L"128K", 65536 * 2 },
{ L"256K", 65536 * 4 },
{ L"", 0 },
};

//----------------------------------------------------------------------
//
// FormatExCallback
//
// The file system library will call us back with commands that we
// can interpret. If we wanted to halt the chkdsk we could return FALSE.
//
//----------------------------------------------------------------------
BOOLEAN __stdcall FormatExCallback( CALLBACKCOMMAND Command, DWORD Modifier, PVOID Argument )
{
PDWORD percent;
PTEXTOUTPUT output;
PBOOLEAN status;
static createStructures = FALSE;

//
// We get other types of commands, but we don't have to pay attention to them
//
switch( Command ) {

case PROGRESS:
percent = (PDWORD) Argument;
_tprintf(L"%d percent completed.\r", *percent);
break;

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

case DONE:
status = (PBOOLEAN) Argument;
if( *status == FALSE ) {

_tprintf(L"FormatEx was unable to complete successfully.\n\n");
Error = TRUE;
}
break;
}
return TRUE;
}

//----------------------------------------------------------------------
//
// LoadFMIFSEntryPoints
//
// Loads FMIFS.DLL and locates the entry point(s) we are going to use
//
//----------------------------------------------------------------------
BOOLEAN LoadFMIFSEntryPoints()
{
LoadLibrary( "fmifs.dll" );

if( !(FormatEx = (PFORMATEX) GetProcAddress( GetModuleHandle( "fmifs.dll"),
"FormatEx" )) ) {

return FALSE;
}

if( !(EnableVolumeCompression = (PENABLEVOLUMECOMPRESSION) GetProcAddress( GetModuleHandle( "fmifs.dll"),
"EnableVolumeCompression" )) ) {

return FALSE;
}
return TRUE;
}

int main( int argc, WCHAR *argv[] )
{
if( argv[1][1] != L':' ) return 0;
Drive = argv[1];

wcscpy( RootDirectory, Drive );
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;


//
// Get function pointers
//
if( !LoadFMIFSEntryPoints()) {

_tprintf(L"Could not located FMIFS entry points.\n\n");
return -1;
}

FormatEx( RootDirectory, media, Format, Label, QuickFormat,
ClusterSize, FormatExCallback );

return 0;
}

分享到:
评论

相关推荐

    VB6.0编写磁盘格式化程序

    在VB6.0中编写磁盘格式化程序是一项常见的任务,尤其在开发涉及数据存储和安全性的应用程序时。本文将详细介绍如何使用VB6.0来实现这个功能,并讲解相关的关键知识点。 首先,VB6.0(Visual Basic 6.0)是微软开发...

    vb编写磁盘格式化

    在这个"vb编写磁盘格式化"的项目中,我们看到的三个文件是VB应用程序的基本组成部分: 1. **磁盘格式化.frm**:这是窗体文件,它包含了程序的用户界面设计。在该文件中,开发者可能定义了各种控件,如按钮、文本框...

    用VB6.0编写磁盘格式化程序收集.pdf

    总的来说,VB6.0编写磁盘格式化程序需要理解API函数的使用,以及VB6.0中的事件驱动编程模型。通过这个程序,开发者可以学习到如何利用系统资源来实现更复杂的功能,这对于深入理解Windows编程和系统级操作是非常有...

    Delphi磁盘格式化的程序代码..rar

    本资源"Delphi磁盘格式化的程序代码..rar"提供的是使用Delphi编写的一个程序,用于实现磁盘的格式化功能。在深入探讨这段代码之前,我们先来了解一下磁盘格式化的基础概念。 磁盘格式化是清理磁盘上的数据并为其...

    磁盘格式化演示程序(2KB)...

    标题中的“磁盘格式化演示程序”指的是一个用于展示如何对磁盘进行格式化的软件示例。这通常涉及到操作系统层面的编程,特别是涉及到文件系统管理的API调用。磁盘格式化是清除磁盘上所有数据并为其创建一个新的文件...

    易语言源码磁盘格式化模块 1.0.7z

    在Windows操作系统中,我们通常使用"磁盘管理"工具进行格式化,而在易语言环境下,开发者可以通过编写特定的模块来实现这个功能,使得程序能够自动化处理磁盘格式化任务。 该模块可能包含以下几个关键部分: 1. **...

    易语言API格式化磁盘

    本篇文章将深入探讨易语言API格式化磁盘的相关知识,包括如何使用API函数SHFormatDrive来实现磁盘的格式化操作。 首先,API是操作系统提供给开发者的一组函数,这些函数可以帮助开发者执行特定的任务,如读写文件、...

    易语言源码格式化磁盘模块源码.rar

    通过学习这个易语言磁盘格式化模块,我们可以了解到易语言的基本语法结构、函数调用方式,以及如何与操作系统进行交互。此外,对于想要深入研究磁盘管理或系统编程的人来说,这是一次宝贵的实践机会,可以进一步提升...

    C++格式化磁盘

    这个项目可能包含了源代码文件、资源文件和编译设置,帮助开发者理解如何在Windows环境下使用C++进行磁盘格式化。通过查看和分析这个项目,你可以深入学习到如何结合C++与Windows API来实现系统级别的功能。 总之,...

    磁盘格式化模块 1.0.zip易语言程序源码资源下载

    《磁盘格式化模块 1.0 易语言程序源码解析及应用》 在信息技术领域,编程是一项至关重要的技能,而源码的学习是提升编程能力的有效途径。本资源为"磁盘格式化模块 1.0.zip",内含易语言编写的程序源码,适合学生、...

    hook api 禁止格式化磁盘

    通过这种方式,我们可以捕获并可能修改即将发生的操作,比如阻止磁盘格式化。 在"禁止右键菜单的格式化"场景下,我们通常会关注到Windows资源管理器中的右键快捷菜单。当用户右键点击磁盘驱动器,"格式化"选项会...

    用VC进行磁盘格式化操作

    在Windows操作系统中,VC++(Visual C++)是一种强大的开发环境,可以用来编写各种应用程序,包括与硬件交互的低级操作,比如磁盘格式化。本文将深入探讨如何使用VC++进行磁盘格式化操作。 首先,理解磁盘格式化的...

    公开的磁盘应用C语言工具包

    公开的磁盘应用C语言工具包是一套专为磁盘管理设计的开源程序库,它提供了丰富的功能,便于开发者在C语言环境中进行磁盘相关的应用程序开发。这个工具包旨在简化磁盘I/O操作,增强系统性能,并且支持跨平台使用,...

    格式化函数源码,支持各种格式化

    本文将深入探讨格式化函数的核心概念、常见的格式化方式以及如何实现自定义的格式化函数源码。 一、格式化函数概述 格式化函数允许程序员以指定的样式和布局来展示数据,这包括数字、字符串、日期和时间等。常见的...

    用C实现的硬盘格式化程序

    5. **检查与校验**:最后,格式化程序可能会进行磁盘错误检测,如CRC校验,确保硬盘的健康状态。 在C语言中实现硬盘格式化,我们需要以下关键知识点: - **系统调用**:C语言没有直接处理硬件的函数,因此需要通过...

    使用VC自动格式化分区

    在Visual C++环境中,可以通过编写程序来调用`system()`函数,执行DOS命令,实现自动格式化。例如: ```cpp #include #include int main() { system("format X: /q /v:MyPartition /fs:NTFS"); return 0; } ```...

    易语言API格式化磁盘源码

    在易语言中,API(Application Programming Interface)是调用操作系统功能的重要方式,它允许程序与操作系统进行交互,执行诸如格式化磁盘等低级操作。在本案例中,我们讨论的是使用易语言API来实现格式化磁盘的...

    为Linux应用程序编写DLL程序函数

    在实际应用中,可以编写一个C程序来演示动态链接库的使用。例如,有一个简单的程序`dlTest`,它首先打印大写的"HeLlO WoRlD",然后通过动态加载`UPPERCASE.so`库,调用其中的函数来改变输出,使其变为全大写。这个...

    易语言API格式化磁盘源码.zip

    API函数通常由Windows操作系统提供,它们允许程序访问操作系统的核心功能,例如磁盘格式化。在易语言中,我们需要正确地定义API函数的参数类型、返回值类型以及函数名,然后在程序中调用这些函数。 3. 格式化磁盘...

Global site tag (gtag.js) - Google Analytics