Shrif
asked on
Self-modifying code in Win32
In Win16, one used PrestoChangoSelector() to convert a DS segment into a CS segment and then run code that's constructed at runtime. This was done by loader applications that: 1) allocated memory, 2) loaded a binary image into the memory, and 3) executed the contents of the memory. How does one do something like this from a Win32 program.I'm trying to do the following. I have an application which has a scripting subsystem. I want to add the functionality of Visual Basic's "AddressOf" operator -- basically on-the-floy Callback's. AddressOf is a function returns a "void*" to a newly defined callback. I basically need to be able to create a "Thunk" the way MakeProcInstance worked in Win16.Anyone have a clue on how to do this from a straight Win32program?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
byang, if what you say works, then I will accept the answer.However, before I give you the A grade, could you explain something to me that you said in your answer that I do not understand. "Sadly, Win95 doesn't support writable-and-runnable memory block at the same time. This means your code cannot modify
itself when it's running. You must exit from it, call VirtualProtect(), then repeat step 3-6.
"What do you mean by I must exit from "it". What is "it"? Exit Windows 95? Exit my application?Can you give me the steps that I should do in Windows 95?
itself when it's running. You must exit from it, call VirtualProtect(), then repeat step 3-6.
"What do you mean by I must exit from "it". What is "it"? Exit Windows 95? Exit my application?Can you give me the steps that I should do in Windows 95?
By "it" I mean the block of code you want to modify. It cannot modify itself in Win95. In DOS, you can do something like this:
label0: mov ax,1234h ;will be self-modified here
;... more code
mov word ptr cs:[label0+1],bx ;self-modify
loop label0
This is not possible (at least not easily possible) in Win95. To do it, the cs segment must be readable, writable, and executable. Win95 does not support all three attribute at the same time. So the code above would cause an access violation.
label0: mov ax,1234h ;will be self-modified here
;... more code
mov word ptr cs:[label0+1],bx ;self-modify
loop label0
This is not possible (at least not easily possible) in Win95. To do it, the cs segment must be readable, writable, and executable. Win95 does not support all three attribute at the same time. So the code above would cause an access violation.
The pointer referance could be defined as a Callback function pointer to this memory area.