#include "dasm_proto.h"
#include "ex5_labels_x64.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <windows.h>
void* link(Dst_DECL) {
size_t size = 0;
int linkStatus = dasm_link(Dst, &size);
if (linkStatus != DASM_S_OK) {
}
void* mem = VirtualAlloc(0, size + sizeof(size_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (mem == 0) {
fprintf(stderr
, "allocation error\n"); }
*(size_t*)mem = size;
void *ret = (char*)mem + sizeof(size_t);
dasm_encode(Dst, ret);
//FlushInstructionCache(GetCurrentProcess(), ret, size);
DWORD oldProt = 0;
BOOL st = VirtualProtect(mem, size, PAGE_EXECUTE_READ, &oldProt);
if (st != TRUE) {
VirtualFree(mem, 0, MEM_RELEASE);
fprintf(stderr
, "error while changing memory protection"); }
return ret;
}
void* globalTbl[GLOB__MAX == 0 ? 1 : GLOB__MAX];
void* generate(Dst_DECL, int nopCount) {
dasm_init(Dst, 1);
dasm_setupglobal(Dst, globalTbl, GLOB__MAX);
dasm_setup(Dst, actions);
dasm_growpc(Dst, 1);
dynasmGenerator(Dst, nopCount);
return link(Dst);
}
int main(int argc, char **argv)
{
dasm_State *dasmState;
uint64_t (*fptr)() = ((uint64_t(*)()) generate(&dasmState, 4 * 1024 * 1024 + 1));
uint64_t result = fptr();
return 0;
}
I2luY2x1ZGUgImRhc21fcHJvdG8uaCIKI2luY2x1ZGUgImV4NV9sYWJlbHNfeDY0LmgiCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW50Lmg+CiNpbmNsdWRlIDx3aW5kb3dzLmg+Cgp2b2lkKiBsaW5rKERzdF9ERUNMKSB7CglzaXplX3Qgc2l6ZSA9IDA7CglpbnQgbGlua1N0YXR1cyA9IGRhc21fbGluayhEc3QsICZzaXplKTsKCWlmIChsaW5rU3RhdHVzICE9IERBU01fU19PSykgewoJCWZwcmludGYoc3RkZXJyLCAibGluayBlcnJvclxuIik7CgkJZXhpdCgxKTsKCX0KCgl2b2lkKiBtZW0gPSBWaXJ0dWFsQWxsb2MoMCwgc2l6ZSArIHNpemVvZihzaXplX3QpLCBNRU1fQ09NTUlULCBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFKTsKCWlmIChtZW0gPT0gMCkgewoJCWZwcmludGYoc3RkZXJyLCAiYWxsb2NhdGlvbiBlcnJvclxuIik7CgkJZXhpdCgyKTsKCX0KCgkqKHNpemVfdCopbWVtID0gc2l6ZTsKCXZvaWQgKnJldCA9IChjaGFyKiltZW0gKyBzaXplb2Yoc2l6ZV90KTsKCglkYXNtX2VuY29kZShEc3QsIHJldCk7CgoJLy9GbHVzaEluc3RydWN0aW9uQ2FjaGUoR2V0Q3VycmVudFByb2Nlc3MoKSwgcmV0LCBzaXplKTsKCglEV09SRCBvbGRQcm90ID0gMDsKCUJPT0wgc3QgPSBWaXJ0dWFsUHJvdGVjdChtZW0sIHNpemUsIFBBR0VfRVhFQ1VURV9SRUFELCAmb2xkUHJvdCk7CglpZiAoc3QgIT0gVFJVRSkgewoJCVZpcnR1YWxGcmVlKG1lbSwgMCwgTUVNX1JFTEVBU0UpOwoJCWZwcmludGYoc3RkZXJyLCAiZXJyb3Igd2hpbGUgY2hhbmdpbmcgbWVtb3J5IHByb3RlY3Rpb24iKTsKCQlleGl0KDMpOwoJfQoKCXJldHVybiByZXQ7Cn0KCnZvaWQqIGdsb2JhbFRibFtHTE9CX19NQVggPT0gMCA/IDEgOiBHTE9CX19NQVhdOwoKdm9pZCogZ2VuZXJhdGUoRHN0X0RFQ0wsIGludCBub3BDb3VudCkgewoJZGFzbV9pbml0KERzdCwgMSk7CgoJZGFzbV9zZXR1cGdsb2JhbChEc3QsIGdsb2JhbFRibCwgR0xPQl9fTUFYKTsKCWRhc21fc2V0dXAoRHN0LCBhY3Rpb25zKTsKCglkYXNtX2dyb3dwYyhEc3QsIDEpOwoKCWR5bmFzbUdlbmVyYXRvcihEc3QsIG5vcENvdW50KTsKCglyZXR1cm4gbGluayhEc3QpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWRhc21fU3RhdGUgKmRhc21TdGF0ZTsKCgl1aW50NjRfdCAoKmZwdHIpKCkgPSAoKHVpbnQ2NF90KCopKCkpIGdlbmVyYXRlKCZkYXNtU3RhdGUsIDQgKiAxMDI0ICogMTAyNCArIDEpKTsKCXVpbnQ2NF90IHJlc3VsdCA9IGZwdHIoKTsKCglwcmludGYgKCIlbGx4XG4iLCByZXN1bHQpOwoJcmV0dXJuIDA7Cn0K