查阅了很多资料,成功读取到IDE硬盘与SCSI硬盘的相关信息,为感谢众多网友的帮助,不敢独占,特将IDE部分的代码加上部分中文注释共享出来。
类:HDSerial,已经封装好,能够读出硬盘的大部分信息,如序列号,厂商,型号,硬盘结构等。要取得硬盘序列号,只需要创建一个HDSerial对象,调用相应的get***()即可。
原理:调用windows API或者通过汇编中断服务程序读取,本文实现的前者。
本文只实现了IDE硬盘信息的读取,而且必须要拥有管理员权限。需要读SCSI硬盘信息或者需要突破管理员权限读取的朋友可以联系我。
实现:首先通过CreateFile函数取得当前第一个物理驱动器(一般是硬盘)句柄,然后调用DeviceIOCotrol()通过进一步判断该驱动器的类型(如IDE、SCSI等),然后再根据不同的驱动器类型调用WinNTReadIDEHDSerial()获得硬盘信息。 在windows XP,VC6下编译通过。
// HDSerial.h: inte***ce for the HDSerial class.
//
//
#if !defined(AFX_HDSERIAL_H__469873D2_1336_4B56_AE16_AACD71EAB117__INCLUDED_)
#define AFX_HDSERIAL_H__469873D2_1336_4B56_AE16_AACD71EAB117__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "WinIOCtl.h"
#include "stdio.h"
#define IDENTIFY_BUFFER_SIZE 512
#define IOCTL_GET_VERSION 0x00074080
#define IDE_ATAPI_IDENTIFY 0xA1 // Returns ID sector for ATAPI.
#define IDE_ATA_IDENTIFY 0xEC // Returns ID sector for ATA.
#define IOCTL_GET_DRIVE_INFO 0x0007c088
class HDSerial
{
private:
typedef struct _DRIVERSTATUS
{
BYTE bDriverError; // Error code from driver, or 0 if no error.
BYTE bIDEStatus; // Contents of IDE Error register.
// Only valid when bDriverError is SMART_IDE_ERROR.
BYTE bReserved[2]; // Reserved for future expansion.
DWORD dwReserved[2]; // Reserved for future expansion.
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
typedef struct _IDEREGS
{
BYTE bFeaturesReg; // Used for specifying SMART "commands".
BYTE bSectorCountReg; // IDE sector count register
BYTE bSectorNumberReg; // IDE sector number register
BYTE bCylLowReg; // IDE low order cylinder value
BYTE bCylHighReg; // IDE high order cylin
类:HDSerial,已经封装好,能够读出硬盘的大部分信息,如序列号,厂商,型号,硬盘结构等。要取得硬盘序列号,只需要创建一个HDSerial对象,调用相应的get***()即可。
原理:调用windows API或者通过汇编中断服务程序读取,本文实现的前者。
本文只实现了IDE硬盘信息的读取,而且必须要拥有管理员权限。需要读SCSI硬盘信息或者需要突破管理员权限读取的朋友可以联系我。
实现:首先通过CreateFile函数取得当前第一个物理驱动器(一般是硬盘)句柄,然后调用DeviceIOCotrol()通过进一步判断该驱动器的类型(如IDE、SCSI等),然后再根据不同的驱动器类型调用WinNTReadIDEHDSerial()获得硬盘信息。 在windows XP,VC6下编译通过。
// HDSerial.h: inte***ce for the HDSerial class.
//
//
#if !defined(AFX_HDSERIAL_H__469873D2_1336_4B56_AE16_AACD71EAB117__INCLUDED_)
#define AFX_HDSERIAL_H__469873D2_1336_4B56_AE16_AACD71EAB117__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "WinIOCtl.h"
#include "stdio.h"
#define IDENTIFY_BUFFER_SIZE 512
#define IOCTL_GET_VERSION 0x00074080
#define IDE_ATAPI_IDENTIFY 0xA1 // Returns ID sector for ATAPI.
#define IDE_ATA_IDENTIFY 0xEC // Returns ID sector for ATA.
#define IOCTL_GET_DRIVE_INFO 0x0007c088
class HDSerial
{
private:
typedef struct _DRIVERSTATUS
{
BYTE bDriverError; // Error code from driver, or 0 if no error.
BYTE bIDEStatus; // Contents of IDE Error register.
// Only valid when bDriverError is SMART_IDE_ERROR.
BYTE bReserved[2]; // Reserved for future expansion.
DWORD dwReserved[2]; // Reserved for future expansion.
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
typedef struct _IDEREGS
{
BYTE bFeaturesReg; // Used for specifying SMART "commands".
BYTE bSectorCountReg; // IDE sector count register
BYTE bSectorNumberReg; // IDE sector number register
BYTE bCylLowReg; // IDE low order cylinder value
BYTE bCylHighReg; // IDE high order cylin