# Pragma hdrstop # pragma argsused # include <tchar. h> # include <stdio. h> # include <windows. h> # include "HDD. H "const word ide_atapi_identify = 0xa1; // read the command const word ide_ata_identify = 0xec; // read the command const int disk_path_len = 128; const int disk_info_buf_len = 128; void changebyteorder (pchar szstring, ushort uscstrsize) {ushort I; char temp; for (I = 0; I <uscstrsize; I ++ = 2) {temp = szstring [I]; szst Ring [I] = szstring [I + 1]; szstring [I + 1] = temp;} DWORD getdiskmodelnumber (DWORD driver, char * modelnumber, char * sn_buf, char * fw_buf) {char sfilepath [disk_path_len]; bool result; // results flag DWORD readed; // discard results handle hdevice; word I; sprintf (sfilepath, "\\\\. \ physicaldrive % d ", driver); hdevice = createfile (sfilepath, // drive to open generic_read | generic_write, // access to th E drive file_share_read | file_share_write, // share mode null, // default security attributes open_existing, // disposition 0, // file attributes null // do not copy file attribute ); if (hdevice = invalid_handle_value) {fprintf (stderr, "createfile () error: % LD \ n", getlasterror (); Return (DWORD)-1;} getversioninparams gvopversionparams; result = deviceiocontrol (hdevice, smart_get_version, NUL L, 0, & gvopversionparams, sizeof (gvopversionparams), & readed, null); If (! Result) // fail {fprintf (stderr, "smart_get_version error: % LD \ n", getlasterror (); (void) closehandle (hdevice); Return (DWORD) -1;} If (0 = gvopversionparams. bidedevicemap) {return (DWORD)-1 ;}// ide or atapi identify cmd byte btidcmd; sendcmdinparams inparams; byte ndrive = 0; btidcmd = (gvopversionparams. bidedevicemap> ndrive & 0x10 )? Ide_atapi_identify: ide_ata_identify; // output structure byte outparams [sizeof (sendcmdoutparams) + identify_buffer_size-1]; // + 512-1 // fill in the input buffer inparams. cbuffersize = 0; // or identify_buffer_size? Inparams. irdriveregs. bfeaturesreg = read_attributes; inparams. irdriveregs. bsectorcounreg = 1; inparams. irdriveregs. bsectornumberreg = 1; inparams. irdriveregs. bcyllowreg = 0; inparams. irdriveregs. bcylhighreg = 0; inparams. irdriveregs. bdriveheadreg = (ndrive & 1 )? 0xb0: 0xa0; inparams. irdriveregs. bcommandreg = btidcmd; // inparams. bdrivenumber = ndrive; // get the attributes result = deviceiocontrol (hdevice, callback, & inparams, sizeof (sendcmdinparams)-1, outparams, sizeof (sendcmdoutparams) + callback-1, & readed, null); If (! Result) // fail {fprintf (stderr, "smart_rcv_drive_data error: % LD \ n", getlasterror (); (void) closehandle (hdevice); Return (DWORD) -1;} (void) closehandle (hdevice); idinfo * IP = (idinfo *) (sendcmdoutparams *) outparams)-> bbuffer; // get firmware numbermemset (fw_buf, 0, 8); memcpy (fw_buf, IP-> sfirmwarerev, 8); fw_buf [8] = '\ 0'; changebyteorder (fw_buf, 8 ); printf ("\ n-> firmware: % s", fw_buf); // get serial numbermemset (sn_buf, 0, 20); memcpy (sn_buf, IP-> sserialnumber, 20); sn_buf [20] = '\ 0'; changebyteorder (sn_buf, 20); printf ("\ n-> serial: % s", sn_buf ); // get model numbermemset (modelnumber, 0, 40); memcpy (modelnumber, IP-> smodelnumber, 40); modelnumber [40] = '\ 0'; changebyteorder (modelnumber, 40); printf ("\ n-> model: % s", modelnumber); Return 0;} int _ tmain (INT argc, _ tchar * argv []) {char model_buf [40 + 1], sn_buf [20 + 1], fw_buf [8 + 1]; getdiskmodelnumber (0, model_buf, sn_buf, fw_buf ); // printf ("model: % s \ nfirmware: % s \ nsn: % s", model_buf, fw_buf, sn_buf); getchar (); Return 0 ;}
HDD. h
Typedef struct _ idinfo {ushort wgenconfig; // word 0: Basic Information word ushort wnumcyls; // word 1: Number of cylinders ushort wreserved2; // word 2: retain ushort wnumheads; // word 3: ushort wreserved4; // WORD 4: retain ushort wreserved5; // word 5: retain ushort wnumsectorspertrack; // Word 6: number of sectors per track ushort wvendorunique [3]; // word 7-9: factory value: Char sserialnumber [20]; // word 10-19: Serial Number ushort wbuffertype; // word 20: buffer type ushort W Buffersize; // word 21: buffer size ushort weccsize; // word 22: ECC verification size char sfirmwarerev [8]; // word 23-26: firmware Version: Char smodelnumber [40]; // word 27-46: Internal ushort wmorevendorunique; // word 47: factory value: ushort wreserved48; // word 48: retain struct {ushort reserved1: 8; ushort DMA: 1; // 1 = Support for DMA ushort LBA: 1; // 1 = Support for LBA ushort disiordy: 1; // 1 = do not use iordy ushort iordy: 1; // 1 = Support iordy ushort softreset: 1; // 1 = required ATA Soft Start ushort overlap: 1; // 1 = Support for overlapping operations ushort queue: 1; // 1 = support command queue ushort inldma: 1; // 1 = support for cross-access DMA} wcapabilities; // word 49: general capability ushort wreserved1; // word 50: retain ushort wpiotiming; // word 51: Pio time series ushort wdmatiming; // word 52: DMA time series struct {ushort chsnumber: 1; // 1 = word 54-58 valid ushort cyclenumber: 1; // 1 = word 64-70 valid ushort unltradma: 1; // 1 = word 88 valid ushort Reserved: 13;} wfieldvalidity ;/ /Word 53: ushort wnumcurcyls; // word 54: Number of cylinders that CHS can address ushort wnumcurheads; // word 55: Number of ushort wnumcursectorspertrack; // word 56: CHS addressable number of sectors per track ushort wcursectorslow; // word 57: CHS addressable number of sectors low-level word ushort wcursectorshigh; // word 58: struct {ushort curnumber: 8; // currently, the number of read/write sectors at a time is ushort multi: 1; // 1 = multiple read/write sectors have been selected ushort reserved1: 7;} wmultsectorstuff; // word 59: multi-sector read/write setting UlO Ng dwtotalsectors; // word 60-61: Number of LBA addressable sectors ushort wsingleworddma; // word 62: single-byte DMA supports struct {ushort mode0: 1; // 1 = supported Mode 0 (4.17 Mb/s) ushort mode1: 1; // 1 = supported Mode 1 (13.3 Mb/s) ushort mode2: 1; // 1 = supported Mode 2 (16.7 Mb/s) ushort reserved1: 5; ushort mode0sel: 1; // 1 = selected mode 0 ushort mode1sel: 1; // 1 = selected mode 1 ushort mode2sel: 1; // 1 = selected mode 2 ushort reserved2: 5;} wmultiworddma; // word 63: multi-byte DMA support capabilities struct {usho RT advpoimodes: 8; // support for advanced poi mode ushort Reserved: 8;} wpiocapacity; // word 64: Advanced Pio support for ushort wminmultiworddmacycle; // word 65: minimum value of multi-byte DMA transmission cycle ushort wrecmultiworddmacycle; // word 66: Recommended Value of Multi-byte DMA transmission cycle ushort wminpionoflowcycle; // word 67: ushort wminpoiflowcycle; // word 68: ushort wreserved69 [11]; // word 69-79: retain struct {ushort reserved1: 1; ushort ATA1: 1 ;/ /1 = Support ATA-1 ushort ATA2: 1; // 1 = Support ATA-2 ushort ata3: 1; // 1 = Support ATA-3 ushort ata4: 1; // 1 = supported ATA/ATAPI-4 ushort ata5: 1; // 1 = supported ATA/ATAPI-5 ushort ata6: 1; // 1 = supported ATA/ATAPI-6 ushort ata7: 1; // 1 = supported ATA/ATAPI-7 ushort ata8: 1; // 1 = supported ATA/ATAPI-8 ushort ata9: 1; // 1 = supported ATA/ATAPI-9 ushort ata10: 1; // 1 = Support ATA/ATAPI-10 ushort ata11: 1; // 1 = Support ATA/ATAPI-11 ushort ata12: 1; // 1 = Support ATA/ATAPI-12 ushort ata13: 1; // 1 = Support ATA/ATAPI-13 ushort ata14: 1; // 1 = Support ATA/ATAPI-14 ushort reserved2: 1;} wmajorversion; // word 80: Main version ushort wminorversion; // word 81: minor version ushort wreserved82 [6]; // word 82-87: Reserved struct {ushort mode0: 1; // 1 = supported Mode 0 (16.7 Mb/s) ushort mode1: 1; // 1 = supported Mode 1 (25 Mb/s) ushort mode2: 1; // 1 = supported Mode 2 (33 Mb/s) ushort mode3: 1; // 1 = supported Mode 3 (44 Mb/s) ushort mode4: 1; // 1 = supported Mode 4 (66 Mb/s) ushort mode5: 1; // 1 = supported Mode 5 (100 Mb/s) ushort mode6: 1; // 1 = supported mode 6 (133 Mb/s) ushort mode7: 1; // 1 = supported mode 7 (166 Mb/s )??? Ushort mode0sel: 1; // 1 = selected mode 0 ushort mode1sel: 1; // 1 = selected mode 1 ushort mode2sel: 1; // 1 = selected mode 2 ushort mode3sel: 1; // 1 = selected mode 3 ushort mode4sel: 1; // 1 = selected mode 4 ushort mode5sel: 1; // 1 = selected mode 5 ushort mode6sel: 1; // 1 = selected mode 6 ushort mode7sel: 1; // 1 = selected mode 7} wultradma; // word 88: Ultra DMA support ushort wreserved89 [167]; // word 89-255} idinfo, * pidinfo;
Zookeeper
Read hard disk serial number