mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
Fix 64bits callback stub, i now preserve the return value
This commit is contained in:
@@ -193,6 +193,7 @@ def generate_stub_64(callback):
|
||||
c_callback = ctypes.c_ulong.from_address(id(callback._objects['0']) + 3 * ctypes.sizeof(ctypes.c_void_p)).value
|
||||
gstate_save_addr = allocator.reserve_int()
|
||||
return_addr_save_addr = allocator.reserve_int()
|
||||
return_value_save_addr = allocator.reserve_int()
|
||||
|
||||
Reserve_space_for_call = MultipleInstr([Push_RDI()] * 4)
|
||||
Clean_space_for_call = MultipleInstr([Pop_RDI()] * 4)
|
||||
@@ -250,6 +251,8 @@ def generate_stub_64(callback):
|
||||
code += Mov_RAX_X(c_callback)
|
||||
code += Clean_space_for_call
|
||||
code += Call_RAX()
|
||||
# Save return value
|
||||
code += Mov_DX_RAX(return_value_save_addr)
|
||||
code += Mov_RAX_DX(return_addr_save_addr)
|
||||
code += Push_RAX()
|
||||
code += Mov_RAX_X(release)
|
||||
@@ -267,6 +270,8 @@ def generate_stub_64(callback):
|
||||
code += Mov_RSI_DRAX()
|
||||
code += Mov_RAX_X(save_rdi)
|
||||
code += Mov_DRAX_RDI()
|
||||
# Restore return value
|
||||
code += Mov_RAX_DX(return_value_save_addr)
|
||||
code += Ret()
|
||||
return code
|
||||
|
||||
|
||||
@@ -108,7 +108,6 @@ def PEFile(baseaddr):
|
||||
def get_IMPORT_DESCRIPTORS(self):
|
||||
import_datadir = self.get_DataDirectory()[IMAGE_DIRECTORY_ENTRY_IMPORT]
|
||||
if import_datadir.VirtualAddress == 0:
|
||||
print("get_IMPORT_DESCRIPTORS : VirtualAddress == 0")
|
||||
return []
|
||||
import_descriptor_addr = RVA(import_datadir.VirtualAddress).addr
|
||||
current_import_descriptor = self.IMAGE_IMPORT_DESCRIPTOR.from_address(import_descriptor_addr)
|
||||
@@ -157,7 +156,6 @@ def PEFile(baseaddr):
|
||||
else:
|
||||
import_by_name = IMPORT_BY_NAME.from_address(baseaddr + int_entry.AddressOfData)
|
||||
name = ctypes.c_char_p(ctypes.addressof(import_by_name) + IMPORT_BY_NAME.Name.offset).value
|
||||
print(name)
|
||||
res.append((import_by_name.Hint, name))
|
||||
int_addr += ctypes.sizeof(THUNK_DATA)
|
||||
int_entry = THUNK_DATA.from_address(int_addr)
|
||||
|
||||
Reference in New Issue
Block a user