利用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的更多相关文章

  1. C# 获取磁盘容量

    原文:C# 获取磁盘容量 /// 获取指定驱动器的空间总大小(单位为B) /// </summary> /// <param name="str_HardDiskName& ...

  2. windows程序设计 获取磁盘容量

    //磁盘分区的总容量(字节)=总簇数*每簇扇区数*每扇区字节数 //磁盘分区的空闲空间(字节)=空闲簇数*每簇扇区数*每扇区字节数 BOOL GetDiskFreeSpace( LPCTSTR lpR ...

  3. windows下C语言编程获取磁盘(分区)使用情况

    windows下编程获取磁盘(分区)使用情况 windows下编程获取磁盘(分区)使用情况 GetLogicalDriveStrings函数 使用示例 获取需要的缓冲区长度示例 获取所有驱动器号示例 ...

  4. 23、ASP.NET MVC入门到精通——业务层和数据层父类及接口-T4模板

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseB ...

  5. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  6. .net通用权限框架B/S (四)--DAL数据层以及数据接口

    数据层以及数据接口设计如下图(以g_orga组织机构和g_role角色)为例,这几个类可以通过.tt模版生成 设计参考学习http://www.cnblogs.com/hanyinglong/arch ...

  7. 从api接口获取数据-okhttp

    首先先介绍下api接口: API:应用程序接口(API:Application Program Interface) 通常用于数据连接,调用函数提供功能等等... 从api接口获取数据有四种方式:Ht ...

  8. iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数

    iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数 iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的, ...

  9. 根据ip地址从第三方接口获取详细的地理位置

    最近项目某个功能需要根据ip地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯的.试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩 ...

随机推荐

  1. 用Multisim实现彩灯循环控制器

    2019/06/06 !转载请注明出处 1.设计任务目的与要求 1.1 展示器件 10路彩灯分别用10个发光二极管L0.L1…..L9模拟,发光二极管L0.L1…..L9从左到右排列. 1.2 要求显 ...

  2. MySQL连接使用及分类

    SQL连接 SQL 连接(JOIN)子句用于将数据库中两个或者两个以上表中的记录组合起来.连接通过共有值将不同表中的字段组合在一起. 考虑下面两个表,(a)CUSTOMERS 表:+----+---- ...

  3. python之多线程与多进程

    1. 多进程与多线程 (1)背景:为何需要多进程或者多线程:在同一时间里,同一个计算机系统中如果允许两个或者两个以上的进程处于运行状态,这便是多任务.多任务会带来的好处例如用户边听歌.边上网.边打印, ...

  4. Django 多个字段关联同一外键

    # -*- coding: utf-8 -*- """ Tencent is pleased to support the open source community b ...

  5. Python+selenium常用方法(Webdriver API)

    小编整理了目前学习的Python+selenium常用的一些方法函数,以后有新增再随时更新. 加载浏览器驱动: webdriver.Firefox() 打开页面:get() 关闭浏览器:quit() ...

  6. IBM MQ 创建以及常见问题集锦

    消息队列+发送队列+消息通道 接收通道名称与发送端的发送通道名称要一致,修改通道信息后要执行 start channle(chlname) 重启通道.常用的MQ命令 66.0.42.240 用户 mq ...

  7. NYOJ-104最大和(动归题)及连续最大和核心

    最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩 ...

  8. 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  9. HDU 4597

    题目大意: 两人轮流从两堆牌从抽取最顶端或者最底部的牌,得到的分数加到自己身上,问先拿牌的最多能得多少分 记忆化搜索,2堆牌的底和顶,有四种方法,根据四种方法来找到最优解 #include <c ...

  10. [luoguP1773] 符文之语_NOI导刊2010提高(02)(DP)

    传送门 f[i][j]表示前i个数余数为j的最优解 sum[i][j]表示字符串i~j所构成的数 #include <cstdio> #include <cstring> #d ...