imagehlp: MapAndLoad should do some useful stuff now.

This commit is contained in:
Eric Pouech 2006-12-01 21:56:31 +01:00 committed by Alexandre Julliard
parent 3b87fe97df
commit 8ca3ca5a56
1 changed files with 59 additions and 77 deletions

View File

@ -145,96 +145,76 @@ BOOL WINAPI ImageUnload(PLOADED_IMAGE pLoadedImage)
/*********************************************************************** /***********************************************************************
* MapAndLoad (IMAGEHLP.@) * MapAndLoad (IMAGEHLP.@)
*/ */
BOOL WINAPI MapAndLoad( BOOL WINAPI MapAndLoad(LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage,
LPSTR pszImageName, LPSTR pszDllPath, PLOADED_IMAGE pLoadedImage, BOOL bDotDll, BOOL bReadOnly)
BOOL bDotDll, BOOL bReadOnly)
{ {
CHAR szFileName[MAX_PATH]; CHAR szFileName[MAX_PATH];
HANDLE hFile = NULL; HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE hFileMapping = NULL; HANDLE hFileMapping = NULL;
HMODULE hModule = NULL; PVOID mapping = NULL;
PIMAGE_NT_HEADERS pNtHeader = NULL; PIMAGE_NT_HEADERS pNtHeader = NULL;
TRACE("(%s, %s, %p, %d, %d)\n", pszImageName, pszDllPath, pLoadedImage, TRACE("(%s, %s, %p, %d, %d)\n",
bDotDll, bReadOnly); pszImageName, pszDllPath, pLoadedImage, bDotDll, bReadOnly);
/* PathCombine(&szFileName, pszDllPath, pszImageName); */
/* PathRenameExtension(&szFileName, bDotDll?:"dll":"exe"); */
/* FIXME: Check if the file already loaded (use IMAGEHLP_pFirstLoadedImage) */ if (!SearchPathA(pszDllPath, pszImageName, bDotDll ? ".DLL" : ".EXE",
if(!(hFile = CreateFileA( sizeof(szFileName), szFileName, NULL))
szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
NULL, OPEN_EXISTING, 0, NULL)))
{ {
SetLastError(ERROR_FILE_NOT_FOUND); SetLastError(ERROR_FILE_NOT_FOUND);
goto Error; goto Error;
} }
if(!(hFileMapping = CreateFileMappingA( hFile = CreateFileA(szFileName, GENERIC_READ, 1, /* FIXME: FILE_SHARE_READ not defined */
hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL))) NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{ {
DWORD dwLastError = GetLastError(); WARN("CreateFile: Error = %d\n", GetLastError());
WARN("CreateFileMapping: Error = %d\n", dwLastError); goto Error;
SetLastError(dwLastError);
goto Error;
}
CloseHandle(hFile);
hFile = NULL;
if(!(hModule = (HMODULE) MapViewOfFile(
hFileMapping, FILE_MAP_READ, 0, 0, 0)))
{
DWORD dwLastError = GetLastError();
WARN("MapViewOfFile: Error = %d\n", dwLastError);
SetLastError(dwLastError);
goto Error;
} }
CloseHandle(hFileMapping); hFileMapping = CreateFileMappingA(hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL);
hFileMapping=NULL; if (!hFileMapping)
{
WARN("CreateFileMapping: Error = %d\n", GetLastError());
goto Error;
}
pLoadedImage = HeapAlloc(IMAGEHLP_hHeap, 0, sizeof(LOADED_IMAGE)); mapping = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
CloseHandle(hFileMapping);
if (!mapping)
{
WARN("MapViewOfFile: Error = %d\n", GetLastError());
goto Error;
}
pNtHeader = RtlImageNtHeader(hModule); pNtHeader = RtlImageNtHeader(mapping);
pLoadedImage->ModuleName = HeapAlloc(IMAGEHLP_hHeap, 0, strlen(pszDllPath)+1); /* FIXME: Correct? */ pLoadedImage->ModuleName = HeapAlloc(GetProcessHeap(), 0,
strcpy( pLoadedImage->ModuleName, pszDllPath ); strlen(szFileName) + 1);
pLoadedImage->hFile = hFile; if (pLoadedImage->ModuleName) strcpy(pLoadedImage->ModuleName, szFileName);
pLoadedImage->MappedAddress = (PUCHAR) hModule; pLoadedImage->hFile = hFile;
pLoadedImage->FileHeader = pNtHeader; pLoadedImage->MappedAddress = mapping;
pLoadedImage->Sections = (PIMAGE_SECTION_HEADER) pLoadedImage->FileHeader = pNtHeader;
((LPBYTE) &pNtHeader->OptionalHeader + pLoadedImage->Sections = (PIMAGE_SECTION_HEADER)
pNtHeader->FileHeader.SizeOfOptionalHeader); ((LPBYTE) &pNtHeader->OptionalHeader +
pLoadedImage->NumberOfSections = pNtHeader->FileHeader.SizeOfOptionalHeader);
pNtHeader->FileHeader.NumberOfSections; pLoadedImage->NumberOfSections = pNtHeader->FileHeader.NumberOfSections;
pLoadedImage->SizeOfImage = pLoadedImage->SizeOfImage = pNtHeader->OptionalHeader.SizeOfImage;
pNtHeader->OptionalHeader.SizeOfImage; pLoadedImage->Characteristics = pNtHeader->FileHeader.Characteristics;
pLoadedImage->Characteristics = pLoadedImage->LastRvaSection = pLoadedImage->Sections;
pNtHeader->FileHeader.Characteristics;
pLoadedImage->LastRvaSection = pLoadedImage->Sections;
pLoadedImage->fSystemImage = FALSE; /* FIXME */ pLoadedImage->fSystemImage = FALSE; /* FIXME */
pLoadedImage->fDOSImage = FALSE; /* FIXME */ pLoadedImage->fDOSImage = FALSE; /* FIXME */
/* FIXME: Make thread safe */ pLoadedImage->Links.Flink = &pLoadedImage->Links;
pLoadedImage->Links.Flink = NULL; pLoadedImage->Links.Blink = &pLoadedImage->Links;
pLoadedImage->Links.Blink = &IMAGEHLP_pLastLoadedImage->Links;
if(IMAGEHLP_pLastLoadedImage)
IMAGEHLP_pLastLoadedImage->Links.Flink = &pLoadedImage->Links;
IMAGEHLP_pLastLoadedImage = pLoadedImage;
if(!IMAGEHLP_pFirstLoadedImage)
IMAGEHLP_pFirstLoadedImage = pLoadedImage;
return TRUE; return TRUE;
Error: Error:
if(hModule) if (mapping) UnmapViewOfFile(mapping);
UnmapViewOfFile((PVOID) hModule); if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile);
if(hFileMapping) return FALSE;
CloseHandle(hFileMapping);
if(hFile)
CloseHandle(hFile);
return FALSE;
} }
/*********************************************************************** /***********************************************************************
@ -254,9 +234,11 @@ BOOL WINAPI SetImageConfigInformation(
/*********************************************************************** /***********************************************************************
* UnMapAndLoad (IMAGEHLP.@) * UnMapAndLoad (IMAGEHLP.@)
*/ */
BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE LoadedImage) BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE pLoadedImage)
{ {
FIXME("(%p): stub\n", LoadedImage); HeapFree(GetProcessHeap(), 0, pLoadedImage->ModuleName);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); /* FIXME: MSDN states that a new checksum is computed and stored into the file */
return FALSE; if (pLoadedImage->MappedAddress) UnmapViewOfFile(pLoadedImage->MappedAddress);
if (pLoadedImage->hFile != INVALID_HANDLE_VALUE) CloseHandle(pLoadedImage->hFile);
return TRUE;
} }