从C++到德尔福的转换
Conversion from C++ to Delphi
有人可以帮助我将这个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;
像这样的东西(DWORD
和PDWORD
在Windows
单元中定义(:
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;
编辑:我修复了行(DWORD(Names[I].Name + FileHandler) and $80000000) = 0
中的条件。
尝试这样的事情:
uses
..., Windows;
type
PPIMAGE_IMPORT_BY_NAME = ^PIMAGE_IMPORT_BY_NAME;
function Process.FixApi(FileHandler: DWORD; Imports: PIMAGE_IMPORT_DESCRIPTOR; dllbase: DWORD): Integer;
var
names: PPIMAGE_IMPORT_BY_NAME;
pointers: LPDWORD;
i: Integer;
s, ptr, n: DWORD;
begin
Result := 0;
if Imports^.original_first_thunk <> 0 then
names := PPIMAGE_IMPORT_BY_NAME(Imports^.original_first_thunk)
else
names := PPIMAGE_IMPORT_BY_NAME(Imports^.first_thunk);
names := PPIMAGE_IMPORT_BY_NAME(DWORD(names) + FileHandler);
pointers := LPDWORD(Imports^.first_thunk + FileHandler);
if Imports^.first_thunk = 0 then Exit;
for i := 0 to 199 do
begin
if names^ = nil then Break;
if (DWORD(names^^.name + FileHandler) and $80000000) = 0 then
begin
s := DWORD(names^^.name);
ptr := sys.GetAPI(PAnsiChar(s + FileHandler), dllbase);
n := Self.SharedMem.get_virtual_pointer(ptr);
if n <> 0 then
ptr := n;
pointers^ := ptr;
end;
Inc(names);
Inc(pointers);
end;
end;
相关文章:
- C++结构到德尔福记录dll调用
- 如何在德尔福中C++制作与此类似的结构
- 德尔福在回调中出现 GUI 问题
- 我有点坚持德尔福的动态虚拟通道
- 加密和解密C++和德尔福中的一些字符串
- SDK指针的问题 - c++到德尔福的翻译
- 德尔福仿制药:E2037:'XXX'声明与以前的声明不同
- 德尔福动态DLL调用中的奇怪行为
- C++德尔福的int8_t[20]类型
- 如何在德尔福中C++参数数组指针算术
- 将德尔福记录与"polymorphic"转换为C / C ++
- 从C++ .dll到德尔福表单应用程序的PostMessage问题
- C++德尔福头文件翻译:带有指向 void 的指针的函数
- 明确表示对德尔福的所有权
- 德尔福中C++“const”返回类型相当于什么
- 将C++ FOR循环转换为德尔福
- 无法从德尔福文件安装嵌入C++生成器上的铬
- 从C++到德尔福的转换
- 德尔福复制记忆 vs C++ memcpy
- 如何将以下"class reference"机制从德尔福转换为C++11?