创建新的分区磁盘winapi

时间:2012-09-27 12:38:47

标签: c++ winapi disk-partitioning

我正在尝试创建新分区并将卷安装到这个新分区,我认为CreateFile让我这样做,使用以下代码:

LPCTSTR lpFileName=L"\\\\.\\Device\\Harddisk0\\Partition3";
HANDLE handl=CreateFile( lpFileName,
                            GENERIC_READ | GENERIC_WRITE,
                            FILE_SHARE_READ | FILE_SHARE_WRITE,
                            NULL,
                            CREATE_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL  );
   if (handl==INVALID_HANDLE_VALUE)
   {
   qDebug()<<"handl invalid"<<" error"<<GetLastError();}


   bool success = DefineDosDevice(DDD_RAW_TARGET_PATH,L"I:",L"\\Device\\Harddisk0\\Partition3");
   if(!success)
       qDebug()<<" DefineDosDevice failed "<<GetLastError();


   bFlag = GetVolumeNameForVolumeMountPoint(
               L"I:\\", // input volume mount point or directory
               /** what u do in this directory u find it in th mount piont and vice versa**/
                  Buf, // output volume name buffer
              BUFSIZE  // size of volume name buffer
           );
   if (bFlag != TRUE)
   {
      //_tprintf( TEXT("Retrieving volume name for %s failed.\n"), argv[2] );
      qDebug()<<"Retrieving volume name failed.      "<<GetLastError();
      return (-2);
   }
    qDebug()<<"Volume name"<<QString::fromWCharArray(Buf);



    bool fResult = DefineDosDevice (
                         DDD_RAW_TARGET_PATH|DDD_REMOVE_DEFINITION|
                         DDD_EXACT_MATCH_ON_REMOVE, L"I:",
                         L"\\Device\\Harddisk0\\Partition3");
    if (!fResult)
                qDebug()<<"DefineDosDevice failed  "<< GetLastError();



   bFlag = SetVolumeMountPoint(L"D:\\myDirExample\\example\\", // mount point
                               /** should b empty**/
                                Buf // volume to be mounted
                               );

   if (!bFlag)
      {
        qDebug()<<"Attempt to mount failed";
        qDebug()<<"error "<<GetLastError();
      }

   return (bFlag);


   CloseHandle(handl);

我有:

handl invalid  error 3 
Retrieving volume name failed  erorr  2

第一个错误是ERROR_PATH_NOT_FOUND:系统找不到指定的路径。 那么如何修复lpFileName以使其正常工作

提前感谢,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

有,我用它作为我的碎纸机。唯一棘手的部分是管理文件指针的LARGE_INTEGER(用于选择扇区)。您需要首先使用CreateFile()来使用设备的句柄。完成后使用FSCTL_LOCK_VOLUME锁定驱动器,使用SetFilepointerEx设置扇区并使用IOCTL_DISK_SET_PARTITION_INFO_EX创建新扇区。

干杯;)

编辑了几次 - 不确定是否也需要IOCTL_DISK_SET_PARTITION_INFO,但事实并非如此,您也可以使用IOCTL_DISK_SET_PARTITION_INFO_EX设置类型。