双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

[求解]利用IOCTL_DISK_SET_DRIVE_LAYOUT_EX给磁盘分区

fly4free fly4free 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
先上一段代码, 该代码根据网上找到的修改了一下,注释(英文的)基本没删。
"\\\\.\\PhysicalDrive1" 是我的U盘的符号连接。。


DWORD func()
{
HANDLE hDrive = INVALID_HANDLE_VALUE;
BOOL Result; // used to read bad DeviceIoControl calls
DWORD dwRetCode = 0;
DWORD szReturned;
DWORD szNewLayout;
unsigned int SectorSize = 512;
LARGE_INTEGER DiskSize;
LARGE_INTEGER Part_1_size;
LARGE_INTEGER Part_2_size;

DRIVE_LAYOUT_INFORMATION_EX *dl = NULL;
CREATE_DISK disk;

DiskSize.QuadPart = 32768000; //我的U盘的总容量,字节数
Part_1_size.QuadPart = 32768000 / 2;
Part_2_size.QuadPart = 32768000 / 2;

int PartitionCount = 4;

// 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!
szNewLayout = sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
(PartitionCount - 1) * sizeof(PARTITION_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(
_T("\\\\.\\PhysicalDrive1"),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, //default security attributes
OPEN_EXISTING, // disposition
0,// file attributes
NULL);

if(!hDrive){
// handle the error
dwRetCode = GetLastError();
goto SetDriveLayout_Cleanup;
}

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,sizeof(CREATE_DISK), NULL,0, &szReturned,NULL);

if(!Result){
dwRetCode = GetLastError();
goto SetDriveLayout_Cleanup;
}
Result = DeviceIoControl(hDrive,IOCTL_DISK_UPDATE_PROPERTIES,
NULL,0,NULL,0,&szReturned,NULL);

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

//Setup drive layout
ZeroMemory(dl, szNewLayout);

dl->PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;
dl->PartitionEntry[0].StartingOffset.QuadPart = 32256; // 63扇区
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;
goto OPERATION_Continue;

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 = 0;
dl->PartitionEntry[1].RewritePartition = TRUE;
dl->PartitionEntry[1].Mbr.PartitionType = PARTITION_EXTENDED; //0x05
dl->PartitionEntry[1].Mbr.BootIndicator = FALSE;
dl->PartitionEntry[1].Mbr.RecognizedPartition = 1;
dl->PartitionEntry[1].Mbr.HiddenSectors = (32256i64 + Part_1_size.QuadPart)/SectorSize;


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

// Set layout
Result = DeviceIoControl(hDrive,
IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
&dl, szNewLayout,
NULL, 0,
&szReturned, NULL);

if(!Result) {
dwRetCode = GetLastError();
goto SetDriveLayout_Cleanup;
}

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

SetDriveLayout_Cleanup:
if (hDrive != INVALID_HANDLE_VALUE )
CloseHandle(hDrive);
if (dl != NULL)
delete [] dl;

return dwRetCode;
}



在后面调用 IOCTL_DISK_SET_DRIVE_LAYOUT_EX 的时候,失败,GetLastError信息为:
0x00000018 程序发出命令,但命令长度不正确。

修改了各种相关数值,貌似都这一个结果,怎么办?
...全文

相关推荐

实战DeviceIoControl

实战DeviceIoControl 之一Q 在NT/2000/XP中,我想用VC编写应用程序访问硬件设备,如获取磁盘参数、读写绝对扇区数据、测试光驱实际速度等,该从哪里入手呢? A 在NT/2000/XP中,应用程序可以通过API函数DeviceIoControl来实现对设备的访

努力中的小人物

从可观测性的角度研究基于扩展卡尔曼滤波器(EKF)的同时定位与地图构建(SLAM)中的不一致性问题(Matlab代码实现)

内容概要:本文系统研究了基于扩展卡尔曼滤波器(EKF)的同时定位与地图构建(SLAM)系统中存在的不一致性问题,重点从系统可观测性的角度进行深入分析。文章指出,EKF-SLAM在实际应用中常因系统可观测性不足而导致状态估计偏差和协方差低估,进而引发滤波器发散或定位精度下降。通过理论推导揭示了在特定运动模式(如纯旋转或直线运动)下系统可观测性降低的机理,并结合Matlab仿真实验验证了相关结论。研究构建了典型的SLAM仿真场景,展示了不同运动轨迹对估计一致性的影响,并探讨了提升系统可观测性的改进策略,旨在增强EKF-SLAM算法的鲁棒性与可靠性。; 适合人群:具备控制理论、机器人学、状态估计或传感器融合等相关领域基础知识,正在从事SLAM、自主导航、智能系统研发的硕士、博士研究生及科研人员。; 使用场景及目标:①深入理解EKF-SLAM中估计不一致性的根本原因及其与可观测性的内在联系;②掌握基于可观测性理论分析非线性估计系统的方法;③利用提供的Matlab代码复现仿真结果,用于学术研究、算法验证或教学演示。; 阅读建议:建议读者结合线性系统理论与非线性滤波知识,重点研读可观测性分析的数学推导部分,并动手运行配套的Matlab代码,通过改变机器人运动轨迹等方式观察滤波性能变化,以深化对理论内容的理解与实践应用能力。

大龙不吃小鱼干

基于AI大模型的量化交易可信数据空间建设方案.pptx

基于AI大模型的量化交易可信数据空间建设方案.pptx

公众号:优享智库

(Multisim课设资料)最全面函数信号发生器(三角波+正弦波+方波信号+锯齿波仿真设计+报告文档

内容概要:本文详细介绍了基于Multisim的最全面函数信号发生器的设计与仿真,涵盖三角波、正弦波、方波及锯齿波等多种信号的生成电路设计,并结合仿真结果进行分析验证。文档不仅提供了完整的电路设计方案,还包括详尽的报告文档,适用于电子类课程设计与实践教学。通过该设计,用户能够深入掌握信号发生器的工作原理、Multisim仿真软件的应用技巧以及模拟电路的调试方法,全面提升电路设计与系统仿真能力。; 适合人群:电子信息工程、自动化、电气工程等相关专业的本科生及研究生,具备基本电路理论知识和Multisim软件操作基础的学习者。; 使用场景及目标:①用于高校电子类课程设计(如模拟电子技术、电路仿真等)的教学与实践;②帮助学生系统掌握函数信号发生器的设计流程与Multisim仿真技能;③为科研项目中信号源模块的搭建提供可复用的参考方案和技术支持。; 阅读建议:建议读者结合Multisim软件同步操作,按照文档中的电路图逐步搭建并仿真,重点关注各信号产生电路的参数设置、波形生成质量及调试过程,以深化对模拟电路工作原理与系统设计方法的理解。

荔枝科研社

Go语言高并发与云原生项目实战

Go语言高并发与云原生项目实战

miaobinfei
评论 6
收藏 已收藏
分享
返回顶部
fly4free
硬件/系统 2,644 成员 17,229 内容