| /* |
| * IMAGEHLP library |
| * |
| * Copyright 1998 Patrik Stridvall |
| */ |
| |
| #include "winbase.h" |
| #include "winnt.h" |
| #include "winerror.h" |
| #include "wintypes.h" |
| #include "heap.h" |
| #include "debug.h" |
| #include "imagehlp.h" |
| |
| /*********************************************************************** |
| * Data |
| */ |
| |
| static PLOADED_IMAGE32 IMAGEHLP_pFirstLoadedImage32=NULL; |
| static PLOADED_IMAGE32 IMAGEHLP_pLastLoadedImage32=NULL; |
| |
| static LOADED_IMAGE32 IMAGEHLP_EmptyLoadedImage32 = { |
| NULL, /* ModuleName */ |
| 0xffffffff, /* hFile */ |
| NULL, /* MappedAddress */ |
| NULL, /* FileHeader */ |
| NULL, /* LastRvaSection */ |
| 0, /* NumberOfSections */ |
| NULL, /* Sections */ |
| 1, /* Characteristics */ |
| FALSE, /* fSystemImage */ |
| FALSE, /* fDOSImage */ |
| { &IMAGEHLP_EmptyLoadedImage32.Links, &IMAGEHLP_EmptyLoadedImage32.Links }, /* Links */ |
| 148, /* SizeOfImage; */ |
| }; |
| |
| /*********************************************************************** |
| * EnumerateLoadedModules32 (IMAGEHLP.4) |
| */ |
| BOOL32 WINAPI EnumerateLoadedModules32( |
| HANDLE32 hProcess, |
| PENUMLOADED_MODULES_CALLBACK32 EnumLoadedModulesCallback, |
| PVOID UserContext) |
| { |
| FIXME(imagehlp, "(0x%08x, %p, %p): stub\n", |
| hProcess, EnumLoadedModulesCallback, UserContext |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * GetTimestampForLoadedLibrary32 (IMAGEHLP.9) |
| */ |
| DWORD WINAPI GetTimestampForLoadedLibrary32(HMODULE32 Module) |
| { |
| FIXME(imagehlp, "(0x%08x): stub\n", Module); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return 0; |
| } |
| |
| /*********************************************************************** |
| * GetImageConfigInformation32 (IMAGEHLP.7) |
| */ |
| BOOL32 WINAPI GetImageConfigInformation32( |
| PLOADED_IMAGE32 LoadedImage, |
| PIMAGE_LOAD_CONFIG_DIRECTORY32 ImageConfigInformation) |
| { |
| FIXME(imagehlp, "(%p, %p): stub\n", |
| LoadedImage, ImageConfigInformation |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * GetImageUnusedHeaderBytes32 (IMAGEHLP.8) |
| */ |
| DWORD WINAPI GetImageUnusedHeaderBytes32( |
| PLOADED_IMAGE32 LoadedImage, |
| LPDWORD SizeUnusedHeaderBytes) |
| { |
| FIXME(imagehlp, "(%p, %p): stub\n", |
| LoadedImage, SizeUnusedHeaderBytes |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return 0; |
| } |
| |
| /*********************************************************************** |
| * ImageDirectoryEntryToData32 (IMAGEHLP.11) |
| */ |
| PVOID WINAPI ImageDirectoryEntryToData32( |
| PVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size) |
| { |
| FIXME(imagehlp, "(%p, %d, %d, %p): stub\n", |
| Base, MappedAsImage, DirectoryEntry, Size |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return NULL; |
| } |
| |
| /*********************************************************************** |
| * ImageLoad32 (IMAGEHLP.16) |
| */ |
| PLOADED_IMAGE32 WINAPI ImageLoad32(LPSTR DllName, LPSTR DllPath) |
| { |
| PLOADED_IMAGE32 pLoadedImage = |
| HeapAlloc(IMAGEHLP_hHeap32, 0, sizeof(LOADED_IMAGE32)); |
| return pLoadedImage; |
| } |
| |
| /*********************************************************************** |
| * ImageNtHeader32 (IMAGEHLP.17) |
| */ |
| PIMAGE_NT_HEADERS32 WINAPI ImageNtHeader32(PVOID Base) |
| { |
| return (PIMAGE_NT_HEADERS32) |
| ((LPBYTE) Base + ((PIMAGE_DOS_HEADER32) Base)->e_lfanew); |
| } |
| |
| /*********************************************************************** |
| * ImageRvaToSection32 (IMAGEHLP.19) |
| */ |
| PIMAGE_SECTION_HEADER32 WINAPI ImageRvaToSection32( |
| PIMAGE_NT_HEADERS32 NtHeaders, PVOID Base, ULONG Rva) |
| { |
| FIXME(imagehlp, "(%p, %p, %ld): stub\n", NtHeaders, Base, Rva); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return NULL; |
| } |
| |
| /*********************************************************************** |
| * ImageRvaToVa32 (IMAGEHLP.20) |
| */ |
| PVOID WINAPI ImageRvaToVa32( |
| PIMAGE_NT_HEADERS32 NtHeaders, PVOID Base, ULONG Rva, |
| PIMAGE_SECTION_HEADER32 *LastRvaSection) |
| { |
| FIXME(imagehlp, "(%p, %p, %ld, %p): stub\n", |
| NtHeaders, Base, Rva, LastRvaSection |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return NULL; |
| } |
| |
| /*********************************************************************** |
| * ImageUnload32 (IMAGEHLP.21) |
| */ |
| BOOL32 WINAPI ImageUnload32(PLOADED_IMAGE32 pLoadedImage) |
| { |
| LIST_ENTRY32 *pCurrent, *pFind; |
| if(!IMAGEHLP_pFirstLoadedImage32 || !pLoadedImage) |
| { |
| /* No image loaded or null pointer */ |
| SetLastError(ERROR_INVALID_PARAMETER); |
| return FALSE; |
| } |
| |
| pFind=&pLoadedImage->Links; |
| pCurrent=&IMAGEHLP_pFirstLoadedImage32->Links; |
| while((pCurrent != pFind) && |
| (pCurrent != NULL)) |
| pCurrent = pCurrent->Flink; |
| if(!pCurrent) |
| { |
| /* Not found */ |
| SetLastError(ERROR_INVALID_PARAMETER); |
| return FALSE; |
| } |
| |
| if(pCurrent->Blink) |
| pCurrent->Blink->Flink = pCurrent->Flink; |
| else |
| IMAGEHLP_pFirstLoadedImage32 = pCurrent->Flink?CONTAINING_RECORD( |
| pCurrent->Flink, LOADED_IMAGE32, Links):NULL; |
| |
| if(pCurrent->Flink) |
| pCurrent->Flink->Blink = pCurrent->Blink; |
| else |
| IMAGEHLP_pLastLoadedImage32 = pCurrent->Blink?CONTAINING_RECORD( |
| pCurrent->Blink, LOADED_IMAGE32, Links):NULL; |
| |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * MapAndLoad32 (IMAGEHLP.25) |
| */ |
| BOOL32 WINAPI MapAndLoad32( |
| LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE32 pLoadedImage, |
| BOOL32 bDotDll, BOOL32 bReadOnly) |
| { |
| CHAR szFileName[MAX_PATH]; |
| HANDLE32 hFile = (HANDLE32) NULL; |
| HANDLE32 hFileMapping = (HANDLE32) NULL; |
| HMODULE32 hModule = (HMODULE32) NULL; |
| PIMAGE_NT_HEADERS32 pNtHeader = NULL; |
| |
| /* PathCombine(&szFileName, pszDllPath, pszImageName); */ |
| /* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */ |
| |
| /* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage32) */ |
| if(!(hFile = CreateFile32A( |
| szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */ |
| NULL, OPEN_EXISTING, 0, (HANDLE32) NULL))) |
| { |
| SetLastError(ERROR_FILE_NOT_FOUND); |
| goto Error; |
| } |
| |
| if(!(hFileMapping = CreateFileMapping32A( |
| hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL))) |
| { |
| DWORD dwLastError = GetLastError(); |
| WARN(imagehlp, "CreateFileMapping: Error = %ld\n", dwLastError); |
| SetLastError(dwLastError); |
| goto Error; |
| } |
| CloseHandle(hFile); |
| hFile = (HANDLE32) NULL; |
| |
| if(!(hModule = (HMODULE32) MapViewOfFile( |
| hFileMapping, FILE_MAP_READ, 0, 0, 0))) |
| { |
| DWORD dwLastError = GetLastError(); |
| WARN(imagehlp, "MapViewOfFile: Error = %ld\n", dwLastError); |
| SetLastError(dwLastError); |
| goto Error; |
| } |
| |
| CloseHandle(hFileMapping); |
| hFileMapping=(HANDLE32) NULL; |
| |
| pLoadedImage = (PLOADED_IMAGE32) HeapAlloc( |
| IMAGEHLP_hHeap32, 0, sizeof(LOADED_IMAGE32) |
| ); |
| |
| pNtHeader = ImageNtHeader32((PVOID) hModule); |
| |
| pLoadedImage->ModuleName = |
| HEAP_strdupA(IMAGEHLP_hHeap32, 0, pszDllPath); /* FIXME: Correct? */ |
| pLoadedImage->hFile = hFile; |
| pLoadedImage->MappedAddress = (PUCHAR) hModule; |
| pLoadedImage->FileHeader = pNtHeader; |
| pLoadedImage->Sections = (PIMAGE_SECTION_HEADER32) |
| ((LPBYTE) &pNtHeader->OptionalHeader + |
| pNtHeader->FileHeader.SizeOfOptionalHeader); |
| pLoadedImage->NumberOfSections = |
| pNtHeader->FileHeader.NumberOfSections; |
| pLoadedImage->SizeOfImage = |
| pNtHeader->OptionalHeader.SizeOfImage; |
| pLoadedImage->Characteristics = |
| pNtHeader->FileHeader.Characteristics; |
| pLoadedImage->LastRvaSection = pLoadedImage->Sections; |
| |
| pLoadedImage->fSystemImage = FALSE; /* FIXME */ |
| pLoadedImage->fDOSImage = FALSE; /* FIXME */ |
| |
| /* FIXME: Make thread safe */ |
| pLoadedImage->Links.Flink = NULL; |
| pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage32->Links; |
| if(IMAGEHLP_pLastLoadedImage32) |
| IMAGEHLP_pLastLoadedImage32->Links.Flink = &pLoadedImage->Links; |
| IMAGEHLP_pLastLoadedImage32 = pLoadedImage; |
| if(!IMAGEHLP_pFirstLoadedImage32) |
| IMAGEHLP_pFirstLoadedImage32 = pLoadedImage; |
| |
| return TRUE; |
| |
| Error: |
| if(hModule) |
| UnmapViewOfFile((PVOID) hModule); |
| if(hFileMapping) |
| CloseHandle(hFileMapping); |
| if(hFile) |
| CloseHandle(hFile); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * SetImageConfigInformation32 (IMAGEHLP.34) |
| */ |
| BOOL32 WINAPI SetImageConfigInformation32( |
| PLOADED_IMAGE32 LoadedImage, |
| PIMAGE_LOAD_CONFIG_DIRECTORY32 ImageConfigInformation) |
| { |
| FIXME(imagehlp, "(%p, %p): stub\n", |
| LoadedImage, ImageConfigInformation |
| ); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * UnMapAndLoad32 (IMAGEHLP.58) |
| */ |
| BOOL32 WINAPI UnMapAndLoad32(PLOADED_IMAGE32 LoadedImage) |
| { |
| FIXME(imagehlp, "(%p): stub\n", LoadedImage); |
| SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| return FALSE; |
| } |
| |
| |