static HCUSTOMMODULE _LoadLibrary(LPCSTR filename, void *userdata) { HCUSTOMMODULE result; LIST *lib; dprintf("_LoadLibrary(%s, %p)\n", filename, userdata); PUSH(); lib = _FindMemoryModule(filename, NULL); if (lib) { lib->refcount += 1; POP(); dprintf("_LoadLibrary(%s, %p) -> %s[%d]\n\n", filename, userdata, lib->name, lib->refcount); return lib->module; } if (userdata) { PyObject *findproc = (PyObject *)userdata; // Since we are using the Py_LIMITED_API with dynamic loading // we would have to implement PyObject_CallFunction() ourselves, // which would be a paint since there is no PyObject_VaCallFunction. // // So we implement a special CallFindproc function // which encapsulates the dance we have to do. // PyObject *res = PyObject_CallFunction(findproc, "s", filename); PyObject *res = CallFindproc(findproc, filename); if (res && PyBytes_AsString(res)) { result = MemoryLoadLibraryEx(PyBytes_AsString(res), _LoadLibrary, _GetProcAddress, _FreeLibrary, userdata); Py_DECREF(res); if (result) { lib = _AddMemoryModule(filename, result); POP(); dprintf("_LoadLibrary(%s, %p) -> %p %s[%d]\n\n", filename, userdata, lib->module, lib->name, lib->refcount); return lib->module; } else { dprintf("_LoadLibrary(%s, %p) failed with error %d\n", filename, userdata, GetLastError()); } } else { PyErr_Clear(); } } SetLastError(0); result = (HCUSTOMMODULE)LoadLibraryA(filename); POP(); dprintf("LoadLibraryA(%s) -> %p\n\n", filename, result); return result; }
HMODULE MyLoadLibrary(LPCSTR name, void *bytes, void *userdata) { if (userdata) { HCUSTOMMODULE mod = _LoadLibrary(name, userdata); if (mod) return mod; } else if (bytes) { HCUSTOMMODULE mod = MemoryLoadLibraryEx(bytes, _LoadLibrary, _GetProcAddress, _FreeLibrary, userdata); if (mod) { LIST *lib = _AddMemoryModule(name, mod); return lib->module; } } return LoadLibrary(name); }
static HCUSTOMMODULE _LoadLibrary(LPCSTR filename, void *userdata) { HCUSTOMMODULE result; LIST *lib; dprintf("_LoadLibrary(%s, %p)\n", filename, userdata); PUSH(); lib = _FindMemoryModule(filename, NULL); if (lib) { lib->refcount += 1; POP(); dprintf("_LoadLibrary(%s, %p) -> %s[%d]\n\n", filename, userdata, lib->name, lib->refcount); return lib->module; } if (userdata) { PyObject *findproc = (PyObject *)userdata; PyObject *res = PyObject_CallFunction(findproc, "s", filename); if (res && PyBytes_AsString(res)) { result = MemoryLoadLibraryEx(PyBytes_AsString(res), _LoadLibrary, _GetProcAddress, _FreeLibrary, userdata); Py_DECREF(res); if (result) { lib = _AddMemoryModule(filename, result); POP(); dprintf("_LoadLibrary(%s, %p) -> %s[%d]\n\n", filename, userdata, lib->name, lib->refcount); return lib->module; } else { dprintf("_LoadLibrary(%s, %p) failed with error %d\n", filename, userdata, GetLastError()); } } else { PyErr_Clear(); } } result = (HCUSTOMMODULE)LoadLibraryA(filename); POP(); dprintf("LoadLibraryA(%s) -> %p\n\n", filename, result); return result; }
HMEMORYMODULE MemoryLoadLibrary(const void *data, size_t size) { return MemoryLoadLibraryEx(data, size, MemoryDefaultLoadLibrary, MemoryDefaultGetProcAddress, MemoryDefaultFreeLibrary, NULL); }
HMEMORYMODULE MemoryLoadLibrary(const void *data) { return MemoryLoadLibraryEx(data, _LoadLibrary, _GetProcAddress, _FreeLibrary, NULL); }