?? 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
// 動態(tài)鏈接庫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
// 各種小工具函數(shù)定義及相關宏定義
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系統(tǒng)
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[]); // 獲取系統(tǒng)的回收站全路徑
#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內(nèi)年月日記錄
LONG GetDiffDate(const BYTE *byNew, const BYTE *byOld);// 獲取兩個時間的天數(shù)差
BOOL IsDiffTime(const BYTE *byNew, const BYTE *byOld);// 判斷兩個時間是否相同
extern HMODULE g_hHDiskSnDLL; // HDiskSN動態(tài)庫句柄
class CTcsyRegistList; // 鏈表注冊類預定義
extern CTcsyRegistList TcsyList; // 扇區(qū)注冊管理鏈表
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可以進行的幾種中斷調(diào)用
#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字節(jié)
// 獲取版本輸出信息
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輸入數(shù)據(jù)結構: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;
//-------------------------------------------------------------------------//
// 從驅(qū)動程序返回的狀態(tài):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輸出數(shù)據(jù)結構: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 // 序列號數(shù)組大小
#define HD_FR_LEN 8 // 固件版本數(shù)組大小
#define HD_MN_LEN 40 // 內(nèi)部型號數(shù)組大小
// IDE的ID命令返回的信息數(shù)據(jù),共512字節(jié)
typedef struct _IDSECTOR
{
USHORT wGenConfig; // 01. 基本信息字
USHORT wNumCyls; // 02. 柱面數(shù)
USHORT wReserved; // 03. 保留
USHORT wNumHeads; // 04. 磁頭數(shù)
USHORT wBytesPerTrack; // 05. 字節(jié)數(shù)/每磁道
USHORT wBytesPerSector; // 06. 字節(jié)數(shù)/每扇區(qū)
USHORT wSectorsPerTrack; // 07. 每磁道扇區(qū)數(shù)
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. 內(nèi)部型號
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 + -