Ceci est une ancienne révision du document !
DeviceIOControl en Pascal
Commandes
SMART_SEND_DRIVE_COMMAND
Types utiles
TSendCmdInParams
- jwawinioctl.pas
_SENDCMDINPARAMS = packed record cBufferSize: DWORD; // Buffer size in bytes irDriveRegs: IDEREGS; // Structure with drive register values. bDriveNumber: BYTE; // Physical drive number to send // command to (0,1,2,3). bReserved: array [0..2] of BYTE; // Reserved for future expansion. dwReserved: array [0..3] of DWORD; // For future use. bBuffer: array [0..0] of BYTE; // Input buffer. end; ... _IDEREGS = packed record bFeaturesReg: BYTE; // Used for specifying SMART "commands". bSectorCountReg: BYTE; // IDE sector count register bSectorNumberReg: BYTE; // IDE sector number register bCylLowReg: BYTE; // IDE low order cylinder value bCylHighReg: BYTE; // IDE high order cylinder value bDriveHeadReg: BYTE; // IDE drive/head register bCommandReg: BYTE; // Actual IDE command. bReserved: BYTE; // reserved for future use. Must be zero. end;
TSendCmdOutParams
- jwawinioctl.pas
_SENDCMDOUTPARAMS = packed record cBufferSize: DWORD; // Size of bBuffer in bytes DriverStatus: DRIVERSTATUS; // Driver status structure. bBuffer: array [0..0] of BYTE; // Buffer of arbitrary length in which to store the data read from the drive. end; ... _DRIVERSTATUS = packed record bDriverError: BYTE; // Error code from driver, or 0 if no error. bIDEError: BYTE; // Contents of IDE Error register. Only valid when bDriverError is SMART_IDE_ERROR. bReserved: array [0..1] of BYTE; // Reserved for future expansion. dwReserved: array [0..1] of DWORD; // Reserved for future expansion. end;
Constantes Utiles
Commandes SMART
// Feature register defines for SMART "sub commands" READ_ATTRIBUTES = $D0; READ_THRESHOLDS = $D1; ENABLE_DISABLE_AUTOSAVE = $D2; SAVE_ATTRIBUTE_VALUES = $D3; EXECUTE_OFFLINE_DIAGS = $D4; SMART_READ_LOG = $D5; SMART_WRITE_LOG = $d6; ENABLE_SMART = $D8; DISABLE_SMART = $D9; RETURN_SMART_STATUS = $DA; ENABLE_DISABLE_AUTO_OFFLINE = $DB;
Autres constantes
// Cylinder register defines for SMART command SMART_CYL_LOW = $4F; SMART_CYL_HI = $C2;
A etudier
BOOL CSmartReader::IsSmartEnabled(HANDLE hDevice,UCHAR ucDriveIndex) { SENDCMDINPARAMS cmdInParams={0}; SENDCMDOUTPARAMS smdOutParams={0}; DWORD dwRet=0; BOOL bRet=FALSE; cmdInParams.cBufferSize=0; cmdInParams.bDriveNumber =ucDriveIndex; cmdInParams.irDriveRegs.bFeaturesReg=ENABLE_SMART; cmdInParams.irDriveRegs.bSectorCountReg = 1; cmdInParams.irDriveRegs.bSectorNumberReg = 1; cmdInParams.irDriveRegs.bCylLowReg = SMART_CYL_LOW; cmdInParams.irDriveRegs.bCylHighReg = SMART_CYL_HI; cmdInParams.irDriveRegs.bDriveHeadReg = DRIVE_HEAD_REG; cmdInParams.irDriveRegs.bCommandReg = SMART_CMD; bRet=DeviceIoControl(hDevice,SMART_SEND_DRIVE_COMMAND,&cmdInParams,sizeof(cmdInParams),&smdOutParams,sizeof(smdOutParams),&dwRet,NULL); if(!bRet) { dwRet=GetLastError(); } return bRet; }
on trouve : (dans https://www.smartmontools.org/static/doxygen/atacmds_8cpp_source.html)
#define SMART_CYL_LOW 0x4F #define SMART_CYL_HI 0xC2
Sources
Sources
Vous pourriez laisser un commentaire si vous étiez connecté.