Search code examples
c++delphidelphi-7

Conversion from C++ to Delphi


Could someone helps me in porting this C++ function into Delphi?

sys is a class named TSystem.

SharedMem is a class named TVirtualMemory.

int Process::FixApi(dword FileHandler,image_import_descriptor* Imports,dword dllbase){
    image_import_by_name** names;                
    dword* pointers;                                                          
    if (Imports->original_first_thunk!=0){
       names=(image_import_by_name**)Imports->original_first_thunk;                                               
    }else{
          names=(image_import_by_name**)Imports->first_thunk;
    };
    names=(image_import_by_name**)((dword)names+FileHandler);
    pointers=(dword*)(Imports->first_thunk + FileHandler);
    if (Imports->first_thunk==0)return 0;                                          
    for (int i=0;i<200;i++){
        if (names[i]==0)break;
        if(!((dword)(names[i]->name+FileHandler) & 0x80000000)){
            dword s=(dword)names[i]->name;
            dword ptr=sys->GetAPI((char*)(s+FileHandler),dllbase);
            dword n=this->SharedMem->get_virtual_pointer(ptr);
            if (n!=0){
               ptr=n;
            }
            memcpy(&pointers[i],&ptr,4);
        }
    };
};

thank you

This is my attempt to convert the above code :

function FixApi(FileHandler: dword;
  Imports: Pimage_import_descriptor; dllbase: dword): Integer;
var
names:^image_import_by_name;
pointers:Pdword;
i:integer;
s,ptr,n:dword;
begin
if Imports^.original_first_thunk<>0 then
names:=Pointer(Imports^.original_first_thunk)
else
names:=Pointer(Imports^.first_thunk);

names:=Pointer(dword(names)+FileHandler);
pointers:=Pdword(Imports^.first_thunk+FileHandler);
if (Imports^.first_thunk=0)then result:=0;

for i:=0 to 200 do
begin
{
// i didn't get it 
if (names[i]==0)break;
if(!((dword)(names[i]->name+FileHandler) & 0x80000000)){
dword s=(dword)names[i]->name;
}
ptr:=sys.GetAPI(PChar(s+FileHandler),dllbase);
n:=SharedMem.get_virtual_pointer(ptr);
if n<>0 then
ptr:=n;

CopyMemory(@pointers[i],@ptr,4);

end;
end;

Solution

  • Something like this (DWORD and PDWORD are defined in the Windows unit):

    type
      PImageImportByName  = ^TImageImportByName;
      PPImageImportByName = ^PImageImportByName;
    
      PImageImportDescriptor = ^TImageImportDescriptor;
    
    // Since the original code has no valuable return code, I changed it to a procedure
    procedure FixApi(FileHandler: DWORD; Imports: PImageImportDescriptor; DllBase: DWORD);
    var
      Names: PPImageImportByName;
      Pointers: PDWORD;
      S: DWORD;
      Ptr: DWORD;
      N: DWORD;
    begin
      if Imports.FirstThunk = 0 then
        Exit;
    
      if Imports.OriginalFirstThunk <> 0 then
        Names := PPImageImportByName(Imports.OriginalFirstThunk)
      else
        Names := PPImageImportByName(Imports.FirstThunk);
    
      Names    := PPImageImportByName(DWORD(Names) + FileHandler);
      Pointers := PDWORD(Imports.FirstThunk + FileHandler);
    
      for I := 0 to 199 do begin
        if Names[I] = nil then
          Break;
    
        if (DWORD(Names[I].Name + FileHandler) and $80000000) = 0 then begin
          S   := DWORD(Names[I].Name);
          Ptr := Sys.GetApi(PChar(S + FileHandler), DllBase);
          N   := SharedMem.GetVirtualPointer(Ptr);
          if N <> 0 then begin
            Ptr := N;
          end;
          Move(Ptr, Pointers[I], 4); // I'm not sure about this part
        end;
      end;
    end;
    

    Edit: I fixed the condition in the line (DWORD(Names[I].Name + FileHandler) and $80000000) = 0.