【发布时间】:2012-01-07 11:46:23
【问题描述】:
有人可以帮我将这个 C++ 函数移植到 Delphi 中吗?
sys 是一个名为 TSystem 的类。
SharedMem 是一个名为 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);
}
};
};
谢谢
这是我尝试转换上面的代码:
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;
【问题讨论】:
-
我第一次尝试但我被困在这个:image_import_by_name** 名称;我的意思是(**)。如果它是 * 我知道它是一个 Pointer ,但是这个 (**) ?
-
那是指向指针的指针。我认为你不能在delphi中内联指定这种类型,但你需要定义一个
PImage_import_by_name类型。然后内联指定一个指向这个指针类型的指针。 -
如何在 delphi 中声明?像这样:var names:Pimage_import_by_name;
-
var names:Pimage_import_by_name^;或var names:PPimage_import_by_name;假设您创建了适当的类型定义。 -
names=(image_import_by_name**)Imports->original_first_thunk;这是正确的声明吗:names:=Pimage_import_by_name(Imports.original_first_thunk);