From: Thomas H. <th...@us...> - 2005-04-22 09:10:25
|
Update of /cvsroot/py2exe/py2exe/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21338 Modified Files: start.c Log Message: Try to import zlib either as resource from the exe, or as blob from the start of the library.zip file. Index: start.c =================================================================== RCS file: /cvsroot/py2exe/py2exe/source/start.c,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** start.c 22 Apr 2005 06:39:34 -0000 1.23 --- start.c 22 Apr 2005 09:10:00 -0000 1.24 *************** *** 34,38 **** */ #include "Python-dynload.h" ! #include <stdio.h> #include <windows.h> --- 34,38 ---- */ #include "Python-dynload.h" ! #include "../hacks/memimp/MemoryModule.h" #include <stdio.h> #include <windows.h> *************** *** 63,66 **** --- 63,79 ---- struct scriptinfo *p_script_info; + + static int dprintf(char *fmt, ...) + { + char Buffer[4096]; + va_list marker; + int result; + + va_start(marker, fmt); + result = vsprintf(Buffer, fmt, marker); + OutputDebugString(Buffer); + return result; + } + static BOOL _LocateScript(HMODULE hmod) { *************** *** 124,135 **** nSizeLow = GetFileSize(hFile, &nSizeHigh); hFileMapping = CreateFileMapping(hFile, ! NULL, PAGE_READONLY, 0, 0, NULL); CloseHandle(hFile); if (hFileMapping == INVALID_HANDLE_VALUE) return NULL; ! data = MapViewOfFile(hFileMapping, ! FILE_MAP_READ, 0, 0, 0); CloseHandle(hFileMapping); --- 137,148 ---- nSizeLow = GetFileSize(hFile, &nSizeHigh); hFileMapping = CreateFileMapping(hFile, ! NULL, PAGE_READONLY, 0, 0, NULL); CloseHandle(hFile); if (hFileMapping == INVALID_HANDLE_VALUE) return NULL; ! data = MapViewOfFile(hFileMapping, ! FILE_MAP_READ, 0, 0, 0); CloseHandle(hFileMapping); *************** *** 143,146 **** --- 156,160 ---- HRSRC hrsrc; char *pBaseAddress; + int size; // Try to locate pythonxy.dll as resource in the exe *************** *** 152,181 **** return FALSE; } return TRUE; } // try to load pythonxy.dll as bytes at the start of the zipfile ! pBaseAddress = MapExistingFile(libfilename, NULL); if (pBaseAddress) { ! int res; if (0 == strncmp(pBaseAddress, "<pythondll>", 11)) res = _load_python(PYTHONDLL, pBaseAddress + 11 + sizeof(int)); UnmapViewOfFile(pBaseAddress); ! if (res) return TRUE; } // try to load pythonxy.dll from the file system { char buffer[_MAX_PATH + _MAX_FNAME + _MAX_EXT]; snprintf(buffer, sizeof(buffer), "%s\\%s", dirname, PYTHONDLL); - printf("*** LoadLibrary %s\n", buffer); if (!_load_python(buffer, NULL)) { SystemError(GetLastError(), "LoadLibrary(pythondll) failed"); return FALSE; } } return TRUE; } /* * returns an error code if initialization fails --- 166,242 ---- return FALSE; } + dprintf("Loaded pythondll as RESOURCE\n"); return TRUE; } // try to load pythonxy.dll as bytes at the start of the zipfile ! pBaseAddress = MapExistingFile(libfilename, &size); if (pBaseAddress) { ! int res = 0; if (0 == strncmp(pBaseAddress, "<pythondll>", 11)) res = _load_python(PYTHONDLL, pBaseAddress + 11 + sizeof(int)); UnmapViewOfFile(pBaseAddress); ! if (res) { ! dprintf("Loaded pythondll as <pythondll> from %s\n", libfilename); return TRUE; + } } + // try to load pythonxy.dll from the file system { char buffer[_MAX_PATH + _MAX_FNAME + _MAX_EXT]; snprintf(buffer, sizeof(buffer), "%s\\%s", dirname, PYTHONDLL); if (!_load_python(buffer, NULL)) { SystemError(GetLastError(), "LoadLibrary(pythondll) failed"); return FALSE; } + dprintf("Loaded pythondll from file %s\n", buffer); } return TRUE; } + void _Import_Zlib(char *pdata) + { + HMODULE hlib; + hlib = MemoryLoadLibrary("zlib.pyd", pdata, NULL, NULL); + if (hlib) { + void (*proc)(void); + proc = (void(*)(void))MemoryGetProcAddress(hlib, "initzlib"); + if (proc) + proc(); + } + } + + void _TryLoadZlib(HMODULE hmod) + { + char *pBaseAddress; + char *pdata; + HRSRC hrsrc; + + // Try to locate pythonxy.dll as resource in the exe + hrsrc = FindResource(hmod, MAKEINTRESOURCE(1), "ZLIB.PYD"); + if (hrsrc) { + HGLOBAL hglb = LoadResource(hmod, hrsrc); + if (hglb) { + _Import_Zlib(LockResource(hglb)); + } + return; + } + + // try to load zlib.pyd as bytes at the start of the zipfile + pdata = pBaseAddress = MapExistingFile(libfilename, NULL); + if (pBaseAddress) { + if (0 == strncmp(pBaseAddress, "<pythondll>", 11)) { + pdata += 11; + pdata += *(int *)pdata + sizeof(int); + } + if (0 == strncmp(pdata, "<zlib.pyd>", 10)) { + pdata += 10 + sizeof(int); + _Import_Zlib(pdata); + } + UnmapViewOfFile(pBaseAddress); + } + } + /* * returns an error code if initialization fails *************** *** 189,194 **** return 255; - printf("dirname '%s', zippath '%s'\n", dirname, p_script_info->zippath); - printf("SUCCESS _load_python(" PYTHONDLL ")\n"); { /* If the zip path has any path component, then build our Python --- 250,253 ---- *************** *** 290,293 **** --- 349,355 ---- } } + + _TryLoadZlib(hmod); + /* clean up the environment so that os.system and os.popen processes can run python the normal way */ |