입출력 Control code를 사용하여 파티션 생성 및 포맷

3789 단어 Security

BOOL Result; // used to read bad DeviceIoControl calls
DWORD szReturned;
unsigned int SectorSize = 512;
LARGE_INTEGER DiskSize.QuadPart = 40007761920i64;
LARGE_INTEGER Part_1_size.QuadPart = 27406600704i64;
LARGE_INTEGER Part_2_size.QuadPart =40007761920i64-27406600704i64; 

// Very important! Size correctly this structure. Even if there's only 
// one primary partition, you MUST size the buffer to contain 
// AT LEAST 4 PARTITION_INFORMATION_EX!
DWORD szNewLayout = sizeof(DRIVE_LAYOUT_INFORMATION_EX)+4*sizeof(PARTITION_INFOR MATION_EX);

DRIVE_LAYOUT_INFORMATION_EX *dl = (DRIVE_LAYOUT_INFORMATION_EX*) new BYTE[szNewLayout];

// Open handle to physical device
// NtCreateFile() function can be used too with "\\device\\harddisk1\\partiton0" path.
hDrive=CreateFile("\\\\.\\PhysicalDrive1",GENERIC_READ|GEN ERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,
         NULL, //default security attributes
         OPEN_EXISTING, // disposition
         0,// file attributes
         NULL); 
 
if(!hDrive){
        // handle the error
    }


CREATE_DISK disk;
ZeroMemory(&disk,sizeof(CREATE_DISK));
disk.PartitionStyle = PARTITION_STYLE_MBR;
disk.Mbr.Signature = 0xA4B57300;// the signature can be randomly generated

// Create primary partition MBR
 Result = DeviceIoControl(hDrive,IOCTL_DISK_CREATE_DISK,&disk,size of(CREATE_DISK),NULL,0,&szReturned,NULL); 
 if(!Result){
        // handle the error
    }
DeviceIoControl(hDrive,IOCTL_DISK_UPDATE_PROPERTIES,
        NULL,0,NULL,0,&szReturned,NULL);

 //Setup drive layout
 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 = 0x07;// PARTITION_IFS (NTFS partition or logical drive)
 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 + 32256i64;
 dl->PartitionEntry[1].PartitionLength = Part_2_Size;
 dl->PartitionEntry[1].PartitionNumber=2;
 dl->PartitionEntry[1].RewritePartition = TRUE;
 dl->PartitionEntry[1].Mbr.PartitionType = 0x07;
 dl->PartitionEntry[1].Mbr.RecognizedPartition = 1;
 dl->PartitionEntry[1].Mbr.HiddenSectors = (32256i64+Part_1_Size.QuadPart)/SectorSize;

 // set RewritePartition=true in every partition to force rewrite.
 for (int item=0;item<4;item++)
     dl->PartitionEntry[item].RewritePartition = 1;

 // setup drive layout
 dl->PartitionStyle = PARTITION_STYLE_MBR;
 dl->PartitionCount = 4;// specify AT LEAST 4 partitions!!!
 dl->Mbr.Signature = 0xA4B57300;

 // Set layout
 Result = DeviceIoControl(hDrive,IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
         & ; ;nbs p;      dl,szNewLayout,NULL,0,& ; ; ;szReturned,NULL);
 if(!Result)
        throw Exception(WhatError());

 // update disk properties
 DeviceIoControl(hDrive,IOCTL_DISK_UPDATE_PROPERTIES,
        NULL,0,NULL,0,&szReturned,NULL);

CloseHandle(hDrive);
delete dl;

좋은 웹페이지 즐겨찾기