MahdiSafsafi/DDetours

Access violation using intercept TDBXFirebirdCustomMetaDataReader.GetAllDataTypes in Win64 platform

ccy opened this issue · 0 comments

ccy commented

I am trying to intercept TDBXFirebirdCustomMetaDataReader.GetAllDataTypes method with these code:

uses Data.DBXFirebirdMetaDataReader, Data.DBXMetaDataReader;

var TDBXFirebirdCustomMetaDataReader_GetAllDataTypes: function(Self: TDBXFirebirdCustomMetaDataReader): TDBXDataTypeDescriptionArray = nil;

type
  TDBXFirebirdCustomMetaDataReaderHelper = class helper for TDBXFirebirdCustomMetaDataReader
    class function GetAllDataTypes_Address: Pointer;
  end;

function GetAllDataTypes_Patch(Self: TDBXFirebirdCustomMetaDataReader):
    TDBXDataTypeDescriptionArray;
begin
  Result := TDBXFirebirdCustomMetaDataReader_GetAllDataTypes(Self);
  ShowMessage('1: ' + Result[0].TypeName);
end;

class function TDBXFirebirdCustomMetaDataReaderHelper.GetAllDataTypes_Address: Pointer;
begin
  Result := @TDBXFirebirdCustomMetaDataReader.GetAllDataTypes;
end;

procedure TForm94.Button1Click(Sender: TObject);
begin
  var a := TDBXFirebirdCustomMetaDataReader.Create;
  var b := a.AllDataTypes;
  ShowMessage('2: ' + b[0].TypeName);
end;

initialization
  TDBXFirebirdCustomMetaDataReader_GetAllDataTypes := InterceptCreate(TDBXFirebirdCustomMetaDataReader.GetAllDataTypes_Address, @GetAllDataTypes_Patch);
finalization
  InterceptRemove(@TDBXFirebirdCustomMetaDataReader_GetAllDataTypes);
end.

The above code works on Win32 platform but fail with access violation in Win64 platform.