Started the implementation of IMAGEHLP.DLL.
diff --git a/dlls/imagehlp/access.c b/dlls/imagehlp/access.c
new file mode 100644
index 0000000..d9c4064
--- /dev/null
+++ b/dlls/imagehlp/access.c
@@ -0,0 +1,306 @@
+/*
+ * IMAGEHLP library
+ *
+ * Copyright 1998 Patrik Stridvall
+ */
+
+#include "windows.h"
+#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;
+}
+
+