I have a usecase forthese apis as drop in replacement for :
/* * Memory DLL loading code * Version 0.0.4 * * Copyright (c) 2004-2015 by Joachim Bauch / mail@joachim-bauch.de * http://www.joachim-bauch.de * * The contents of this file are subject to the Mozilla Public License Version * 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is MemoryModule.h * * The Initial Developer of the Original Code is Joachim Bauch. * * Portions created by Joachim Bauch are Copyright (C) 2004-2015 * Joachim Bauch. All Rights Reserved. * */#ifndef__MEMORY_MODULE_HEADER#define__MEMORY_MODULE_HEADER#include<windows.h>typedefvoid*HMEMORYMODULE;
typedefvoid*HMEMORYRSRC;
typedefvoid*HCUSTOMMODULE;
#ifdef__cplusplusextern"C" {
#endiftypedefLPVOID (*CustomAllocFunc)(LPVOID, SIZE_T, DWORD, DWORD, void*);
typedefBOOL (*CustomFreeFunc)(LPVOID, SIZE_T, DWORD, void*);
typedefHCUSTOMMODULE (*CustomLoadLibraryFunc)(LPCSTR, void*);
typedefFARPROC (*CustomGetProcAddressFunc)(HCUSTOMMODULE, LPCSTR, void*);
typedefvoid (*CustomFreeLibraryFunc)(HCUSTOMMODULE, void*);
/** * Load EXE/DLL from memory location with the given size. * * All dependencies are resolved using default LoadLibrary/GetProcAddress * calls through the Windows API. */HMEMORYMODULEMemoryLoadLibrary(constvoid*, size_t);
/** * Load EXE/DLL from memory location with the given size using custom dependency * resolvers. * * Dependencies will be resolved using passed callback methods. */HMEMORYMODULEMemoryLoadLibraryEx(constvoid*, size_t,
CustomAllocFunc,
CustomFreeFunc,
CustomLoadLibraryFunc,
CustomGetProcAddressFunc,
CustomFreeLibraryFunc,
void*);
/** * Get address of exported method. Supports loading both by name and by * ordinal value. */FARPROCMemoryGetProcAddress(HMEMORYMODULE, LPCSTR);
/** * Free previously loaded EXE/DLL. */voidMemoryFreeLibrary(HMEMORYMODULE);
/** * Execute entry point (EXE only). The entry point can only be executed * if the EXE has been loaded to the correct base address or it could * be relocated (i.e. relocation information have not been stripped by * the linker). * * Important: calling this function will not return, i.e. once the loaded * EXE finished running, the process will terminate. * * Returns a negative value if the entry point could not be executed. */intMemoryCallEntryPoint(HMEMORYMODULE);
/** * Find the location of a resource with the specified type and name. */HMEMORYRSRCMemoryFindResource(HMEMORYMODULE, LPCTSTR, LPCTSTR);
/** * Find the location of a resource with the specified type, name and language. */HMEMORYRSRCMemoryFindResourceEx(HMEMORYMODULE, LPCTSTR, LPCTSTR, WORD);
/** * Get the size of the resource in bytes. */DWORDMemorySizeofResource(HMEMORYMODULE, HMEMORYRSRC);
/** * Get a pointer to the contents of the resource. */LPVOIDMemoryLoadResource(HMEMORYMODULE, HMEMORYRSRC);
/** * Load a string resource. */intMemoryLoadString(HMEMORYMODULE, UINT, LPTSTR, int);
/** * Load a string resource with a given language. */intMemoryLoadStringEx(HMEMORYMODULE, UINT, LPTSTR, int, WORD);
/*** Default implementation of CustomAllocFunc that calls VirtualAlloc* internally to allocate memory for a library** This is the default as used by MemoryLoadLibrary.*/LPVOIDMemoryDefaultAlloc(LPVOID, SIZE_T, DWORD, DWORD, void*);
/*** Default implementation of CustomFreeFunc that calls VirtualFree* internally to free the memory used by a library** This is the default as used by MemoryLoadLibrary.*/BOOLMemoryDefaultFree(LPVOID, SIZE_T, DWORD, void*);
/** * Default implementation of CustomLoadLibraryFunc that calls LoadLibraryA * internally to load an additional libary. * * This is the default as used by MemoryLoadLibrary. */HCUSTOMMODULEMemoryDefaultLoadLibrary(LPCSTR, void*);
/** * Default implementation of CustomGetProcAddressFunc that calls GetProcAddress * internally to get the address of an exported function. * * This is the default as used by MemoryLoadLibrary. */FARPROCMemoryDefaultGetProcAddress(HCUSTOMMODULE, LPCSTR, void*);
/** * Default implementation of CustomFreeLibraryFunc that calls FreeLibrary * internally to release an additional libary. * * This is the default as used by MemoryLoadLibrary. */voidMemoryDefaultFreeLibrary(HCUSTOMMODULE, void*);
#ifdef__cplusplus
}
#endif#endif// __MEMORY_MODULE_HEADERThat implements full TLS support. The reason why is that I need to load python's core dll file (3.14) from a void * pointer obtained from LockResource, however since Python 3.12 the Python Core Developers force __declspec(thread) in parts of their codebase so now when I go to load the dll it causes an access violation when it even attempts to call it's DllMain function.
I have a usecase forthese apis as drop in replacement for :
That implements full TLS support. The reason why is that I need to load python's core dll file (3.14) from a
void *pointer obtained fromLockResource, however since Python 3.12 the Python Core Developers force__declspec(thread)in parts of their codebase so now when I go to load the dll it causes an access violation when it even attempts to call it'sDllMainfunction.