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;

_IDEREGS @ Microsoft

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;

Explications @ Microsoft

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é.