1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
| // part.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include<iostream>
#include<Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hDrive;
DISK_GEOMETRY diskGeometry;
DWORD szReturned;
unsigned int SectorSize=512;
PARTITION_INFORMATION_EX partitionInfo;
BOOL Result;
DWORD szNewLayout=sizeof(DRIVE_LAYOUT_INFORMATION_EX)+4*sizeof(PARTITION_INFORMATION_EX);
DRIVE_LAYOUT_INFORMATION_EX *dl=(DRIVE_LAYOUT_INFORMATION_EX*) new BYTE[szNewLayout];
hDrive=CreateFile(L"\\\\.\\PhysicalDrive1",GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if(hDrive==NULL)
{std::cout<<"CreateFile errors"<<std::endl;}
CREATE_DISK disk;
ZeroMemory(&disk,sizeof(CREATE_DISK));
disk.PartitionStyle=PARTITION_STYLE_MBR;
disk.Mbr.Signature=0xA4B57300;
Result=DeviceIoControl(hDrive,IOCTL_DISK_CREATE_DISK,&disk,sizeof(CREATE_DISK),NULL,0,&szReturned,NULL);
if(!Result)
{
std::cout<<"IOCTL_DISK_CREATE_DISK errors"<<std::endl;
}
DeviceIoControl(hDrive,IOCTL_DISK_UPDATE_PROPERTIES,NULL,0,NULL,0,&szReturned,NULL);
DeviceIoControl(hDrive,IOCTL_DISK_GET_PARTITION_INFO,NULL,0,&partitionInfo,sizeof (PARTITION_INFORMATION),&szReturned,(LPOVERLAPPED)NULL);
DeviceIoControl(hDrive,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&diskGeometry,sizeof (DISK_GEOMETRY),&szReturned,(LPOVERLAPPED)NULL);
cout << "Num of cylinders: " << diskGeometry.Cylinders.QuadPart << endl;
cout << "Tracks per cylinder: " << diskGeometry.TracksPerCylinder << endl;
cout << "Sectors per track: " << diskGeometry.SectorsPerTrack << endl;
cout << "Bytes per sector: " << diskGeometry.BytesPerSector << endl;
int col=diskGeometry.Cylinders.QuadPart*diskGeometry.TracksPerCylinder*diskGeometry.SectorsPerTrack;
cout<<"Col sector "<<col<<endl;
cout<<"Size in byte "<<col*diskGeometry.BytesPerSector<<endl;
LARGE_INTEGER DiskSize,Part_1_size,Part_2_size;
DiskSize.QuadPart = col*diskGeometry.BytesPerSector;
Part_1_size.QuadPart =col*diskGeometry.BytesPerSector/2;
Part_2_size.QuadPart= col*diskGeometry.BytesPerSector/2;
ZeroMemory(dl,szNewLayout);
dl->PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;
dl->PartitionEntry[0].StartingOffset.QuadPart = 32256;
dl->PartitionEntry[0].PartitionLength = Part_1_size;
dl->PartitionEntry[0].PartitionNumber = 1;
dl->PartitionEntry[0].RewritePartition = TRUE;
dl->PartitionEntry[0].Mbr.PartitionType = PARTITION_FAT32;
dl->PartitionEntry[0].Mbr.BootIndicator = TRUE;
dl->PartitionEntry[0].Mbr.RecognizedPartition = 1;
dl->PartitionEntry[0].Mbr.HiddenSectors=32256/SectorSize;
dl->PartitionEntry[1].PartitionStyle=PARTITION_STYLE_MBR;
dl->PartitionEntry[1].StartingOffset.QuadPart= Part_1_size.QuadPart + 32256;
dl->PartitionEntry[1].PartitionLength = Part_2_size;
dl->PartitionEntry[1].PartitionNumber=0;
dl->PartitionEntry[1].RewritePartition = TRUE;
dl->PartitionEntry[1].Mbr.PartitionType = PARTITION_EXTENDED;
dl->PartitionEntry[1].Mbr.RecognizedPartition = 1;
dl->PartitionEntry [1]. Mbr.BootIndicator = FALSE;
dl->PartitionEntry[1].Mbr.HiddenSectors = (32256+Part_1_size.QuadPart)/SectorSize;
for (int item=0;item<4;item++)
{
dl->PartitionEntry[item].RewritePartition = 1;
dl->PartitionEntry [item]. PartitionNumber = 0;
}
dl->PartitionStyle = PARTITION_STYLE_MBR;
dl->PartitionCount = 4;
dl->Mbr.Signature = 0xA4B57300;
if(!DeviceIoControl(hDrive,IOCTL_DISK_SET_DRIVE_LAYOUT_EX, &dl,szNewLayout,NULL,0,&szReturned,NULL))
{std::cout<<"errors"<<std::endl;}//возращает false
DeviceIoControl(hDrive,IOCTL_DISK_UPDATE_PROPERTIES,NULL,0,NULL,0,&szReturned,NULL);
CloseHandle(hDrive);
delete dl;
return 0;
} |