• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 363
  • Last Modified:

Detour, "Inline" asm. Access Violation. C++ to Delphi translation

This one is driving me bananas as it works in C++ and not in Delphi when to my eyes everything is the same. It's probably the way C++ handles variables from classes.

Anyway this is a small section for what I have:

  If Not(bNoRegs) Then

This is what it is in c++:

            Buffer += (BYTE)0x89; //mov dword ptr, ecx
            Buffer += (BYTE)0x0D;
            Buffer += (DWORD)&m_pClassInstance;

The Buffer variable isn't the issue as when the asm is written from the buffer it comes out right.
Now when each class is made the pClassInstance is set to nil(NULL in c++) it is a Pointer(BYTE * in c++). Now what is supposed to happen is pClassInstance is supposed to be set to ECX.
I.E. If ECX is $5E0000 pointer then pClassInstance should be equal to that. The same thing as doing pClassInstance := Pointer($5E0000);.

Now when this is executed on the delphi side I get an AV about not being able to access it.

Any ideas? If you need any other parts of the code just ask.
1 Solution
I don't know Delphi but in C/C++



that the address of the pointer variable was pushed to the buffer and not the address the pointer was pointing to. That normally is a way to specify an output argument cause the callee might change the pointer value that way and the caller will get the new address assigned to m_pClassInstance.

ThievingSixAuthor Commented:
"Yeh thats what I assumed it was. MOV DWORD PTR DS:[&m_pClassInstance] essentially dereferences the pointer. Since pClassInstance is pointing to nothing it's value is 0. When I debugged the program and stepped through the asm it was indeed the pointer to the variable and not what the pointer was pointing to. I still don't understand why the"

That was as far as I got in my reply until I realized why the variable couldn't be accessed. The code section:
            Buffer += (BYTE)0x89; //mov dword ptr, ecx
            Buffer += (BYTE)0x0D;
            Buffer += (DWORD)&m_pClassInstance;

It never got EXECUTE privileges!  Thanks to you confirming what I did was right it dawned on me! Thanks.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now