用IO创建并格式化分区
- 转载:http://raylinn.iteye.com/blog/570274
- 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;
用IO创建并格式化分区的更多相关文章
- EFI/GPT探索(为何win7分区时创建100M隐藏分区)
EFI/GPT探索(为何win7分区时创建100M隐藏分区) 转自 http://blog.tomatoit.net/article.asp?id=348 EFI/GPT是新一代的固件/启动管理技术, ...
- CentOS 添加硬盘创建并挂载分区
分区工具介绍: fdisk 创建MBR分区:所支持的最大卷:2T,而且对分区有限制:最多4个主分区或3个主分区加一个扩展分区 gdisk 创建GPT分区:突破MBR 4个主分区限制,每个磁盘最多支持1 ...
- 手工创建 efi,msr 分区 · Virgil Chan
昨天在帮同学装 win10 的时候,不小心(不知道那是什么东西)把原系统的 efi 和 msr 盘删了,用 WinNTsetup 安装时 EFI PART 总显示红叉,安装后也进不去系统,想想应该是找 ...
- CentOS创建管理LVM分区(挂载新分区)
来源: CentOS 8.0 创建管理LVM分区(挂载新分区) https://www.iwmyx.cn/centos80cjgllvmfa.html 1.查看可用磁盘 fdisk -l 2.新盘(/ ...
- Win7/Win8安装"我们无法创建新的分区,也找不到现有的分区"的解决方法
如果你用pe启动光盘和pe启动盘.加载iso安装时遇到"我们无法创建新的分区,也找不到现有的分区"的情况.. 把iso里的boot和bootgmr以及sources复制到c盘,pe ...
- win10安装提示“我们无法创建新的分区”
今日于笔记本安装win10时突然出现提示:我们无法创建新的分区.网上搜了不少建议,尝试了都无果. 由于我的笔记本是固态硬盘与机械硬盘混合,所以情况可能更加特殊. 最后成功的方法是: 1. 先将Win1 ...
- mkfs格式化分区(为分区写入文件系统)
mkfs 命令非常简单易用,不过是不能调整分区的默认参数的(比如块大小是 4096 Bytes),这些默认参数除非特殊清况,否则不需要调整.如果想要调整,就需要使用 mke2fs 命令重新格式化.命令 ...
- #内存不够,swap来凑# Linux上创建SWAP文件/分区
转自:https://www.vmvps.com/how-to-create-a-swap-file-on-the-linux-os.html 很久很久以前,电脑的内存是个珍贵东西,于是乎就有了swa ...
- Ubuntu格式化分区时的一个小错误
admin@gpc:/$ sudo mkfs -t ext3 -c /dev/sdb1 mkfs.ext3: inode_size (128) * inodes_count (0) too big ...
随机推荐
- LeetCode & Q219-Contains Duplicate II
Array Hash Table Description: Given an array of integers and an integer k, find out whether there ar ...
- 常见web攻击总结
搞Web开发离不开安全这个话题,确保网站或者网页应用的安全性,是每个开发人员都应该了解的事.本篇主要简单介绍在Web领域几种常见的攻击手段及Java Web中的预防方式. XSS SQL注入 DDOS ...
- AngularJS1.X学习笔记13-路由
ThinkPHP框架有路由的概念,看起来路由更多的是后端的事情,Angular怎么也会跑出个路由呢?事实上,Angular是着眼于单页应用的,他的一个应用一般来说是一个页面,你所看到的页面内容的改变, ...
- dubbo的InvocationChain
个人觉得dubbo比较好的设计是:一个是Cooma微容器设计.另一个就是InvocationChain了 Cooma微容器是自己实现了一套SPI,方便了用户做扩展: InvocationChain类似 ...
- kafka和mqtt的区别是什么?
两者都是从传统的Pub/Sub消息系统演化出来的,但是进化方向不一样,比较如下: Kafka是为了数据集成的场景,与以往Pub/Sub消息总线不一样,通过分布式架构提供了海量消息处理.高容错的方式存储 ...
- HTTP协议扫盲(七)请求报文之 GET、POST-FORM 和 POST-FILE
一.get 1.页面代码 2.请求报文 3.小结 get请求没有报文体,所以请求报文没有content-type url上的query参数param11=val11¶m12=val12 ...
- Object.defineProperties()和Object.defineProperty()方法
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 语法:Object.defineProperty(obj, pro ...
- mongodb 索引的基本命令
mongodb的索引: 在数据量超大的时候,能够极大的增快查询速率,但是会降低更新效率.建立索引: db.集合.ensureIndex({属性:1}) //1代表升序 -1代表降序 db.集合.ens ...
- PHP / Laravel 月刊 #23
最新资讯 Laravel 5.6 中文文档翻译完成,译者 60 人,耗时 10 天 Summer Dingo API 中文文档翻译召集[已完成] Summer 我最喜欢 Laravel 5.6 的三个 ...
- JavaScript 对图像进行(追加,插入,替换,删除)
JavaScript 对图像进行(追加,插入,替换,删除) 本次所学内容: document.querySelector('.container') 这个是可以查找单个[id标签和class标签] d ...