📄 hdisksn.h
字号:
/////////////////////////////////////////////////////////////////////////////
// HDiskSN.h : Defines the function header for the DLL application.
// Made By ShanChengKun.PentiumWorkingRoom
// CopyRight(C) 1996-2008 . Email: Sck007@163.com . Made in 2004.05.27
/////////////////////////////////////////////////////////////////////////////
#ifndef HDISK_SN_H
#define HDISK_SN_H
#ifdef HDISKSN_EXPORTS
#define HDISKSN_API __declspec(dllexport)
#else
#define HDISKSN_API __declspec(dllimport)
#endif
/////////////////////////////////////////////////////////////////////////////
// 为支持BSTR和sprintf而作的预定义
#include <stdio.h>
typedef unsigned short *BSTR;
#define WINOLEAUTAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
WINOLEAUTAPI_(BSTR) SysAllocString(const BSTR);
#ifdef __cplusplus
extern "C" {
#endif
// 动态链接库WinIo.DLL的接口声明
typedef BOOL (_stdcall *PInitializeWinIo)();
typedef VOID (_stdcall *PShutdownWinIo)();
typedef BOOL (_stdcall *PGetPortVal)(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
typedef BOOL (_stdcall *PSetPortVal)(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
#ifdef __cplusplus
}
#endif
// 各种小工具函数定义及相关宏定义
void function_des(BYTE, const BYTE *, const BYTE *, BYTE *);
BOOL SckDesD88(BYTE style, const BYTE *src, const BYTE *key, BYTE *dec);
BOOL SckDesBin(BYTE bStyle, BYTE *byData, DWORD dwLength, const BYTE *byKeys);
BOOL ZnnDesBin(BYTE bStyle, BYTE *byData, DWORD dwLength, const BYTE *byKeys);
int lstrCpy(char *chDes, const char *chSrc, int nMax = 0);
BOOL IsWindowsNT(void); // 是否是NT系统
BOOL IsHaveDiskPrivilege(VOID); // 权限是否足够
void HandleSckPath(char *pStr, int nCut, int nLen = 0);
BOOL IsFileExist(const char chName[], DWORD *pLength = NULL);
BOOL MakeSurePath(const char chPath[]); // 确认路径存在
BOOL MakeFilePath(const char chFile[]); // 确认文件所在路径
BOOL SaveBinaryFile(const char *chFileName, const BYTE *pBuffData, DWORD dwBuffSize);
BOOL LoadBinaryFile(const char *chFileName, BYTE *&pBuffData, DWORD &dwBuffSize);
int MsgBox(HWND, UINT, const char *chfmt, ...); // 测试用信息对话框
DWORD GenerateCRC32(const BYTE *, long nLength); // 提取CRC32检验码
void CryptXOR(BYTE bySrc[], long nLen, BYTE byPatt = 0xA5);
void CryptXOR(BYTE byDes[], const BYTE bySrc[], LONG nLen, BYTE byPatt = 0xA5);
INT GetRecyclerDirectory(CHAR chPath[]); // 获取系统的回收站全路径
#define BCD2DEC(b) ((BYTE)((((b) & 0xF0) >> 4) * 10 + ((b) & 0x0F)))
static const BYTE DATA_KEYS[] = {0xF6, 0xC6, 0xCE, 0x95, 0x95, 0x92, 0x9F, 0x8C};
static const BYTE BETA_KEYS[] = {0xEC, 0xE9, 0xCA, 0xD3, 0xC0, 0xFC, 0xCA, 0xD0};
HDISKSN_API LONG DiskSectorIO(LONG bLogPhy, LONG nWhichDisk, DWORD dwStartSector,
DWORD dwSumSectors, LONG lpBuffer, LONG bOperation);
HDISKSN_API BOOL VerifySector(HMODULE hMoudle, LONG pdwVerify);
HDISKSN_API BSTR GetHDiskSN(void); // 获取硬盘序列号
BOOL GetCurrDate(BYTE *byDate); // 获取CMOS内年月日记录
LONG GetDiffDate(const BYTE *byNew, const BYTE *byOld);// 获取两个时间的天数差
BOOL IsDiffTime(const BYTE *byNew, const BYTE *byOld);// 判断两个时间是否相同
extern HMODULE g_hHDiskSnDLL; // HDiskSN动态库句柄
class CTcsyRegistList; // 链表注册类预定义
extern CTcsyRegistList TcsyList; // 扇区注册管理链表
extern DWORD SELF_CRC32; // HDiskSN.DLL自校验码
/////////////////////////////////////////////////////////////////////////////
// IOCTL控制码,#include <winioctl.h>
#define DFP_GET_VERSION 0x00074080
#define DFP_SEND_DRIVE_COMMAND 0x0007c084
#define DFP_RECEIVE_DRIVE_DATA 0x0007c088
#define DIOC_DISKIO_MINE_SCK 0x0022048f
//#define DFP_RECEIVE_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//#define DFP_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//#define DIOC_DISKIO_MINE_SCK CTL_CODE(FILE_DEVICE_UNKNOWN, 0x123, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IDENTIFY_BUFFER_SIZE 512 // Miscellaneous
#define DISK_SECTOR_SIZE 512 // Bytes Per Sector
#define SCK_SN_INFOR 1 // 正在读取硬盘序列号
#define SCK_RW_HDISK 2 // 正在读写硬盘物理扇
// bDriverError values,由IOCTL返回的错误信息
#define SMART_NO_ERROR 0 // No error
#define SMART_IDE_ERROR 1 // Error from IDE controller
#define SMART_INVALID_FLAG 2 // Invalid command flag
#define SMART_INVALID_COMMAND 3 // Invalid command byte
#define SMART_INVALID_BUFFER 4 // Bad buffer (null, invalid addr..)
#define SMART_INVALID_DRIVE 5 // Drive number not valid
#define SMART_INVALID_IOCTL 6 // Invalid IOCTL
#define SMART_ERROR_NO_MEM 7 // Could not lock user's buffer
#define SMART_INVALID_REGISTER 8 // Some IDE Register not valid
#define SMART_NOT_SUPPORTED 9 // Invalid cmd flag set
#define SMART_NO_IDE_DEVICE 10 // Cmd issued to device not present
// 11-255 reserved // although drive number is valid
// Bits returned in the fCapabilities member of GETVERSIONOUTPARAMS
#define CAP_IDE_ID_FUNCTION 1 // ATA ID command supported
#define CAP_IDE_ATAPI_ID 2 // ATAPI ID command supported
#define CAP_IDE_EXECUTE_SMART_FUNCTION 4 // SMART commannds supported
// Valid values for the bCommandReg member of IDEREGS.
#define IDE_ATAPI_ID 0xA1 // Returns ID sector for ATAPI.
#define IDE_ID_FUNCTION 0xEC // Returns ID sector for ATA.
#define IDE_EXECUTE_SMART_FUNCTION 0xB0 // Performs SMART cmd.
// Requires valid bFeaturesReg, // bCylLowReg, and bCylHighReg
// Vendor specific commands:
#define SMART_ENABLE_SMART_OPERATIONS 0xD8
#define SMART_DISABLE_SMART_OPERATIONS 0xD9
#define SMART_RETURN_SMART_STATUS 0xDA
// Cylinder register values required when issuing SMART command
#define SMART_CYL_LOW 0x4F
#define SMART_CYL_HI 0xC2
#define FILE_DEVICE_SCSI 0x0000001b
#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
#define IOCTL_SCSI_MINIPORT 0x0004D008 // see NTDDSCSI.H for definition
// 以下是DeviceIoControl可以进行的几种中断调用
#define VWIN32_DIOC_DOS_IOCTL 1 // MS-DOS Int21h 44xxh functions call
#define VWIN32_DIOC_DOS_INT25 2 // MS-DOS Int25h functions call
#define VWIN32_DIOC_DOS_INT26 3 // MS-DOS Int26h functions call
#define VWIN32_DIOC_DOS_INT13 4 // MS-DOS Int13h functions call
#define VWIN32_DIOC_DOS_DRIVEINFO 6 // MS-DOS Int21h 730xh functions call
//-------------------------------------------------------------------------//
// Required to ensure correct SMART IOCTL structure setup
#pragma pack(1) // 定义结构体对齐方式,以保证IDSECTOR结构正确:512字节
// 获取版本输出信息
typedef struct _GETVERSIONOUTPARAMS
{
BYTE bVersion; // Binary driver version.
BYTE bRevision; // Binary driver revision.
BYTE bReserved; // Not used.
BYTE bIDEDeviceMap; // Bit map of IDE devices.
DWORD fCapabilities; // Bit mask of driver capabilities.
DWORD dwReserved[4]; // For future use.
}
GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;
//-------------------------------------------------------------------------//
// IDE命令寄存器
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 cylinder value
BYTE bDriveHeadReg; // IDE drive/head register
BYTE bCommandReg; // Actual IDE command.
BYTE bReserved; // reserved for future use. Must be zero.
}
IDEREGS, *PIDEREGS, *LPIDEREGS;
// IDE设备IOCTL输入数据结构:in
typedef struct _SENDCMDINPARAMS
{
DWORD cBufferSize; // Buffer size in bytes
IDEREGS irDriveRegs; // Structure with drive register values.
BYTE bDriveNumber; // Physical drive number to send
// command to (0,1,2,3).
BYTE bReserved[3]; // Reserved for future expansion.
DWORD dwReserved[4]; // For future use.
// BYTE bBuffer[1]; // Input buffer.
}
SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
//-------------------------------------------------------------------------//
// 从驱动程序返回的状态:status
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;
// IDE设备IOCTL输出数据结构:out
typedef struct _SENDCMDOUTPARAMS
{
DWORD cBufferSize; // Size of bBuffer in bytes
DRIVERSTATUS DriverStatus; // Driver status structure.
BYTE bBuffer[512]; // Buffer of arbitrary length in which to store
//the data read from the drive.
}
SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
//-------------------------------------------------------------------------//
#define HD_SN_LEN 20 // 序列号数组大小
#define HD_FR_LEN 8 // 固件版本数组大小
#define HD_MN_LEN 40 // 内部型号数组大小
// IDE的ID命令返回的信息数据,共512字节
typedef struct _IDSECTOR
{
USHORT wGenConfig; // 01. 基本信息字
USHORT wNumCyls; // 02. 柱面数
USHORT wReserved; // 03. 保留
USHORT wNumHeads; // 04. 磁头数
USHORT wBytesPerTrack; // 05. 字节数/每磁道
USHORT wBytesPerSector; // 06. 字节数/每扇区
USHORT wSectorsPerTrack; // 07. 每磁道扇区数
USHORT wVendorUnique[3]; // 08. 厂家设定值
CHAR sSerialNumber[HD_SN_LEN]; // 09. 序列号
USHORT wBufferType; // 10. 缓冲类型
USHORT wBufferSize; // 11. 缓冲大小
USHORT wECCSize; // 12. ECC校验大小
CHAR sFirmwareRev[HD_FR_LEN]; // 13. 固件版本
CHAR sModelNumber[HD_MN_LEN]; // 14. 内部型号
USHORT wMoreVendorUnique; // 15. 厂家设定值
USHORT wDoubleWordIO; // 16. 保留
struct
{
USHORT reserved1:8; // 保留
USHORT DMA:1; // 1=支持DMA
USHORT LBA:1; // 1=支持LBA
USHORT DisIORDY:1; // 1=可不使用IORDY
USHORT IORDY:1; // 1=支持IORDY
USHORT SoftReset:1; // 1=需要ATA软启动
USHORT Overlap:1; // 1=支持重叠操作
USHORT Queue:1; // 1=支持命令队列
USHORT InlDMA:1; // 1=支持交叉存取DMA
}
wCapabilities; // 17. 一般能力
USHORT wReserved1; // 18. 保留
USHORT wPIOTiming; // 19. PIO时序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -