请问格式化硬盘德API函数是那个,急呀

解决方案 »

  1.   

    我也找过,好像没有格式化硬盘的API函数啊!
      

  2.   

    没有API,必须使用DeviceIoControl
      

  3.   

    typedef struct _DISK_GEOMETRY 
    {
        LARGE_INTEGER Cylinders;   // 柱面数
        MEDIA_TYPE MediaType;      // 介质类型
        DWORD TracksPerCylinder;   // 每柱面的磁道数
        DWORD SectorsPerTrack;     // 每磁道的扇区数
        DWORD BytesPerSector;      // 每扇区的字节数
    } DISK_GEOMETRY;// 打开磁盘
    HANDLE OpenDisk(LPCTSTR filename)
    {
        HANDLE hDisk;
      
        // 打开设备
        hDisk = ::CreateFile(filename,           // 文件名
            GENERIC_READ | GENERIC_WRITE,        // 读写方式
            FILE_SHARE_READ | FILE_SHARE_WRITE,  // 共享方式
            NULL,                                // 默认的安全描述符
            OPEN_EXISTING,                       // 创建方式
            0,                                   // 不需设置文件属性
            NULL);                               // 不需参照模板文件
      
        return hDisk;
    }
      
    // 获取磁盘参数
    BOOL GetDiskGeometry(HANDLE hDisk, PDISK_GEOMETRY lpGeometry)
    {
        DWORD dwOutBytes;
        BOOL bResult;
      
        // 用IOCTL_DISK_GET_DRIVE_GEOMETRY取磁盘参数
        bResult = ::DeviceIoControl(hDisk,        // 设备句柄
            IOCTL_DISK_GET_DRIVE_GEOMETRY,        // 取磁盘参数
            NULL, 0,                              // 不需要输入数据
            lpGeometry, sizeof(DISK_GEOMETRY),    // 输出数据缓冲区
            &dwOutBytes,                          // 输出数据长度
            (LPOVERLAPPED)NULL);                  // 用同步I/O
      
        return bResult;
    }// 从指定磁道开始格式化磁盘
    BOOL LowLevelFormatTracks(HANDLE hDisk, PDISK_GEOMETRY lpGeometry, DWORD dwStartCylinder, DWORD dwCylinderNumber)
    {
        FORMAT_PARAMETERS FormatParameters;
        PBAD_TRACK_NUMBER lpBadTrack;
        DWORD dwOutBytes;
        DWORD dwBufSize;
        BOOL bResult;
      
        FormatParameters.MediaType = lpGeometry->MediaType;
        FormatParameters.StartCylinderNumber = dwStartCylinder;
        FormatParameters.EndCylinderNumber = dwStartCylinder + dwCylinderNumber - 1;
        FormatParameters.StartHeadNumber = 0;
        FormatParameters.EndHeadNumber = lpGeometry->TracksPerCylinder - 1;
      
        dwBufSize = lpGeometry->TracksPerCylinder * sizeof(BAD_TRACK_NUMBER);
      
        lpBadTrack = (PBAD_TRACK_NUMBER) new BYTE[dwBufSize];
      
        // 用IOCTL_DISK_FORMAT_TRACKS对连续磁道进行低级格式化
        bResult = ::DeviceIoControl(hDisk,               // 设备句柄
            IOCTL_DISK_FORMAT_TRACKS,                    // 低级格式化
            &FormatParameters, sizeof(FormatParameters), // 输入数据缓冲区
            lpBadTrack, dwBufSize,                       // 输出数据缓冲区
            &dwOutBytes,                                 // 输出数据长度
            (LPOVERLAPPED)NULL);                         // 用同步I/O
      
        delete lpBadTrack;
      
        return bResult;
    }
      

  4.   

    以下摘自是一篇文章
    从实际应用的角度看,从Windows 9X到Windows NT都应该提供这个FormatDisk函数,否则怎么实现资源管理器窗口的磁盘格式化呢?笔者通过仔细查找发现,Windows 确实提供了这样一个函数,尽管文档资料没有注明,但是如果我们使用View Dependencies打开Shell2.dll,就会发现这个函数。它就是SHFormatDrive,编译连接到Shell32.lib。尽管通过平台的SDK文档和SHELLAPI.H文件并不能发现这个函数,但是Win32各个操作系统都能找到它的踪影。应用程序可以通过调用这个函数实现借用外壳的磁盘格式化对话框格式化磁盘。调用约定如下: 
    DWORD WINAPI SHFormatDrive(HWND hwnd,UINT drive,UINT fmtID,UINT options); 
    参数含义如下: 
    hwnd:拥有对话框的窗口句柄,注意hwnd为NULL时,并不会导致这个对话框生成一个上层的应用程序,也就是说,这个参数总是非NULL,这个对话框只能作为一个窗口的子窗口,而不能作为一个单独的应用程序; 
    drive:要格式化的驱动器号,以A: == 0为基准,依此类推; 
    fmtID:必须设定为 SHFMT_ID_DEFAULT,即0xFFFF; 
    options:可以有两个选择项:SHFMT_OPT_FULL 0x0001和SHFMT_OPT_SYSONLY 0x0002,如果这一项设置为零,系统就要使用快速格式化作为默认设置。  
    该函数的返回值要么为一个下列以SHFMT_开头的值,要么是一个成功格式化的磁盘标识。 
    //上次格式化出错,磁盘可能被格式化 
    #define SHFMT_ERROR 0xFFFFFFFFL  
    //格式化被取消 
    #define SHFMT_CANCEL 0xFFFFFFFEL  
    // 不能进行磁盘格式化 
    #define SHFMT_NOFORMAT 0xFFFFFFFDL  
    实现步骤 
    1.函数接口声明 
    typedef DWORD (WINAPI *PFNSHFORMATDRIVE)(HWND hwnd,UINT drive,UINT fmtID,UINT options); 
    2.加载Shell32.dll库 
    HINSTANCE hInstance=LoadLibrary(_T 
    (“Shell32.dll”)); 
    If(hInstance==NULL) return; 
    3.获得函数指针 
    PFNSHFORMATDRIVE pFnSHFormatDrive=(  
    PFNSHFORMATDRIVE)GetProcessAddress(_T 
    (“SHFormatDrive”));  
    if(pFnSHFormatDrive==NULL) 

    FreeLibrary(hInstance); 
    return; 

    4.调用函数 
    (pFnSHFormatDrive)(hwnd,drive/*a:==0*/,fmtID/* SHFMT_ID_DEFAULT */,options); 
    5.释放句柄资源 
    FreeLibrary(hInstance); 
    Return; 
    本程序在Windows 2000环境下调试通过,使用Delphi、Visual Basic的用户通过调用上述Windows SDK 函数也可以实现磁盘格式化。 
    /*****************************************************************/也可以直接调用
    DWORD SHFormatDrive(          HWND hwnd,
        UINT drive,//0 for A:, 2 for C:,...
        UINT fmtID,//SHFMT_ID_DEFAULT only
        UINT options//SHFMT_OPT_FULL取消快格,进行全格
                    //SHFMT_OPT_SYSONLY 创建ms-dos启动盘
    );
    包含在头文件shlobj.h,for2k codewarrior(会思考的草) 的只能用于格式化软驱