VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 377|回复: 0

[交流] 初始化多个磁盘时出现脱机现象

[复制链接]
89_avatar_middle
最佳答案
2 
在线会员 发表于 2022-5-24 17:16:56 | 显示全部楼层 |阅读模式
如题,在MFC中对多个磁盘进行初始化,代码如下:
  1. DWORD CreateDisk(DWORD disk, WORD partNum)
  2. {
  3.     HANDLE hDevice;               // handle to the drive to be examined
  4.     BOOL result;                  // results flag
  5.     DWORD readed;                 // discard results
  6.     DWORD ret;
  7.     WORD i;
  8.     CHAR diskPath[DISK_PATH_LEN];
  9.     DISK_GEOMETRY pdg;
  10.     DWORD sectorSize;
  11.     DWORD signature;
  12.     LARGE_INTEGER diskSize;
  13.     LARGE_INTEGER partSize;
  14.     BYTE actualPartNum;
  15.    
  16.     DWORD layoutStructSize;
  17.     DRIVE_LAYOUT_INFORMATION_EX *dl;
  18.     CREATE_DISK newDisk;

  19.     sprintf(diskPath, "\\\\.\\PhysicalDrive%d", disk);

  20.     actualPartNum = 4;
  21.     if (partNum > actualPartNum)
  22.     {
  23.         return (WORD)-1;
  24.     }
  25.    
  26.     hDevice = CreateFile(
  27.                 diskPath,
  28.                 GENERIC_READ|GENERIC_WRITE,
  29.                 FILE_SHARE_READ|FILE_SHARE_WRITE,
  30.                 NULL,           //default security attributes  
  31.                 OPEN_EXISTING, // disposition  
  32.                 0,              // file attributes  
  33.                 NULL
  34.                 );
  35.     if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
  36.     {
  37.         fprintf(stderr, "CreateFile() Error: %ld\n", GetLastError());
  38.         return DWORD(-1);
  39.     }
  40.    
  41.     // Create primary partition MBR
  42.     newDisk.PartitionStyle = PARTITION_STYLE_MBR;
  43.     signature = (DWORD)time(NULL);     //get signature from current time
  44.     newDisk.Mbr.Signature = signature;
  45.    
  46.     result = DeviceIoControl(
  47.                 hDevice,
  48.                 IOCTL_DISK_CREATE_DISK,
  49.                 &newDisk,
  50.                 sizeof(CREATE_DISK),
  51.                 NULL,
  52.                 0,
  53.                 &readed,
  54.                 NULL
  55.                 );
  56.     if (!result)
  57.     {
  58.         fprintf(stderr, "IOCTL_DISK_CREATE_DISK Error: %ld\n", GetLastError());
  59.         (void)CloseHandle(hDevice);
  60.         return DWORD(-1);
  61.     }

  62.     //fresh the partition table
  63.     result = DeviceIoControl(
  64.                 hDevice,
  65.                 IOCTL_DISK_UPDATE_PROPERTIES,
  66.                 NULL,
  67.                 0,
  68.                 NULL,
  69.                 0,
  70.                 &readed,
  71.                 NULL
  72.                 );
  73.     if (!result)
  74.     {
  75.         fprintf(stderr, "IOCTL_DISK_UPDATE_PROPERTIES Error: %ld\n", GetLastError());
  76.         (void)CloseHandle(hDevice);
  77.         return DWORD(-1);
  78.     }

  79.     //Now create the partitions
  80.     ret = GetDriveGeometry(diskPath, &pdg);
  81.     if ((DWORD)-1 == ret)
  82.     {
  83.         return ret;
  84.     }
  85.     sectorSize = pdg.BytesPerSector;
  86.     diskSize.QuadPart = pdg.Cylinders.QuadPart * pdg.TracksPerCylinder *
  87.                         pdg.SectorsPerTrack * pdg.BytesPerSector;       //calculate the disk size;
  88.     partSize.QuadPart = diskSize.QuadPart / partNum;

  89.     layoutStructSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + (actualPartNum - 1) * sizeof(PARTITION_INFORMATION_EX);
  90.     dl = (DRIVE_LAYOUT_INFORMATION_EX*)malloc(layoutStructSize);
  91.     if (NULL == dl)
  92.     {
  93.         (void)CloseHandle(hDevice);
  94.         return (WORD)-1;
  95.     }

  96.     dl->PartitionStyle = (DWORD)PARTITION_STYLE_MBR;
  97.     dl->PartitionCount = actualPartNum;
  98.     dl->Mbr.Signature = signature;

  99.     //clear the unused partitions
  100.     for (i = 0; i < actualPartNum; i++){
  101.         dl->PartitionEntry[i].RewritePartition = 1;
  102.         dl->PartitionEntry[i].Mbr.PartitionType = PARTITION_ENTRY_UNUSED;
  103.     }
  104.     //set the profile of the partitions
  105.     for (i = 0; i < partNum; i++){
  106.         dl->PartitionEntry[i].PartitionStyle = PARTITION_STYLE_MBR;
  107.         dl->PartitionEntry[i].StartingOffset.QuadPart =
  108.             (partSize.QuadPart * i) + ((LONGLONG)(pdg.SectorsPerTrack) * (LONGLONG)(pdg.BytesPerSector));   //32256
  109.         dl->PartitionEntry[i].PartitionLength.QuadPart = partSize.QuadPart;
  110.         dl->PartitionEntry[i].PartitionNumber = i + 1;
  111.         dl->PartitionEntry[i].RewritePartition = TRUE;
  112.         dl->PartitionEntry[i].Mbr.PartitionType = PARTITION_IFS;
  113.         dl->PartitionEntry[i].Mbr.BootIndicator = FALSE;
  114.         dl->PartitionEntry[i].Mbr.RecognizedPartition = TRUE;
  115.         dl->PartitionEntry[i].Mbr.HiddenSectors =
  116.             pdg.SectorsPerTrack + (DWORD)((partSize.QuadPart / sectorSize) * i);
  117.     }
  118.     //execute the layout  
  119.     result = DeviceIoControl(
  120.                 hDevice,
  121.                 IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
  122.                 dl,
  123.                 layoutStructSize,
  124.                 NULL,
  125.                 0,
  126.                 &readed,
  127.                 NULL
  128.                 );
  129.     if (!result)
  130.     {
  131.         fprintf(stderr, "IOCTL_DISK_SET_DRIVE_LAYOUT_EX Error: %ld\n", GetLastError());
  132.         free(dl);
  133.         (void)CloseHandle(hDevice);
  134.         return DWORD(-1);
  135.     }

  136.     //fresh the partition table
  137.     result = DeviceIoControl(
  138.                 hDevice,
  139.                 IOCTL_DISK_UPDATE_PROPERTIES,
  140.                 NULL,
  141.                 0,
  142.                 NULL,
  143.                 0,
  144.                 &readed,
  145.                 NULL
  146.                 );
  147.     if (!result)
  148.     {
  149.         fprintf(stderr, "IOCTL_DISK_UPDATE_PROPERTIES Error: %ld\n", GetLastError());
  150.         free(dl);
  151.         (void)CloseHandle(hDevice);
  152.         return DWORD(-1);
  153.     }

  154.     free(dl);
  155.     (void)CloseHandle(hDevice);
  156.     Sleep(3000);            //wait the operations take effect
  157.     return 0;
  158. }
复制代码

以上代码是放进多线程里,然后,在多线程里运行时,对多个磁盘进行初始化,会出现某个磁盘脱机的现象。请问各位大佬,有没有办法解决这个问题?或者以上代码,怎么修改,才能满足初始化多个磁盘并且不会出现脱机的现象呢?劳烦各位大佬们看看,给点意见,小弟在此多谢了!






上一篇:关于C++ Primer第五版P289练习8.10
下一篇:用MFC如何将硬盘从脱机状态变成联机状态
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-7-7 19:36

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表