Tôi đang làm việc với ocx Adobe Flash bằng cách tải nó vào chương trình C++ của tôi. Các ocx được coi là 64 bit nhưng đối với một số lý do nó có vấn đề khi tôi biên dịch với nền tảng x64. Tôi đã đọc về điều này và thấy rằng có khả năng một số chức năng nhận được DWORD userData
thay vì void* userData
thông qua một số cấu trúc và sau đó đưa nó vào một con trỏ đối tượng. Tính năng này hoạt động tốt trong môi trường 32 bit nhưng bị lỗi trong 64 bit.MASM Sửa lỗi 64 bit trong một DLL
Các tháo của hàm gọi bên trong ocx mà gây ra tai nạn là những dòng sau:
mov ecx,r8d
Bản sao hoạt động đầu tiên chỉ thấp 32-bit R8D
-ECX
(ECX là 32-bit).
cmp dword ptr [rcx+11BCh],0
Thao tác thứ hai truy cập thanh ghi 64 bit, trong đó 32 bit thấp chứa địa chỉ chính xác và 32 bit cao chứa một số rác. Dẫn đến một vụ tai nạn, tất nhiên.
Giải pháp
Tôi đã đọc rằng một giải pháp khả thi là phải làm như sau:
Tạo một file asm có chứa đoạn mã sau:
nop nop nop mov ecx,r8d cmp dword ptr [rcx+11BCh],0 nop nop nop mov rcx,r8d // I've replaced ecx with rcx here cmp dword ptr [rcx+11BCh],0
Xây dựng tệp obj bằng tệp asm này và MASM.exe
- Mở tệp obj bằng trình chỉnh sửa hex và xác định số 90 đại diện cho nop
- Trong ocx Flash xác định chuỗi byte đầu tiên giữa các bước nhảy và thay thế bằng chuỗi byte mới xuất hiện sau các bước nhảy . Điều này sẽ thay đổi nó từ các cuộc gọi hàm 32 bit đến 64 bit.
Vấn đề
tôi đã cố gắng này bằng cách làm cho file asm sau và xây dựng nó với ml64.exe (Tôi không có masm.exe nhưng tôi nghĩ rằng ml.exe là mới phiên bản 32 bit của nó, và mã này sẽ chỉ xây dựng với ml64.exe, có lẽ vì các nhà khai thác chỉ 64-bit):
TITLE: Print String Assembly Program (test.asm)
.Code
main Proc
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8
cmp dword ptr [rcx+11BCh],0
main ENDP
END
tôi gặp rắc rối khi nó để xây dựng (tôi liên tục nhận được các lỗi về phù hợp với chiều dài lệnh) cho đến khi tôi thay đổi r8d thành r8 trong phần thứ hai.
Tôi nhận được obj này để xây dựng và mở nó bằng trình chỉnh sửa hex và có thể định vị hai chuỗi byte. Nhưng vấn đề của tôi là khi tôi tìm chuỗi byte đầu tiên phải ở trong ocx flash, tôi không thể tìm thấy nó. Nó không có ở đó, vì vậy tôi không thể thay thế nó bằng cái thứ hai.
Tôi đang làm gì sai?
Cảm ơn!
Bạn có thể là người thông minh nhất trong cộng đồng Flash tại đây. heh –
ha Tôi muốn .. Tôi thực sự muốn tôi biết nhiều hơn về lắp ráp và có thể nhận được điều này để làm việc. Tôi gần như tích cực, tôi biết vấn đề là gì, dường như không thể sửa được nó! –
Bạn có nói rằng bạn đã giải quyết được sự cố của mình bằng cách chỉnh sửa thủ công tệp Flash OCX không? – Gabe