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

📄 diskserialnumber.h

📁 本程序是VC为平台开发的股票资讯系统
💻 H
字号:
#if !defined(AFX_DISKSERIALNUMBER_H__481A8D6A_FB42_11D4_B45A_00104B1269BD__INCLUDED_)
#define AFX_DISKSERIALNUMBER_H__481A8D6A_FB42_11D4_B45A_00104B1269BD__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// DiskSerialNumber.h : header file
//

// Required to ensure correct PhysicalDrive IOCTL structure setup
#pragma pack(1)

#define IDENTIFY_BUFFER_SIZE	512

// IOCTL commands
#define DFP_GET_VERSION			0x00074080
#define DFP_RECEIVE_DRIVE_DATA	0x0007c088

#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

// Valid values for the bCommandReg member of IDEREGS.
#define IDE_ATAPI_IDENTIFY	0xA1	// Returns ID sector for ATAPI.
#define IDE_ATA_IDENTIFY	0xEC	// Returns ID sector for ATA.

#define SENDIDLENGTH sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE

/////////////////////////////////////////////////////////////////////////////
// CDiskSerialNumber window

// GETVERSIONOUTPARAMS contains the data returned from the Get Driver Version function.
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 registers
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;

// SENDCMDINPARAMS contains the input parameters for the Send Command to Drive function.
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 returned from driver
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;

// Structure returned by PhysicalDrive IOCTL for several commands
typedef struct _SENDCMDOUTPARAMS
{
	DWORD         cBufferSize;	// Size of bBuffer in bytes
	DRIVERSTATUS  DriverStatus;	// Driver status structure.
	BYTE          bBuffer[1];	// Buffer of arbitrary length in which to store the data read from the                                                       // drive.
}SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;

// The following struct defines the interesting part of the IDENTIFY buffer:
typedef struct _IDSECTOR
{
	USHORT wGenConfig;
	USHORT wNumCyls;
	USHORT wReserved;
	USHORT wNumHeads;
	USHORT wBytesPerTrack;
	USHORT wBytesPerSector;
	USHORT wSectorsPerTrack;
	USHORT wVendorUnique[3];
	CHAR   sSerialNumber[20];
	USHORT wBufferType;
	USHORT wBufferSize;
	USHORT wECCSize;
	CHAR   sFirmwareRev[8];
	CHAR   sModelNumber[40];
	USHORT wMoreVendorUnique;
	USHORT wDoubleWordIO;
	USHORT wCapabilities;
	USHORT wReserved1;
	USHORT wPIOTiming;
	USHORT wDMATiming;
	USHORT wBS;
	USHORT wNumCurrentCyls;
	USHORT wNumCurrentHeads;
	USHORT wNumCurrentSectorsPerTrack;
	ULONG  ulCurrentSectorCapacity;
	USHORT wMultSectorStuff;
	ULONG  ulTotalAddressableSectors;
	USHORT wSingleWordDMA;
	USHORT wMultiWordDMA;
	BYTE   bReserved[128];
}IDSECTOR, *PIDSECTOR;


typedef struct _SRB_IO_CONTROL
{
	ULONG HeaderLength;
	UCHAR Signature[8];
	ULONG Timeout;
	ULONG ControlCode;
	ULONG ReturnCode;
	ULONG Length;
}SRB_IO_CONTROL, *PSRB_IO_CONTROL;

class CDiskSerialNumber
{
// Construction
public:
	CDiskSerialNumber();

// Attributes
protected:
	HANDLE hDriver;
	BOOL IsNT;
	BOOL IsWinIoInitialized;

	// Define global buffers.
	BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
	char HardDriveSerialNumber[1024];

// Operations
protected:
	BOOL DoIDENTIFY(HANDLE hPhysicalDriveIOCTL, 
		PSENDCMDINPARAMS pSCIP, PSENDCMDOUTPARAMS pSCOP, 
		BYTE bIDCmd, BYTE bDriveNum, PDWORD lpcbBytesReturned);
	char *ConvertToString(DWORD diskdata[256], 
		int firstIndex, int lastIndex);
	BOOL ReadPhysicalDriveInNT();
	BOOL ReadIdeDriveAsScsiDriveInNT();
	BOOL ReadDrivePortsInWin9X();
	BOOL InitializeWinIo();
	BOOL GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
	BOOL SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
	void ShutdownWinIo();
	BOOL IsWinNT();
	BOOL CallRing0(PVOID pvRing0FuncAddr, WORD wPortAddr, 
		PDWORD pdwPortVal, BYTE bSize);
	__int64 GetHardDriveSerialNumber();
	long GetSoftDriveSerialNumber();

public:
	long GetDiskSerialNo();

// Implementation
public:
	virtual ~CDiskSerialNumber();
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DISKSERIALNUMBER_H__481A8D6A_FB42_11D4_B45A_00104B1269BD__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -