⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdisksn.h

📁 这个是集合几种关于硬盘的序列号的获取方式的DLL
💻 H
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////
// 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 + -