Как инициализировать диск на сервере Windows 2008/2012 через программу C ++

Мы пытаемся инициализировать диск со свойствами некоторого существующего диска на сервере Windows 2008/2012 с помощью программы C ++.

Мы используем DeviceIoControl() метод и IOCTL_DISK_CREATE_DISK, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, IOCTL_DISK_SET_PARTITION_INFO_EX коды от Коды управления дисками сделать диск доступным для использования.

Получил следующий фрагмент кода, немного поискав

//To open the drive
hDevice = CreateFile( TEXT("\\\\.\\PhysicalDrive7"),
GENERIC_READ | GENERIC_WRITE,       // no access to the drive
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL,                               // default security attributes
OPEN_EXISTING,                      // disposition
0,                                  // file attributes
NULL);                              // do not copy file attributesCREATE_DISK dsk;
dsk.PartitionStyle = PARTITION_STYLE_MBR; //It can also be PARTITION_STYLE_GPT
dsk.Mbr.Signature = 1;

// Initialize disk
bResult = DeviceIoControl( hDevice,                 // device to be queried
IOCTL_DISK_CREATE_DISK,  // operation to perform
&dsk, sizeof(dsk),
NULL, 0,                // no output buffer
&junk,                  // # bytes returned
NULL
);

LARGE_INTEGER lgPartitionSize;
lgPartitionSize.QuadPart = (1024 * 1024 * 1024);
DWORD dwDriverLayoutInfoExLen = sizeof (DRIVE_LAYOUT_INFORMATION_EX) + 3 * sizeof(PARTITION_INFORMATION_EX);
DRIVE_LAYOUT_INFORMATION_EX *pdg = (DRIVE_LAYOUT_INFORMATION_EX *)new BYTE[dwDriverLayoutInfoExLen];

SecureZeroMemory(pdg, dwDriverLayoutInfoExLen);

pdg->PartitionStyle = PARTITION_STYLE_MBR;
pdg->PartitionCount = 1;
pdg->Mbr.Signature = 1;

pdg->PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;
pdg->PartitionEntry[0].StartingOffset.QuadPart = 1048576;
pdg->PartitionEntry[0].PartitionLength.QuadPart = lgPartitionSize.QuadPart * 200;
pdg->PartitionEntry[0].PartitionNumber = 1;
pdg->PartitionEntry[0].RewritePartition = TRUE;

pdg->PartitionEntry[0].Mbr.PartitionType = PARTITION_NTFT; // PARTITION_IFS (NTFS partition or logical drive)
pdg->PartitionEntry[0].Mbr.BootIndicator = TRUE;
pdg->PartitionEntry[0].Mbr.RecognizedPartition = 1;
pdg->PartitionEntry[0].Mbr.HiddenSectors = 32256 / 512;

// Partition a disk
bResult = DeviceIoControl( hDevice,        // device to be queried
IOCTL_DISK_SET_DRIVE_LAYOUT_EX,  // operation to perform
pdg, sizeof DRIVE_LAYOUT_INFORMATION_EX, //output buffer
NULL, 0,                // no output buffer
&junk,                    // # bytes returned
NULL
);

bResult = DeviceIoControl(  hDevice,
IOCTL_DISK_UPDATE_PROPERTIES,
NULL, 0, NULL, 0, &junk, NULL);

PARTITION_INFORMATION_EX dskinfo;
PARTITION_INFORMATION_MBR mbrinfo;
mbrinfo.PartitionType = PARTITION_NTFT;
mbrinfo.HiddenSectors = (32256 / 512);
mbrinfo.BootIndicator = 1;
mbrinfo.RecognizedPartition = 1;

dskinfo.PartitionStyle = PARTITION_STYLE_MBR;
dskinfo.StartingOffset.QuadPart = 1048576;//0;
dskinfo.PartitionLength.QuadPart = lgPartitionSize.QuadPart * 200;
dskinfo.PartitionNumber = 1;
dskinfo.RewritePartition = TRUE;
dskinfo.Mbr = mbrinfo;bResult = DeviceIoControl( hDevice,        // device to be queried
IOCTL_DISK_SET_PARTITION_INFO_EX,  // operation to perform
&dskinfo, sizeof(dskinfo),        // output buffer
NULL, 0,                // no output buffer
&junk,                    // # bytes returned
NULL
);

Все звонки на DeviceIoControl() добиваются успеха, кроме последнего с IOCTL_DISK_SET_PARTITION_INFO_EX код с ошибкой 1 (т.е. неправильная функция). Что может быть причиной этого?

Если мы закомментируем последний вызов, диск инициализируется как необработанный диск, но это не будет соответствовать нашим требованиям.

Приведенный выше пример предназначен только для стиля раздела MBR. Мы не смогли найти образец для GPT, … стилей. Пожалуйста, дайте ссылку, если кто-то знает о ней.

1

Решение

Вы используете неправильный тип структуры с IOCTL_DISK_SET_PARTITION_INFO_EX, Требуется SET_PARTITION_INFORMATION_EX структура, а не PARTITION_INFORMATION_EX состав.

Вам, вероятно, не нужно использовать IOCTL_DISK_SET_PARTITION_INFO_EX, поскольку он просто устанавливает тип раздела, который должен быть уже установлен с IOCTL_DISK_SET_DRIVE_LAYOUT_EX, К сожалению, вы использовали его, чтобы установить неправильный тип раздела. NTFS разделы имеют тип раздела PARTITION_IFS,

Умножив lgPartitionSize от 200 почти наверняка неправильно. Если lgPartitionSize Предполагается, что размер в секторах необходимо умножить на размер сектора диска. Размер сектора жестких дисков всегда был 512 байт (0x200 байт), но современные накопители используют размер сектора 4096 байт.

Правильно создать таблицы разделов непросто, и бессмысленное копирование чужого кода, как вы сделали, не сработает. Даже после того, как вы исправите проблемы, о которых я упоминал выше, вы все равно можете столкнуться с другими проблемами. Вы действительно должны понимать все ограничения, накладываемые на то, как должны быть расположены разделы.

Вы можете рассмотреть возможность использования diskpart команда для программной инициализации дисков вместо кода C ++.

1

Другие решения


По вопросам рекламы [email protected]