#include #include #include #define _GNU_SOURCE /* See feature_test_macros(7) */ #include #include #include #include "wrappedlibs.h" #include "debug.h" #include "wrapper32.h" #include "bridge.h" #include "librarian/library_private.h" #include "x64emu.h" #include "emu/x64emu_private.h" #include "callback.h" #include "librarian.h" #include "box32context.h" #include "emu/x64emu_private.h" #include "myalign32.h" static const char* expatName = "libexpat.so.1"; #define LIBNAME expat #include "generated/wrappedexpattypes32.h" #include "wrappercallback32.h" #define SUPER() \ GO(0) \ GO(1) \ GO(2) \ GO(3) \ GO(4) // StartElementHandler ... #define GO(A) \ static uintptr_t my_StartElementHandler_fct_##A = 0; \ static void* my_StartElementHandler_##A(void* data, void* name, void** attr) \ { \ int cnt = 0; \ while(attr[cnt]) cnt+=2; \ ++cnt; \ ptr_t attr_s[cnt]; \ for(int i=0; iXML_SetElementHandler(p, find_StartElementHandler_Fct(start), find_End_Fct(end)); } EXPORT void my32_XML_SetCharacterDataHandler(x64emu_t* emu, void* p, void* h) { my->XML_SetCharacterDataHandler(p, find_CharData_Fct(h)); } //EXPORT void my32_XML_SetNamespaceDeclHandler(x64emu_t* emu, void* p, void* start, void* end) //{ // my->XML_SetNamespaceDeclHandler(p, find_StartNamespaceDecl_Fct(start), find_EndNamespaceDecl_Fct(end)); //} //EXPORT void my32_XML_SetEntityDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetEntityDeclHandler(p, find_EntityDecl_Fct(f)); //} //EXPORT void my32_XML_SetStartDoctypeDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetStartDoctypeDeclHandler(p, find_StartDoctypeDecl_Fct(f)); //} //EXPORT void my32_XML_SetEndDoctypeDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetEndDoctypeDeclHandler(p, find_EndDoctypeDecl_Fct(f)); //} //EXPORT void my32_XML_SetElementDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetElementDeclHandler(p, find_ElementDecl_Fct(f)); //} //EXPORT void my32_XML_SetDefaultHandlerExpand(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetDefaultHandlerExpand(p, find_Default_Fct(f)); //} //EXPORT void my32_XML_SetCommentHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetCommentHandler(p, find_Comment_Fct(f)); //} //EXPORT void my32_XML_SetProcessingInstructionHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetProcessingInstructionHandler(p, find_ProcessingInstruction_Fct(f)); //} //EXPORT void my32_XML_SetStartElementHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetStartElementHandler(p, find_StartElement_Fct(f)); //} //EXPORT void my32_XML_SetEndElementHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetEndElementHandler(p, find_EndElement_Fct(f)); //} //EXPORT void my32_XML_SetUnknownEncodingHandler(x64emu_t* emu, void* p, void* f, void* d) //{ // my->XML_SetUnknownEncodingHandler(p, find_UnknownEncoding_Fct(f), d); //} //EXPORT void my32_XML_SetUnparsedEntityDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetUnparsedEntityDeclHandler(p, find_UnparsedEntityDecl_Fct(f)); //} //EXPORT void my32_XML_SetNotationDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetNotationDeclHandler(p, find_NotationDecl_Fct(f)); //} //EXPORT void my32_XML_SetStartNamespaceDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetStartNamespaceDeclHandler(p, find_StartNamespaceDecl_Fct(f)); //} //EXPORT void my32_XML_SetEndNamespaceDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetEndNamespaceDeclHandler(p, find_EndNamespaceDecl_Fct(f)); //} //EXPORT void my32_XML_SetStartCdataSectionHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetStartCdataSectionHandler(p, find_StartCdataSection_Fct(f)); //} //EXPORT void my32_XML_SetEndCdataSectionHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetEndCdataSectionHandler(p, find_EndCdataSection_Fct(f)); //} //EXPORT void my32_XML_SetDefaultHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetDefaultHandler(p, find_Default_Fct(f)); //} //EXPORT void my32_XML_SetNotStandaloneHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetNotStandaloneHandler(p, find_NotStandalone_Fct(f)); //} //EXPORT void my32_XML_SetExternalEntityRefHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetExternalEntityRefHandler(p, find_ExternalEntityRef_Fct(f)); //} //EXPORT void my32_XML_SetXmlDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetXmlDeclHandler(p, find_XmlDecl_Fct(f)); //} //EXPORT void my32_XML_SetAttlistDeclHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetAttlistDeclHandler(p, find_AttlistDecl_Fct(f)); //} //EXPORT void my32_XML_SetSkippedEntityHandler(x64emu_t* emu, void* p, void* f) //{ // my->XML_SetSkippedEntityHandler(p, find_SkippedEntity_Fct(f)); //} EXPORT void my32_XML_SetDoctypeDeclHandler(x64emu_t* emu, void* p, void* start, void* end) { (void)emu; my->XML_SetDoctypeDeclHandler(p, find_StartDoctypeDecl_Fct(start), find_EndDoctypeDecl_Fct(end)); } // this function will call the callbacks with many structures created on the stack, wich might be a 64bits walue on the initial thred // so using a swapcontext trick to use a 32bits stack temporarily // TODO: generalise this on main? static void func1(uint32_t* ret, void* p, int a, int b) { *ret = my->XML_ParseBuffer(p, a, b); } ucontext_t uctx_main, uctx_func1; #ifndef ANDROID EXPORT uint32_t my32_XML_ParseBuffer(x64emu_t* emu, void* p, int a, int b) { getcontext(&uctx_func1); size_t stack_size = 1024*1024; void* func1_stack = mmap(NULL, stack_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_32BIT|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); uctx_func1.uc_stack.ss_sp = func1_stack; uctx_func1.uc_stack.ss_size = stack_size; uctx_func1.uc_link = &uctx_main; uint32_t ret = 0; makecontext(&uctx_func1, (void*)func1, 4, &ret, p, a, b); swapcontext(&uctx_main, &uctx_func1); munmap(func1_stack, stack_size); return ret; } #endif #include "wrappedlib_init32.h"