X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
嵌入式系统
vc控制台程序如何获取整个硬盘的扇区数?
taoym101
2010-6-10 20:23
楼主
就是在win32 console程序下,通过什么方式可以获取硬盘的总扇区数?
api函数? 转为16位模式调int 13?
另外就是对硬盘的直接读写除了createfile(),还有其他什么方式吗?
点赞
回复评论 (12)
沙发
ronc2000
any response?????
点赞
2010-6-10 20:47
板凳
蒙蒙静
最近的问题一直没人回答哦!!
点赞
2010-6-11 09:15
4楼
linglidu
帮你顶顶
点赞
2010-6-11 09:45
5楼
zc85377
#include
#include
#include
BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
hDevice = CreateFile(TEXT("\\\\.\\PhysicalDrive0"), // drive
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes
if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
return (FALSE);
}
bResult = DeviceIoControl(hDevice, // device to be queried
IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
NULL, 0, // no input buffer
pdg, sizeof(*pdg), // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O
CloseHandle(hDevice);
return (bResult);
}
int main(int argc, char *argv[])
{
DISK_GEOMETRY pdg; // disk drive geometry structure
BOOL bResult; // generic results flag
ULONGLONG DiskSize; // size of the drive, in bytes
bResult = GetDriveGeometry (&pdg);
if (bResult)
{
printf("Cylinders = %I64d\n", pdg.Cylinders);
printf("Tracks/cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
printf("Sectors/track = %ld\n", (ULONG) pdg.SectorsPerTrack);
printf("Bytes/sector = %ld\n", (ULONG) pdg.BytesPerSector);
DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
printf("Disk size = %I64d (Bytes) = %I64d (Gb)\n", DiskSize,
DiskSize / (1024 * 1024 * 1024));
}
else
{
printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
}
return ((int)bResult);
}
点赞
2010-6-11 10:57
6楼
zxd10000
mark!
留下脚印
点赞
2010-6-11 11:20
7楼
yuexiaomei
zwfgdlc的代码我看过,不个那样获取的CHS值都是对的,但算出来的总扇区数(三数相乘)却 不正确,用diskgen查了哈,算出来的扇区始终比 dgen显示的总扇区小一些。
我在想可以用什么函数直接获取 总扇区数 。eg : IOCTL_DISK_GET_DRIVE_GEOMETR_EX这个值,不个正遇到编译错误,正在修改………………
点赞
2010-6-14 18:18
8楼
baiyang8361
看来必须用 IOCTL_DISK_GET_DRIVE_GEOMETR_EX啊,获取的总字节数/512 才为实际的扇区数,
CHS计算出的结果始终要小些,
哪位大侠知道原因哦!!!???
点赞
2010-6-15 21:05
9楼
fund123
貌似是 int 13h 扩展的问题吧。
不管怎样, 比较一下两个 IOCTL code 的说明吧。
点赞
2010-6-16 08:23
10楼
gjchao
这个得自己分析分区表,我写的程序就是如此分析的。除了给我们使用的扇区外。前面还有一些系统扇区。diskgenius分析的确实包含了这部分。
点赞
2010-6-16 08:43
11楼
zhangyi317
引用: 引用 9 楼 wutaihua 的回复:
这个得自己分析分区表,我写的程序就是如此分析的。除了给我们使用的扇区外。前面还有一些系统扇区。diskgenius分析的确实包含了这部分。
那diskgen是如何读取扇区的?writefile()?还是写的驱动哦?
点赞
2010-6-16 23:16
12楼
shufuwu
另外就是 如何 读写 硬盘 的最后几个扇区 的内容?
我用了 setfilepointer(),结果始终无法读取硬盘最后的一些扇区。
始终只能读取前面的一些扇区。
setFilePointer()里我用了两个参数,移动字节的高低三十二位
谁知道 原因哦
点赞
2010-6-16 23:19
13楼
ds_1018
另外就是 如何 读写 硬盘 的最后几个扇区 的内容?
我用了 setfilepointer(),结果始终无法读取硬盘最后的一些扇区。
始终只能读取前面的一些扇区。
setFilePointer()里我用了两个参数,移动字节的高低三十二位
谁知道 原因哦
点赞
2010-6-17 18:12
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
用regsvrce工具,出现这样提示, loadlibrary("\Programe Files\YTMap.ocx") failed. GetLastErro
BLE空中升级
430晶振问题
RGB全彩流水灯
求合作微波射频工程师
异步FIFO结构
Cadence/OrCAD PSpice 16.6新功能
go go go, 让RSL10的LED开始闪烁(文尾有小彩蛋)
导航软件中,方向指示的箭头怎么实现随着我们方位的改变不断的旋转哪?在WINCE中
#以拆会友##8月改装#UT33万用表的改进
猜猜看——图中Vout 是多少?(5)
电源适配器的作用及使用注意事项
晒WEBENCH设计的过程+线圈传感器设计
Q2全球智能机出货量 华为联想进前5
各大汽车厂商原厂CANBUS通信协议资料
请教:如何利用串口接收数据驱动触摸屏和keypad的事件发生! pb5.0下
多层PCB板
求推荐本关于微波传输线的书籍
【stm32F7英雄联盟大赛】多功能测试仪器 上位机程序
#eeworld漫画力作#TI MCU漫画,电子小强&升职记 !
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复