| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 | #ifndef _HDD_SERIAL_INFO_H_#define _HDD_SERIAL_INFO_H_#include <tchar.h>#include <string.h>#include <windows.h>#include <winioctl.h>#include <stdio.h>#include <vector>#pragma pack(1)const CString DEFAULT_COMPUTER_ID = _T("OPTO-NOTS-INCA-WWWW");#define  IDENTIFY_BUFFER_SIZE  512//  IOCTL commands#define  DFP_GET_VERSION          0x00074080#define  DFP_SEND_DRIVE_COMMAND   0x0007c084#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#define SMART_GET_VERSION               CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)#define SMART_SEND_DRIVE_COMMAND        CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define SMART_RCV_DRIVE_DATA            CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)//  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;//  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_IDENTIFY  0xA1  //  Returns ID sector for ATAPI.#define  IDE_ATA_IDENTIFY    0xEC  //  Returns ID sector for ATA.// 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;//  Max number of drives assuming primary/secondary, master/slave topology//	Modified to read only the master serial#define  MAX_IDE_DRIVES  1//// IDENTIFY data (from ATAPI driver source)//#pragma pack(1)typedef struct _IDENTIFY_DATA {    USHORT GeneralConfiguration;            // 00 00    USHORT NumberOfCylinders;               // 02  1    USHORT Reserved1;                       // 04  2    USHORT NumberOfHeads;                   // 06  3    USHORT UnformattedBytesPerTrack;        // 08  4    USHORT UnformattedBytesPerSector;       // 0A  5    USHORT SectorsPerTrack;                 // 0C  6    USHORT VendorUnique1[3];                // 0E  7-9    USHORT SerialNumber[10];                // 14  10-19    USHORT BufferType;                      // 28  20    USHORT BufferSectorSize;                // 2A  21    USHORT NumberOfEccBytes;                // 2C  22    USHORT FirmwareRevision[4];             // 2E  23-26    USHORT ModelNumber[20];                 // 36  27-46    UCHAR  MaximumBlockTransfer;            // 5E  47    UCHAR  VendorUnique2;                   // 5F    USHORT DoubleWordIo;                    // 60  48    USHORT Capabilities;                    // 62  49    USHORT Reserved2;                       // 64  50    UCHAR  VendorUnique3;                   // 66  51    UCHAR  PioCycleTimingMode;              // 67    UCHAR  VendorUnique4;                   // 68  52    UCHAR  DmaCycleTimingMode;              // 69    USHORT TranslationFieldsValid:1;        // 6A  53    USHORT Reserved3:15;    USHORT NumberOfCurrentCylinders;        // 6C  54    USHORT NumberOfCurrentHeads;            // 6E  55    USHORT CurrentSectorsPerTrack;          // 70  56    ULONG  CurrentSectorCapacity;           // 72  57-58    USHORT CurrentMultiSectorSetting;       //     59    ULONG  UserAddressableSectors;          //     60-61    USHORT SingleWordDMASupport : 8;        //     62    USHORT SingleWordDMAActive : 8;    USHORT MultiWordDMASupport : 8;         //     63    USHORT MultiWordDMAActive : 8;    USHORT AdvancedPIOModes : 8;            //     64    USHORT Reserved4 : 8;    USHORT MinimumMWXferCycleTime;          //     65    USHORT RecommendedMWXferCycleTime;      //     66    USHORT MinimumPIOCycleTime;             //     67    USHORT MinimumPIOCycleTimeIORDY;        //     68    USHORT Reserved5[2];                    //     69-70    USHORT ReleaseTimeOverlapped;           //     71    USHORT ReleaseTimeServiceCommand;       //     72    USHORT MajorRevision;                   //     73    USHORT MinorRevision;                   //     74    USHORT Reserved6[50];                   //     75-126    USHORT SpecialFunctionsEnabled;         //     127    USHORT Reserved7[128];                  //     128-255} IDENTIFY_DATA, *PIDENTIFY_DATA;#pragma pack()//  Required to ensure correct PhysicalDrive IOCTL structure setup#pragma pack(4)//// IOCTL_STORAGE_QUERY_PROPERTY//// Input Buffer://      a STORAGE_PROPERTY_QUERY structure which describes what type of query//      is being done, what property is being queried for, and any additional//      parameters which a particular property query requires.////  Output Buffer://      Contains a buffer to place the results of the query into.  Since all//      property descriptors can be cast into a STORAGE_DESCRIPTOR_HEADER,//      the IOCTL can be called once with a small buffer then again using//      a buffer as large as the header reports is necessary.////// Types of queries////// define some initial property id's////// Query structure - additional parameters for specific queries can follow// the header//#define IOCTL_STORAGE_QUERY_PROPERTY   CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)//// Device property descriptor - this is really just a rehash of the inquiry// data retrieved from a scsi device//// This may only be retrieved from a target device.  Sending this to the bus// will result in an error//#pragma pack(4)// (* Output Bbuffer for the VxD (rt_IdeDinfo record) *)typedef struct _rt_IdeDInfo_{    BYTE IDEExists[4];    BYTE DiskExists[8];    WORD DisksRawInfo[8*256];} rt_IdeDInfo, *pt_IdeDInfo;// (* IdeDinfo "data fields" *)typedef struct _rt_DiskInfo_{    BOOL DiskExists;    BOOL ATAdevice;    BOOL RemovableDevice;    WORD TotLogCyl;    WORD TotLogHeads;    WORD TotLogSPT;    char SerialNumber[20];    char FirmwareRevision[8];    char ModelNumber[40];    WORD CurLogCyl;    WORD CurLogHeads;    WORD CurLogSPT;} rt_DiskInfo;#define  SENDIDLENGTH  sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)class MasterHardDiskSerial{public:    MasterHardDiskSerial();    ~MasterHardDiskSerial();    int GetSerialNo(std::vector<char> &serialNumber);    int GetErrorMessage(TCHAR* _ptszErrorMessage= NULL);    __int64 getHardDriveComputerID();    ///Get the id of this computer as a string.	CString GetHardDriveComputerIdAsString(void);    CString GetDefaultComputerIdString(void) { return DEFAULT_COMPUTER_ID; } private:    char* ConvertToString ( DWORD dwDiskdata [256], int iFirstIndex, int iLastIndex, char* pcBuf = NULL );    BOOL DoIDENTIFY (HANDLE, PSENDCMDINPARAMS, PSENDCMDOUTPARAMS, BYTE, BYTE, PDWORD);    int ReadPhysicalDriveInNTWithAdminRights (void);    int	ReadPhysicalDriveInNTUsingSmart (void);    int	ReadPhysicalDriveInNTWithZeroRights (void);    int	ReadIdeDriveAsScsiDriveInNT (void);    char* flipAndCodeBytes ( int iPos, int iFlip,const char * pcStr = NULL, char * pcBuf= NULL);    void PrintIdeInfo (int iDrive, DWORD dwDiskdata [256]);private:    char m_cszHardDriveSerialNumber [1024];    char m_cszHardDriveModelNumber [1024];    char m_cszErrorMessage[256];    BYTE byIdOutCmd [sizeof (SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];	__int64 m_nComputerId;};#endif // _HDD_SERIAL_INFO_H_
 |