使用HD/IDE层的ioctl接口获取磁盘容量get_hdd_max_sector
利用HD/IDE layer的ioctl函数接口获取HD/IDE的磁盘容量。HDIO_DRIVE_TASK 能发出訪问LBA地址的命令。但不能读写数据。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <linux/hdreg.h>
#include <linux/types.h>
#include <sys/stat.h>
#include <scsi/sg.h>
#include <scsi/scsi.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/time.h>
#define ATA_DRQ (1 << 3) /* data request i/o */
#define ATA_ERR (1 << 0) /* have an error */
#define DRIVER_SENSE 0x08
#define CONDITION_GOOD 0x02
#define ATA_PASS_THRU_12 12
#define ATA_12 0xa1
#define ATA_PASS_THRU_16 16
#define ATA_16 0x85
#define u64 unsigned long long
#define u32 unsigned int
#define u8 unsigned char
#define u16 unsigned short
//ATA commands
enum {
ATA_OP_DSM = 0x06, // Data Set Management (TRIM)
ATA_OP_READ_PIO = 0x20,
ATA_OP_READ_PIO_ONCE =0x21,
ATA_OP_READ_LONG =0x22,
ATA_OP_READ_LONG_ONCE =0x23,
ATA_OP_READ_PIO_EXT =0x24,
ATA_OP_READ_DMA_EXT =0x25,
ATA_OP_READ_FPDMA =0x60, // NCQ
ATA_OP_WRITE_PIO =0x30,
ATA_OP_WRITE_LONG =0x32,
ATA_OP_WRITE_LONG_ONCE =0x33,
ATA_OP_WRITE_PIO_EXT =0x34,
ATA_OP_WRITE_DMA_EXT =0x35,
ATA_OP_WRITE_FPDMA =0x61, // NCQ
ATA_OP_READ_VERIFY =0x40,
ATA_OP_READ_VERIFY_ONCE =0x41,
ATA_OP_READ_VERIFY_EXT =0x42,
ATA_OP_WRITE_UNC_EXT =0x45, // lba48, no data, uses feat reg
ATA_OP_FORMAT_TRACK =0x50,
ATA_OP_DOWNLOAD_MICROCODE = 0x92,
ATA_OP_STANDBYNOW2 =0x94,
ATA_OP_CHECKPOWERMODE2 =0x98,
ATA_OP_SLEEPNOW2 =0x99,
ATA_OP_PIDENTIFY =0xa1,
ATA_OP_READ_NATIVE_MAX =0xf8,
ATA_OP_READ_NATIVE_MAX_EXT = 0x27,
ATA_OP_SMART = 0xb0,
ATA_OP_DCO = 0xb1,
ATA_OP_ERASE_SECTORS =0xc0,
ATA_OP_READ_DMA = 0xc8,
ATA_OP_WRITE_DMA =0xca,
ATA_OP_DOORLOCK = 0xde,
ATA_OP_DOORUNLOCK =0xdf,
ATA_OP_STANDBYNOW1 =0xe0,
ATA_OP_IDLEIMMEDIATE =0xe1,
ATA_OP_SETIDLE = 0xe3,
ATA_OP_SET_MAX = 0xf9,
ATA_OP_SET_MAX_EXT =0x37,
ATA_OP_SET_MULTIPLE =0xc6,
ATA_OP_CHECKPOWERMODE1 =0xe5,
ATA_OP_SLEEPNOW1 =0xe6,
ATA_OP_FLUSHCACHE =0xe7,
ATA_OP_FLUSHCACHE_EXT =0xea,
ATA_OP_IDENTIFY = 0xec,
ATA_OP_SETFEATURES =0xef,
ATA_OP_SECURITY_SET_PASS = 0xf1,
ATA_OP_SECURITY_UNLOCK =0xf2,
ATA_OP_SECURITY_ERASE_PREPARE = 0xf3,
ATA_OP_SECURITY_ERASE_UNIT = 0xf4,
ATA_OP_SECURITY_FREEZE_LOCK = 0xf5,
ATA_OP_SECURITY_DISABLE =0xf6,
ATA_OP_VENDOR_SPECIFIC_0x80 = 0x80,
/* added by openvox */
ATA_OP_SET_MAX_SET_PASSWORD = 0xf9,
};
int verbose = 1;
u8 last_identify_op = 0;
u16 *id;
static u64 get_disk_size(const char*name)
{
const char *ptr = name + strlen(name) - 3;
u64 size;
char buff[128];
FILE *fp;
sprintf(buff,"/sys/block/%s/size",ptr);
if(NULL == (fp = fopen(buff,"r"))){
perror("fopen");
return 0;
}
fscanf(fp,"%lld",&size);
fclose(fp);
return size;
}
/*!
IssuingATA commands
*/
int ata_ioctl(int fd)
{
unsigned char cdb[7];
int err = 0;
cdb[0] = ATA_OP_READ_NATIVE_MAX ; //command id ATA_OP_READ_NATIVE_MAX_ADDRESS 0xf8
cdb[1] = 0x00; //feature id
cdb[2] = 0x00; //number of sectors
cdb[3]= 0x00; //LBAlow
cdb[4] = 0x00; //LBA mid
cdb[5] = 0x00; //LBA high
cdb[6] = 0x40; // device select
if (-1 == (err = ioctl(fd, HDIO_DRIVE_TASK, (void *)cdb))) {
perror("HDIO_DRIVE_TASK erro in ata_ioctl!\n");
return -1;
}
printf ("status %02x\n", cdb[0]);
printf("error %02x\n", cdb[1]);
printf("n sect %02x\n", cdb[2]);
printf("LBA L %02x\n", cdb[3]);
printf("LBA M %02x\n", cdb[4]);
printf("LBA H %02x\n", cdb[5]);
printf("select %02x\n", cdb[6]);
return 0;
}
static void get_identify_data (int fd)
{
staticu8 args[4+512];
inti = 0;
memset(args,0, sizeof(args));
last_identify_op= ATA_OP_IDENTIFY;
args[0]= last_identify_op;
args[3]= 1; /* sector count */
if(do_drive_cmd(fd, args, 0)) {
perror(" HDIO_DRIVE_CMD(identify)failed");
return;
}
printf("incomingdata : \n");
for(; i < 512; i++)
{ if(i == 0)
printf("\n0 :");
printf("%02x ",args[i+4]);
if ((i+1) % 20 == 0)
printf("\n%d:",i+1);
}
printf("\n");
}
int main(int argc, char *argv[])
{
u64 offset = 0;
int fd;
u64 capacity;
int size;
if (argc != 2) {
printf("Usage: %s devname\n",argv[0]);
printf("\n");
return 0;
}
capacity = get_disk_size(argv[1]);
printf("HDD capacity = %lld\n",capacity);
if(-1 == (fd = open(argv[1],O_RDWR))){
perror("open");
return fd;
}
get_identify_data(fd);
if(ata_ioctl(fd) != 0)
{
printf("ata_ioctl error !\n");
exit(-1);
}
close(fd);
return 0;
}
博约分享代码:http://blog.csdn.net/yuesichiu/article/details/40535501
使用HD/IDE层的ioctl接口获取磁盘容量get_hdd_max_sector的更多相关文章
- C# 获取磁盘容量
原文:C# 获取磁盘容量 /// 获取指定驱动器的空间总大小(单位为B) /// </summary> /// <param name="str_HardDiskName& ...
- windows程序设计 获取磁盘容量
//磁盘分区的总容量(字节)=总簇数*每簇扇区数*每扇区字节数 //磁盘分区的空闲空间(字节)=空闲簇数*每簇扇区数*每扇区字节数 BOOL GetDiskFreeSpace( LPCTSTR lpR ...
- windows下C语言编程获取磁盘(分区)使用情况
windows下编程获取磁盘(分区)使用情况 windows下编程获取磁盘(分区)使用情况 GetLogicalDriveStrings函数 使用示例 获取需要的缓冲区长度示例 获取所有驱动器号示例 ...
- 23、ASP.NET MVC入门到精通——业务层和数据层父类及接口-T4模板
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseB ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- .net通用权限框架B/S (四)--DAL数据层以及数据接口
数据层以及数据接口设计如下图(以g_orga组织机构和g_role角色)为例,这几个类可以通过.tt模版生成 设计参考学习http://www.cnblogs.com/hanyinglong/arch ...
- 从api接口获取数据-okhttp
首先先介绍下api接口: API:应用程序接口(API:Application Program Interface) 通常用于数据连接,调用函数提供功能等等... 从api接口获取数据有四种方式:Ht ...
- iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数
iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的, ...
- 根据ip地址从第三方接口获取详细的地理位置
最近项目某个功能需要根据ip地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯的.试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩 ...
随机推荐
- 基于jquery的自定义显示消息数量
根据需求简单的实现一个小功能控件,暂时不支持扩展 $("xxxxxxx").iconCountPlugin(options, start, isOffset) {//三个参数,自定 ...
- [LOJ] 分块九题 7
区间加法,区间乘法,单点查询. 洛谷线段树2 屡清加法乘法的关系,定义答案为 a*mut+add 对于整块: 新的乘w,mut和add都要乘w 新的加w,add加w //Stay foolish,st ...
- Redis主从配置与数据备份还原
一.主从配置: 1.下载: wget http://download.redis.io/releases/redis-4.0.9.tar.gz tar xzf redis-4.0.9.tar.gz c ...
- IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式
IP协议头IP包头格式: 1.版本号:4个bit,用来标识IP版本号.这个4位字段的值设置为二进制的0100表示IPv4,设置为0110表示IPv6.目前使用的IP协议版本号是4. 2.首部长度:4个 ...
- QEMU支持的几种常见的镜像文件格式
qemu-img支持非常多种的文件格式,可以通过"qemu-img -h"查看其命令帮助得到,它支持二十多种格式:blkdebug.blkverify.bochs.cloop.c ...
- Canal使用报错解决办法
1. [destination = test_cancal , address = /127.0.0.1:3306 , EventParser] WARN c.a.o.s.a.i.setl.zooke ...
- python 学习总结1
计算机与程序设计 一.计算机的概念 1.计算机是根据指令操作数据的设备. 2.计算机主要包括两个功能性一个是功能性另一个是计算性 功能性是对数据的操作,表现为数据计算,输入输出处理和结果存储 可编程性 ...
- MySQL 存储 utf8mb4
1.如果是阿里云数据库 a.控制台->修改参数character_set_server参数为UTF8mb4 b.设置库的字符集为UTF8mb4 2.如果是自己mysql服务器 [client] ...
- No unique bean of type..... Unsatisfied dependency of type
比如在XXXServiceImpl里面写了aa()方法给别的地方调用 但是自己又调用了自己 在开头写了 @Autowired Private XXX xxx; xxx.aa(); 这样重复调用自己的b ...
- python006 Python3 运算符
Python3 运算符什么是运算符?本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符.Python语言 ...