使用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地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯的.试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩 ...
随机推荐
- vue 父子组件的加载顺序
一.加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount ...
- 去除ie下select框箭头
select::-ms-expand { display: none;}兼容ie10及以上
- [LUOGU] P4290 [BZOJ] 1055 [HAOI2008]玩具取名
题目描述 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用"WING"中任意两个字母代 ...
- [POJ] 2223 Muddy Fields
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11490 Accepted: 4270 Description Rain has ...
- 【JDBC】java连接MySQL数据库步骤
java连接数据库步骤 1. 加载驱动 Class.forName("com.mysql.java.Driver"); 或: registerDriver(new com.mysq ...
- pycharm的快捷键以及常用设置
1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 快速导入任意类 Ctrl + Shift + Enter 语句完成 Ctr ...
- pwnable.kr uaf之wp
几乎都想要放弃了,感觉学了好久还是什么都不会,这个题好像很难的样子,有很多知识点需要补充一下: 1.[UAF]分配的内存释放后,指针没有因为内存释放而变为NULL,而是继续指向已经释放的内存.攻击者可 ...
- JSP表达式语言(EL)
JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单.JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式.在JSP EL表达式内可以使用整数型.浮点型.字符串.常量 ...
- hdu 2795线段树
#include<stdio.h> #define N 200005 int h,w,n; struct node { int x,y,max; }a]; int mmax(int e,i ...
- ACM-ICPC 2018 焦作赛区网络预赛 H、L
https://nanti.jisuanke.com/t/31721 题意 n个位置 有几个限制相邻的三个怎么怎么样,直接从3开始 矩阵快速幂进行递推就可以了 #include <bits/st ...