1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| function SmartReadAttributeValues3(const AHandle: THandle; const ADriveNumber: byte; var ASertARien: integer; var AAttrs: TSmartAttrs): boolean;
var
vOutP: TSendCmdOutParams;
pAttrs,pAttrsDebug1: PSmartAttrs;
vLocalAttrs : TSmartAttrs;
vInP: TSendCmdInParams;
vRecBytes,ABufferSize: dword;
begin
pAttrsDebug1:=@AAttrs; //= psmartattrs($00000000013FEA80)
ASertARien := 8888; //= 8888
// ici AAttrs = record TSMARTATTRS { A = 85, B = 85, RESULTS = { { ID = 85, FLAGS = 21845, CURRENT = 85, WORST = 85, RAW = { 85, 85, 85, 85, 85, 85}, RESERVED = 85} <repeats 30 times>}, RESERVED = {}}
//Result := SmartRcvDriveData2(AHandle, ADriveNumber, SMART_CMD, READ_ATTRIBUTES, 1, 1,
// SMART_CYL_LOW, SMART_CYL_HI,
// READ_ATTRIBUTE_BUFFER_SIZE, vOutP{%H-});
zeromemory(@vInP,Sizeof(TSendCmdInParams));
ABufferSize:= READ_ATTRIBUTE_BUFFER_SIZE;
vInP.cBufferSize := ABufferSize;
vInP.bDriveNumber := ADriveNumber;
vInP.irDriveRegs.bFeaturesReg := READ_ATTRIBUTES; //AFeatures;
vInP.irDriveRegs.bSectorCountReg := 1; //ASecCount;
vInP.irDriveRegs.bSectorNumberReg := 1; //ASecNum;
vInP.irDriveRegs.bCylLowReg := SMART_CYL_LOW; //ACylLow;
vInP.irDriveRegs.bCylHighReg := SMART_CYL_HI; //ACylHigh;
vInP.irDriveRegs.bDriveHeadReg := $A0 or ((ADriveNumber and 1) shl 4);
vInP.irDriveRegs.bCommandReg := SMART_CMD; //ACommand;
vRecBytes := 0;
Result := DeviceIoControl(AHandle, SMART_RCV_DRIVE_DATA, @vInP, sizeof(vInP), @vOutP, sizeof(TSendCmdOutParams)+ABufferSize, vRecBytes, nil);
// CATASTROPHE !
// Ici ASertARien = Cannot access memory at address 0xde61610032040000
// ici AAttrs = record TSMARTATTRS Cannot access memory at address 0x5c6400
if Result then
begin
pAttrs := @vOutP.bBuffer;
vLocalAttrs := pAttrs^; //ici vLocalAttrs contient exactement ce que je voudrais recuperer
// Mais impossible de l'affecter à AAttrs car AAttrs est en "Cannot access memory"
// depuis l'appel a DeviceIOControl
AAttrs := vLocalAttrs; //SIGSEG
end;
ASertARien:=555;
end; |