获取硬盘的详细信息.docx
《获取硬盘的详细信息.docx》由会员分享,可在线阅读,更多相关《获取硬盘的详细信息.docx(13页珍藏版)》请在冰豆网上搜索。
![获取硬盘的详细信息.docx](https://file1.bdocx.com/fileroot1/2023-1/29/f0aff964-0293-431f-ac25-4e98256a7553/f0aff964-0293-431f-ac25-4e98256a75531.gif)
获取硬盘的详细信息
»ñÈ¡Ó²Å̵ÄÏêϸÐÅÏ¢
QÓÃIOCTL_DISK_GET_DRIVE_GEOMETRY»òIOCTL_STORAGE_GET_MEDIA_TYPES_EXÖ»Äܵõ½ºÜÉٵĴÅÅ̲ÎÊý£¬ÎÒÏë»ñµÃ°üÀ¨Ó²ÅÌÐòÁкÅÔÚÄڵĸü¼ÓÏêϸµÄÐÅÏ¢£¬ÓÐʲô°ì·¨Ñ½£¿
Aȷʵ£¬ÓÃÄãËù˵µÄI/O¿ØÖÆÂ룬ֻÄܵõ½×î»ù±¾µÄ´ÅÅ̲ÎÊý¡£»ñÈ¡´ÅÅ̳ö³§ÐÅÏ¢µÄI/O¿ØÖÆÂ룬΢ÈíÔÚVC/MFC»·¾³ÖÐûÓпª·Å£¬ÔÚDDKÖпÉÒÔ·¢ÏÖһЩÏßË÷¡£ÔçÏÈ£¬LynnMcGuireдÁËÒ»¸öºÜ³öÃûµÄ»ñÈ¡IDEÓ²ÅÌÏêϸÐÅÏ¢µÄ³ÌÐòDiskID32£¬ÏÂÃæµÄÀý×ÓÊÇÔÚÆä»ù´¡ÉϾ¹ýÔöɾºÍ¸Ä½ø¶ø³ÉµÄ¡£
±¾ÀýÖУ¬ÎÒÃÇÒªÓõ½ATA/APAPIµÄIDENTIFYDEVICEÖ¸Áî¡£ATA/APAPIÊǹú¼Ê×éÖ¯T13Æð²ÝºÍ·¢²¼µÄIDE/EIDE/UDMAÓ²Å̼°ÆäËü¿ÉÒƶ¯´æ´¢É豸ÓëÖ÷»ú½Ó¿ÚµÄ±ê×¼£¬ÖÁ½ñÒѾµ½ÁËATA/APAPI-7°æ±¾¡£¸Ã½Ó¿Ú±ê×¼¹æ¶¨ÁËATA/ATAPIÉ豸µÄÊäÈëÊä³ö¼Ä´æÆ÷ºÍÖ¸Á¡£ÓûÁ˽â¸üÏêϸµÄATA/ATAPI¼¼Êõ×ÊÁÏ£¬¿É·ÃÎÊT13µÄÕ¾µã¡£
Óõ½µÄ³£Á¿¼°Êý¾Ý½á¹¹ÓÐÒÔÏÂһЩ£º
//IOCTL¿ØÖÆÂë
//#defineDFP_SEND_DRIVE_COMMAND0x0007c084
#defineDFP_SEND_DRIVE_COMMANDCTL_CODE(IOCTL_DISK_BASE,0x0021,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
//#defineDFP_RECEIVE_DRIVE_DATA0x0007c088
#defineDFP_RECEIVE_DRIVE_DATACTL_CODE(IOCTL_DISK_BASE,0x0022,METHOD_BUFFERED,FILE_READ_ACCESS|FILE_WRITE_ACCESS)
#defineFILE_DEVICE_SCSI0x0000001b
#defineIOCTL_SCSI_MINIPORT_IDENTIFY((FILE_DEVICE_SCSI<<16)+0x0501)
#defineIOCTL_SCSI_MINIPORT0x0004D008//seeNTDDSCSI.Hfordefinition
//ATA/ATAPIÖ¸Áî
#defineIDE_ATA_IDENTIFY0xEC//ATAµÄIDÖ¸Áî(IDENTIFYDEVICE)
//IDEÃüÁî¼Ä´æÆ÷
typedefstruct_IDEREGS
{
BYTEbFeaturesReg;//ÌØÕ÷¼Ä´æÆ÷(ÓÃÓÚSMARTÃüÁî)
BYTEbSectorCountReg;//ÉÈÇøÊýÄ¿¼Ä´æÆ÷
BYTEbSectorNumberReg;//¿ªÊ¼ÉÈÇø¼Ä´æÆ÷
BYTEbCylLowReg;//¿ªÊ¼ÖùÃæµÍ×ֽڼĴæÆ÷
BYTEbCylHighReg;//¿ªÊ¼ÖùÃæ¸ß×ֽڼĴæÆ÷
BYTEbDriveHeadReg;//Çý¶¯Æ÷/´ÅÍ·¼Ä´æÆ÷
BYTEbCommandReg;//Ö¸Áî¼Ä´æÆ÷
BYTEbReserved;//±£Áô
}IDEREGS,*PIDEREGS,*LPIDEREGS;
//´ÓÇý¶¯³ÌÐò·µ»ØµÄ״̬
typedefstruct_DRIVERSTATUS
{
BYTEbDriverError;//´íÎóÂë
BYTEbIDEStatus;//IDE״̬¼Ä´æÆ÷
BYTEbReserved[2];//±£Áô
DWORDdwReserved[2];//±£Áô
}DRIVERSTATUS,*PDRIVERSTATUS,*LPDRIVERSTATUS;
//IDEÉ豸IOCTLÊäÈëÊý¾Ý½á¹¹
typedefstruct_SENDCMDINPARAMS
{
DWORDcBufferSize;//»º³åÇø×Ö½ÚÊý
IDEREGSirDriveRegs;//IDE¼Ä´æÆ÷×é
BYTEbDriveNumber;//Çý¶¯Æ÷ºÅ
BYTEbReserved[3];//±£Áô
DWORDdwReserved[4];//±£Áô
BYTEbBuffer[1];//ÊäÈ뻺³åÇø(´Ë´¦ÏóÕ÷ÐԵذüº¬1×Ö½Ú)
}SENDCMDINPARAMS,*PSENDCMDINPARAMS,*LPSENDCMDINPARAMS;
//IDEÉ豸IOCTLÊä³öÊý¾Ý½á¹¹
typedefstruct_SENDCMDOUTPARAMS
{
DWORDcBufferSize;//»º³åÇø×Ö½ÚÊý
DRIVERSTATUSDriverStatus;//Çý¶¯³ÌÐò·µ»Ø״̬
BYTEbBuffer[1];//ÊäÈ뻺³åÇø(´Ë´¦ÏóÕ÷ÐԵذüº¬1×Ö½Ú)
}SENDCMDOUTPARAMS,*PSENDCMDOUTPARAMS,*LPSENDCMDOUTPARAMS;
//IDEµÄIDÃüÁî·µ»ØµÄÊý¾Ý
//¹²512×Ö½Ú(256¸öWORD)£¬ÕâÀï½ö¶¨ÒåÁËһЩ¸ÐÐËȤµÄÏî(»ù±¾ÉÏÒÀ¾ÝATA/ATAPI-4)
typedefstruct_IDINFO
{
USHORTwGenConfig;//WORD0:
»ù±¾ÐÅÏ¢×Ö
USHORTwNumCyls;//WORD1:
ÖùÃæÊý
USHORTwReserved2;//WORD2:
±£Áô
USHORTwNumHeads;//WORD3:
´ÅÍ·Êý
USHORTwReserved4;//WORD4:
±£Áô
USHORTwReserved5;//WORD5:
±£Áô
USHORTwNumSectorsPerTrack;//WORD6:
ÿ´ÅµÀÉÈÇøÊý
USHORTwVendorUnique[3];//WORD7-9:
³§¼ÒÉ趨ֵ
CHARsSerialNumber[20];//WORD10-19:
ÐòÁкÅ
USHORTwBufferType;//WORD20:
»º³åÀàÐÍ
USHORTwBufferSize;//WORD21:
»º³å´óС
USHORTwECCSize;//WORD22:
ECCУÑé´óС
CHARsFirmwareRev[8];//WORD23-26:
¹Ì¼þ°æ±¾
CHARsModelNumber[40];//WORD27-46:
ÄÚ²¿ÐͺÅ
USHORTwMoreVendorUnique;//WORD47:
³§¼ÒÉ趨ֵ
USHORTwReserved48;//WORD48:
±£Áô
struct{
USHORTreserved1:
8;
USHORTDMA:
1;//1=Ö§³ÖDMA
USHORTLBA:
1;//1=Ö§³ÖLBA
USHORTDisIORDY:
1;//1=¿É²»Ê¹ÓÃIORDY
USHORTIORDY:
1;//1=Ö§³ÖIORDY
USHORTSoftReset:
1;//1=ÐèÒªATAÈíÆô¶¯
USHORTOverlap:
1;//1=Ö§³ÖÖصþ²Ù×÷
USHORTQueue:
1;//1=Ö§³ÖÃüÁî¶ÓÁÐ
USHORTInlDMA:
1;//1=Ö§³Ö½»²æ´æÈ¡DMA
}wCapabilities;//WORD49:
Ò»°ãÄÜÁ¦
USHORTwReserved1;//WORD50:
±£Áô
USHORTwPIOTiming;//WORD51:
PIOʱÐò
USHORTwDMATiming;//WORD52:
DMAʱÐò
struct{
USHORTCHSNumber:
1;//1=WORD54-58ÓÐЧ
USHORTCycleNumber:
1;//1=WORD64-70ÓÐЧ
USHORTUnltraDMA:
1;//1=WORD88ÓÐЧ
USHORTreserved:
13;
}wFieldValidity;//WORD53:
ºóÐø×Ö¶ÎÓÐЧÐÔ±êÖ¾
USHORTwNumCurCyls;//WORD54:
CHS¿ÉÑ°Ö·µÄÖùÃæÊý
USHORTwNumCurHeads;//WORD55:
CHS¿ÉÑ°Ö·µÄ´ÅÍ·Êý
USHORTwNumCurSectorsPerTrack;//WORD56:
CHS¿ÉѰַÿ´ÅµÀÉÈÇøÊý
USHORTwCurSectorsLow;//WORD57:
CHS¿ÉÑ°Ö·µÄÉÈÇøÊýµÍλ×Ö
USHORTwCurSectorsHigh;//WORD58:
CHS¿ÉÑ°Ö·µÄÉÈÇøÊý¸ßλ×Ö
struct{
USHORTCurNumber:
8;//µ±Ç°Ò»´ÎÐԿɶÁдÉÈÇøÊý
USHORTMulti:
1;//1=ÒÑÑ¡Ôñ¶àÉÈÇø¶Áд
USHORTreserved1:
7;
}wMultSectorStuff;//WORD59:
¶àÉÈÇø¶ÁдÉ趨
ULONGdwTotalSectors;//WORD60-61:
LBA¿ÉÑ°Ö·µÄÉÈÇøÊý
USHORTwSingleWordDMA;//WORD62:
µ¥×Ö½ÚDMAÖ§³ÖÄÜÁ¦
struct{
USHORTMode0:
1;//1=Ö§³Öģʽ0(4.17Mb/s)
USHORTMode1:
1;//1=Ö§³Öģʽ1(13.3Mb/s)
USHORTMode2:
1;//1=Ö§³Öģʽ2(16.7Mb/s)
USHORTReserved1:
5;
USHORTMode0Sel:
1;//1=ÒÑÑ¡Ôñģʽ0
USHORTMode1Sel:
1;//1=ÒÑÑ¡Ôñģʽ1
USHORTMode2Sel:
1;//1=ÒÑÑ¡Ôñģʽ2
USHORTReserved2:
5;
}wMultiWordDMA;//WORD63:
¶à×Ö½ÚDMAÖ§³ÖÄÜÁ¦
struct{
USHORTAdvPOIModes:
8;//Ö§³Ö¸ß¼¶POIģʽÊý
USHORTreserved:
8;
}wPIOCapacity;//WORD64:
¸ß¼¶PIOÖ§³ÖÄÜÁ¦
USHORTwMinMultiWordDMACycle;//WORD65:
¶à×Ö½ÚDMA´«ÊäÖÜÆÚµÄ×îСֵ
USHORTwRecMultiWordDMACycle;//WORD66:
¶à×Ö½ÚDMA´«ÊäÖÜÆڵĽ¨ÒéÖµ
USHORTwMinPIONoFlowCycle;//WORD67:
ÎÞÁ÷¿ØÖÆʱPIO´«ÊäÖÜÆÚµÄ×îСֵ
USHORTwMinPOIFlowCycle;//WORD68:
ÓÐÁ÷¿ØÖÆʱPIO´«ÊäÖÜÆÚµÄ×îСֵ
USHORTwReserved69[11];//WORD69-79:
±£Áô
struct{
USHORTReserved1:
1;
USHORTATA1:
1;//1=Ö§³ÖATA-1
USHORTATA2:
1;//1=Ö§³ÖATA-2
USHORTATA3:
1;//1=Ö§³ÖATA-3
USHORTATA4:
1;//1=Ö§³ÖATA/ATAPI-4
USHORTATA5:
1;//1=Ö§³ÖATA/ATAPI-5
USHORTATA6:
1;//1=Ö§³ÖATA/ATAPI-6
USHORTATA7:
1;//1=Ö§³ÖATA/ATAPI-7
USHORTATA8:
1;//1=Ö§³ÖATA/ATAPI-8
USHORTATA9:
1;//1=Ö§³ÖATA/ATAPI-9
USHORTATA10:
1;//1=Ö§³ÖATA/ATAPI-10
USHORTATA11:
1;//1=Ö§³ÖATA/ATAPI-11
USHORTATA12:
1;//1=Ö§³ÖATA/ATAPI-12
USHORTATA13:
1;//1=Ö§³ÖATA/ATAPI-13
USHORTATA14:
1;//1=Ö§³ÖATA/ATAPI-14
USHORTReserved2:
1;
}wMajorVersion;//WORD80:
Ö÷°æ±¾
USHORTwMinorVersion;//WORD81:
¸±°æ±¾
USHORTwReserved82[6];//WORD82-87:
±£Áô
struct{
USHORTMode0:
1;//1=Ö§³Öģʽ0(16.7Mb/s)
USHORTMode1:
1;//1=Ö§³Öģʽ1(25Mb/s)
USHORTMode2:
1;//1=Ö§³Öģʽ2(33Mb/s)
USHORTMode3:
1;//1=Ö§³Öģʽ3(44Mb/s)
USHORTMode4:
1;//1=Ö§³Öģʽ4(66Mb/s)
USHORTMode5:
1;//1=Ö§³Öģʽ5(100Mb/s)
USHORTMode6:
1;//1=Ö§³Öģʽ6(133Mb/s)
USHORTMode7:
1;//1=Ö§³Öģʽ7(166Mb/s)?
?
?
USHORTMode0Sel:
1;//1=ÒÑÑ¡Ôñģʽ0
USHORTMode1Sel:
1;//1=ÒÑÑ¡Ôñģʽ1
USHORTMode2Sel:
1;//1=ÒÑÑ¡Ôñģʽ2
USHORTMode3Sel:
1;//1=ÒÑÑ¡Ôñģʽ3
USHORTMode4Sel:
1;//1=ÒÑÑ¡Ôñģʽ4
USHORTMode5Sel:
1;//1=ÒÑÑ¡Ôñģʽ5
USHORTMode6Sel:
1;//1=ÒÑÑ¡Ôñģʽ6
USHORTMode7Sel:
1;//1=ÒÑÑ¡Ôñģʽ7
}wUltraDMA;//WORD88:
UltraDMAÖ§³ÖÄÜÁ¦
USHORTwReserved89[167];//WORD89-255
}IDINFO,*PIDINFO;
//SCSIÇý¶¯ËùÐèµÄÊäÈëÊä³ö¹²ÓõĽṹ
typedefstruct_SRB_IO_CONTROL
{
ULONGHeaderLength;//Í·³¤¶È
UCHARSignature[8];//ÌØÕ÷Ãû³Æ
ULONGTimeout;//³¬Ê±Ê±¼ä
ULONGControlCode;//¿ØÖÆÂë
ULONGReturnCode;//·µ»ØÂë
ULONGLength;//»º³åÇø³¤¶È
}SRB_IO_CONTROL,*PSRB_IO_CONTROL;
ÐèÒªÒýÆð×¢ÒâµÄÊÇIDINFOµÚ57-58WORD(CHS¿ÉÑ°Ö·µÄÉÈÇøÊý)£¬ÒòΪ²»Âú×ã32λ¶ÔÆëµÄÒªÇ󣬲»¿É¶¨ÒåΪһ¸öULONG×ֶΡ£LynnMcGuireµÄ³ÌÐòÀïÕýÊÇÓÉÓÚ¶¨ÒåΪһ¸öULONG×ֶΣ¬µ¼Ö¸ýṹ²»¿ÉÓá£
ÒÔÏÂÊǺËÐÄ´úÂ룺
//´ò¿ªÉ豸
//filename:
É豸µÄ¡°ÎļþÃû¡±
HANDLEOpenDevice(LPCTSTRfilename)
{
HANDLEhDevice;
//´ò¿ªÉ豸
hDevice=:
:
CreateFile(filename,//ÎļþÃû
GENERIC_READ|GENERIC_WRITE,//¶Áд·½Ê½
FILE_SHARE_READ|FILE_SHARE_WRITE,//¹²Ïí·½Ê½
NULL,//ĬÈϵݲȫÃèÊö·û
OPEN_EXISTING,//´´½¨·½Ê½
0,//²»ÐèÉèÖÃÎļþÊôÐÔ
NULL);//²»Ðè²ÎÕÕÄ£°åÎļþ
returnhDevice;
}
//ÏòÇý¶¯·¢¡°IDENTIFYDEVICE¡±ÃüÁ»ñµÃÉ豸ÐÅÏ¢
//hDevice:
É豸¾ä±ú
//pIdInfo:
É豸ÐÅÏ¢½á¹¹Ö¸Õë
BOOLIdentifyDevice(HANDLEhDevice,PIDINFOpIdInfo)
{
PSENDCMDINPARAMSpSCIP;//ÊäÈëÊý¾Ý½á¹¹Ö¸Õë
PSENDCMDOUTPARAMSpSCOP;//Êä³öÊý¾Ý½á¹¹Ö¸Õë
DWORDdwOutBytes;//IOCTLÊä³öÊý¾Ý³¤¶È
BOOLbResult;//IOCTL·µ»ØÖµ
//ÉêÇëÊäÈë/Êä³öÊý¾Ý½á¹¹¿Õ¼ä
pSCIP=(PSENDCMDINPARAMS):
:
GlobalAlloc(LMEM_ZEROINIT,sizeof(SENDCMDINPARAMS)-1);
pSCOP=(PSENDCMDOUTPARAMS):
:
GlobalAlloc(LMEM_ZEROINIT,sizeof(SENDCMDOUTPARAMS)+sizeof(IDINFO)-1);
//Ö¸¶¨ATA/ATAPIÃüÁîµÄ¼Ä´æÆ÷Öµ
//pSCIP->irDriveRegs.bFeaturesReg=0;
//pSCIP->irDriveRegs.bSectorCountReg=0;
//pSCIP->irDriveRegs.bSectorNumberReg=0;
//pSCIP->irDriveRegs.bCylLowReg=0;
//pSCIP->irDriveRegs.bCylHighReg=0;
//pSCIP->irDriveRegs.bDriveHeadReg=0;
pSCIP->irDriveRegs.bCommandReg=IDE_ATA_IDENTIFY;
//Ö¸¶¨ÊäÈë/Êä³öÊý¾Ý»º³åÇø´óС
pSCIP->cBufferSize=0;
pSCOP->cBufferSize=sizeof(IDINFO);
//IDENTIFYDEVICE
bResult=:
:
DeviceIoControl(hDevice,//É豸¾ä±ú
DFP_RECEIVE_DRIVE_DATA,//Ö¸¶¨IOCTL
pSCIP,sizeof(SENDCMDINPARAMS)-1,//ÊäÈëÊý¾Ý»º³åÇø
pSCOP,sizeof(SENDCMDOUTPARAMS)+sizeof(IDINFO)-1,//Êä³öÊý¾Ý»º³åÇø
&dwOutBytes,//Êä³öÊý¾Ý³¤¶È
(LPOVERLAPPED)NULL);//ÓÃͬ²½I/O
//¸´ÖÆÉ豸²ÎÊý½á¹¹
:
:
memcpy(pIdInfo,pSCOP->bBuffer,sizeof(IDINFO));
//ÊÍ·ÅÊäÈë/Êä³öÊý¾Ý¿Õ¼ä
:
:
GlobalFree(pSCOP);
:
:
GlobalFree(pSCIP);
returnbResult;
}
//ÏòSCSIMINI-PORTÇý¶¯·¢¡°IDENTIFYDEVICE¡±ÃüÁ»ñµÃÉ豸ÐÅÏ¢
//hDevice:
É豸¾ä±ú
//pIdInfo:
É豸ÐÅÏ¢½á¹¹Ö¸Õë
BOOLIdentifyDeviceAsScsi(HANDLEhDevice,intnDrive,PIDINFOpIdInfo)
{
PSENDCMDINPARAMSpSCIP;//ÊäÈëÊý¾Ý½á¹¹Ö¸Õë
PSENDCMDOUTPARAMSpSCOP;//Êä³öÊý¾Ý½á¹¹Ö¸Õë
PSRB_IO_CONTROLpSRBIO;//SCSIÊäÈëÊä³öÊý¾Ý½á¹¹Ö¸Õë
DWORDdwOutBytes;//IOCTLÊä³öÊý¾Ý³¤¶È
BOOLbResult;//IOCTL·µ»ØÖµ
//ÉêÇëÊäÈë/Êä³öÊý¾Ý½á¹¹¿Õ¼ä
pSRBIO=(PSRB_IO_CONTROL):
:
GlobalAlloc(LMEM_ZEROINIT,sizeof(SRB_IO_CONTROL)+sizeof(SENDCMDOUTPARAMS)+sizeof(IDINFO)-1);
pSCIP=(PSENDCMDINPARAMS)((char*)pSRBIO+sizeof(SRB_IO_CONTROL));
pSCOP=(PSENDCMDOUTPARAMS)((char*)pSRBIO+sizeof(SRB_IO