imagehlp: MapAndLoad should do some useful stuff now.
This commit is contained in:
parent
3b87fe97df
commit
8ca3ca5a56
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue