使用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地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯的.试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩 ...
随机推荐
- 查看mysql二进制日志报错问题
在排查网站被黑时想通过Mysql二进制日志找出修改字段时间,但是使用mysqlbinlog报错: [root@zfszsw1 bin]# ./mysqlbinlog /opt/mysql-bin.00 ...
- 虚拟机如何设置静态IP
一.本机环境 Mac.VMware Fusion 10, CentOS6.8 二.设置静态IP地址 1.选择网络连接模式,选择NAT模式 注意: 1)必须要选择NAT模式,否则你的虚拟机与主机始终会在 ...
- fit in gnuplot
Table of Contents 1. fit-gnuplot 1 fit-gnuplot syntax >> fit [xrange][yrange] function 'datafi ...
- POJ 3122 pie (二分法)
Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have ...
- JSP中使用<c:forEach>标签循环遍历元素
转载:http://blog.csdn.net/hero_cheng/article/details/51924577
- BNU 4346 Scout YYF I
A. Scout YYF I Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java cla ...
- Laya 利用JS进行反射
Laya 利用JS进行反射 @author ixenos 当需要配表调用函数时,可以利用js的eval来调用 1.在配置js中写下: function callAsFunc(funcName){ ev ...
- DataTable 转JSON数据
/// <summary> /// 将datatable转换为json /// </summary> /// <param name="dtb"> ...
- CSU 1290 DP解决数学期望问题
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1290 题目大意: 给定k个数,每次可以生成0-N-1中的任何一个数,k个数中出现不同的整 ...
- SPOJ1812 - Longest Common Substring II(LCS2)
Portal,Portal to 洛谷 Description 给出\(n(n\leq10)\)个仅包含小写字母的字符串\(s_1..s_n(|s_i|\leq10^5)\),求这些字符串的最长公共子 ...