Started the implementation of IMAGEHLP.DLL.

diff --git a/dlls/imagehlp/.cvsignore b/dlls/imagehlp/.cvsignore
new file mode 100644
index 0000000..f3c7a7c
--- /dev/null
+++ b/dlls/imagehlp/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/dlls/imagehlp/Makefile.in b/dlls/imagehlp/Makefile.in
new file mode 100644
index 0000000..702647d
--- /dev/null
+++ b/dlls/imagehlp/Makefile.in
@@ -0,0 +1,22 @@
+DEFS      = @DLLFLAGS@ -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = imagehlp
+
+C_SRCS = \
+	access.c \
+	debug.c \
+	imagehlp_main.c \
+	integrity.c \
+	internal.c \
+	modify.c \
+	symbol.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
+
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;
+}
+
+
diff --git a/dlls/imagehlp/debug.c b/dlls/imagehlp/debug.c
new file mode 100644
index 0000000..becf247
--- /dev/null
+++ b/dlls/imagehlp/debug.c
@@ -0,0 +1,101 @@
+/*
+ *	IMAGEHLP library
+ *
+ *	Copyright 1998	Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "winerror.h"
+#include "wintypes.h"
+#include "debug.h"
+#include "imagehlp.h"
+
+/***********************************************************************
+ *           FindDebugInfoFile32 (IMAGEHLP.5)
+ */
+HANDLE32 WINAPI FindDebugInfoFile32(
+  LPSTR FileName, LPSTR SymbolPath, LPSTR DebugFilePath)
+{
+  FIXME(imagehlp, "(%s, %s, %s): stub\n",
+    debugstr_a(FileName), debugstr_a(SymbolPath),
+    debugstr_a(DebugFilePath)
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return (HANDLE32) NULL;
+}
+
+/***********************************************************************
+ *           FindExecutableImage32 (IMAGEHLP.6)
+ */
+HANDLE32 WINAPI FindExecutableImage32(
+  LPSTR FileName, LPSTR SymbolPath, LPSTR ImageFilePath)
+{
+  FIXME(imagehlp, "(%s, %s, %s): stub\n",
+    debugstr_a(FileName), debugstr_a(SymbolPath),
+    debugstr_a(ImageFilePath)
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return (HANDLE32) NULL;
+}
+
+/***********************************************************************
+ *           MapDebugInformation32 (IMAGEHLP.26)
+ */
+PIMAGE_DEBUG_INFORMATION32 WINAPI MapDebugInformation32(
+  HANDLE32 FileHandle, LPSTR FileName,
+  LPSTR SymbolPath, DWORD ImageBase)
+{
+  FIXME(imagehlp, "(0x%08x, %s, %s, 0x%08lx): stub\n",
+    FileHandle, FileName, SymbolPath, ImageBase
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return NULL;
+}
+
+/***********************************************************************
+ *           StackWalk32 (IMAGEHLP.36)
+ */
+BOOL32 WINAPI StackWalk32(
+  DWORD MachineType, HANDLE32 hProcess, HANDLE32 hThread,
+  PSTACKFRAME32 StackFrame, PVOID ContextRecord,
+  PREAD_PROCESS_MEMORY_ROUTINE32 ReadMemoryRoutine,
+  PFUNCTION_TABLE_ACCESS_ROUTINE32 FunctionTableAccessRoutine,
+  PGET_MODULE_BASE_ROUTINE32 GetModuleBaseRoutine,
+  PTRANSLATE_ADDRESS_ROUTINE32 TranslateAddress)
+{
+  FIXME(imagehlp,
+    "(%ld, 0x%08x, 0x%08x, %p, %p, %p, %p, %p, %p): stub\n",
+      MachineType, hProcess, hThread, StackFrame, ContextRecord,
+      ReadMemoryRoutine, FunctionTableAccessRoutine,
+      GetModuleBaseRoutine, TranslateAddress
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           UnDecorateSymbolName32 (IMAGEHLP.57)
+ */
+DWORD WINAPI UnDecorateSymbolName32(
+  LPCSTR DecoratedName, LPSTR UnDecoratedName,
+  DWORD UndecoratedLength, DWORD Flags)
+{
+  FIXME(imagehlp, "(%s, %s, %ld, 0x%08lx): stub\n",
+    debugstr_a(DecoratedName), debugstr_a(UnDecoratedName),
+    UndecoratedLength, Flags
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return 0;
+}
+
+/***********************************************************************
+ *           UnmapDebugInformation32 (IMAGEHLP.59)
+ */
+
+BOOL32 WINAPI UnmapDebugInformation32(
+  PIMAGE_DEBUG_INFORMATION32 DebugInfo)
+{
+  FIXME(imagehlp, "(%p): stub\n", DebugInfo);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
diff --git a/dlls/imagehlp/imagehlp_main.c b/dlls/imagehlp/imagehlp_main.c
new file mode 100644
index 0000000..9e728ad
--- /dev/null
+++ b/dlls/imagehlp/imagehlp_main.c
@@ -0,0 +1,112 @@
+/*
+ *	IMAGEHLP library
+ *
+ *	Copyright 1998	Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "winerror.h"
+#include "wintypes.h"
+#include "debug.h"
+#include "imagehlp.h"
+
+/**********************************************************************/
+
+HANDLE32 IMAGEHLP_hHeap32 = (HANDLE32) NULL;
+
+static API_VERSION32 IMAGEHLP_ApiVersion = { 4, 0, 0, 5 };
+
+/***********************************************************************
+ *           IMAGEHLP_LibMain (IMAGEHLP.init)
+ */
+BOOL32 WINAPI IMAGEHLP_LibMain(
+  HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+  switch(fdwReason)
+    {
+    case DLL_PROCESS_ATTACH:
+      IMAGEHLP_hHeap32 = HeapCreate(0, 0x10000, 0);
+      break;
+    case DLL_PROCESS_DETACH:
+      HeapDestroy(IMAGEHLP_hHeap32);
+      IMAGEHLP_hHeap32 = (HANDLE32) NULL;
+      break;
+    case DLL_THREAD_ATTACH:
+      break;
+    case DLL_THREAD_DETACH:
+      break;
+    default:
+      break;
+    }
+  return TRUE;
+}
+
+/***********************************************************************
+ *           ImagehlpApiVersion32 (IMAGEHLP.22)
+ */
+PAPI_VERSION32 WINAPI ImagehlpApiVersion32()
+{
+  return &IMAGEHLP_ApiVersion;
+}
+
+/***********************************************************************
+ *           ImagehlpApiVersionEx32 (IMAGEHLP.23)
+ */
+PAPI_VERSION32 WINAPI ImagehlpApiVersionEx32(PAPI_VERSION32 AppVersion)
+{
+  if(!AppVersion)
+    return NULL;
+
+  AppVersion->MajorVersion = IMAGEHLP_ApiVersion.MajorVersion;
+  AppVersion->MinorVersion = IMAGEHLP_ApiVersion.MinorVersion;
+  AppVersion->Revision = IMAGEHLP_ApiVersion.Revision;
+  AppVersion->Reserved = IMAGEHLP_ApiVersion.Reserved;
+
+  return AppVersion;
+}
+
+/***********************************************************************
+ *           MakeSureDirectoryPathExists32 (IMAGEHLP.24)
+ */
+BOOL32 WINAPI MakeSureDirectoryPathExists32(LPCSTR DirPath)
+{
+  FIXME(imagehlp, "(%s): stub\n", debugstr_a(DirPath));
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           MarkImageAsRunFromSwap (IMAGEHLP.29)
+ * FIXME
+ *   No documentation available.
+ */
+
+/***********************************************************************
+ *           SearchTreeForFile32 (IMAGEHLP.33)
+ */
+BOOL32 WINAPI SearchTreeForFile32(
+  LPSTR RootPath, LPSTR InputPathName, LPSTR OutputPathBuffer)
+{
+  FIXME(imagehlp, "(%s, %s, %s): stub\n",
+    debugstr_a(RootPath), debugstr_a(InputPathName), 
+    debugstr_a(OutputPathBuffer)
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           TouchFileTimes32 (IMAGEHLP.56)
+ */
+BOOL32 WINAPI TouchFileTimes32(
+  HANDLE32 FileHandle, LPSYSTEMTIME lpSystemTime)
+{
+  FIXME(imagehlp, "(0x%08x, %p): stub\n",
+    FileHandle, lpSystemTime
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+
+
diff --git a/dlls/imagehlp/integrity.c b/dlls/imagehlp/integrity.c
new file mode 100644
index 0000000..9614da5
--- /dev/null
+++ b/dlls/imagehlp/integrity.c
@@ -0,0 +1,91 @@
+/*
+ *	IMAGEHLP library
+ *
+ *	Copyright 1998	Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "winerror.h"
+#include "wintypes.h"
+#include "debug.h"
+#include "imagehlp.h"
+
+/***********************************************************************
+ *           ImageAddCertificate32 (IMAGEHLP.10)
+ */
+
+BOOL32 WINAPI ImageAddCertificate32(
+  HANDLE32 FileHandle, PWIN_CERTIFICATE32 Certificate, PDWORD Index)
+{
+  FIXME(imagehlp, "(0x%08x, %p, %p): stub\n",
+    FileHandle, Certificate, Index
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           ImageEnumerateCertificates32 (IMAGEHLP.12)
+ */
+BOOL32 WINAPI ImageEnumerateCertificates32(
+  HANDLE32 FileHandle, WORD TypeFilter, PDWORD CertificateCount,
+  PDWORD Indices, DWORD IndexCount)
+{
+  FIXME(imagehlp, "(0x%08x, %hd, %p, %p, %ld): stub\n",
+    FileHandle, TypeFilter, CertificateCount, Indices, IndexCount
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           ImageGetCertificateData32 (IMAGEHLP.13)
+ */
+BOOL32 WINAPI ImageGetCertificateData32(
+  HANDLE32 FileHandle, DWORD CertificateIndex,
+  PWIN_CERTIFICATE32 Certificate, PDWORD RequiredLength)
+{
+  FIXME(imagehlp, "(0x%08x, %ld, %p, %p): stub\n",
+    FileHandle, CertificateIndex, Certificate, RequiredLength
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           ImageGetCertificateHeader32 (IMAGEHLP.14)
+ */
+BOOL32 WINAPI ImageGetCertificateHeader32(
+  HANDLE32 FileHandle, DWORD CertificateIndex,
+  PWIN_CERTIFICATE32 Certificateheader)
+{
+  FIXME(imagehlp, "(0x%08x, %ld, %p): stub\n",
+    FileHandle, CertificateIndex, Certificateheader
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           ImageGetDigestStream32 (IMAGEHLP.15)
+ */
+BOOL32 WINAPI ImageGetDigestStream32(
+  HANDLE32 FileHandle, DWORD DigestLevel,
+  DIGEST_FUNCTION32 DigestFunction, DIGEST_HANDLE32 DigestHandle)
+{
+  FIXME(imagehlp, "(%0x08x, %ld, %p, %p): stub\n",
+    FileHandle, DigestLevel, DigestFunction, DigestHandle
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           ImageRemoveCertificate32 (IMAGEHLP.18)
+ */
+BOOL32 WINAPI ImageRemoveCertificate32(HANDLE32 FileHandle, DWORD Index)
+{
+  FIXME(imagehlp, "(0x%08x, %ld): stub\n", FileHandle, Index);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
diff --git a/dlls/imagehlp/internal.c b/dlls/imagehlp/internal.c
new file mode 100644
index 0000000..3d780b2
--- /dev/null
+++ b/dlls/imagehlp/internal.c
@@ -0,0 +1,113 @@
+/*
+ *	IMAGEHLP library
+ *
+ *	Copyright 1998	Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "winerror.h"
+#include "wintypes.h"
+#include "debug.h"
+#include "imagehlp.h"
+
+/***********************************************************************
+ *           InitializeListHead32
+ */
+VOID InitializeListHead32(PLIST_ENTRY32 pListHead)
+{
+  pListHead->Flink = pListHead;
+  pListHead->Blink = pListHead;
+}
+
+/***********************************************************************
+ *           InsertHeadList32
+ */
+VOID InsertHeadList32(PLIST_ENTRY32 pListHead, PLIST_ENTRY32 pEntry)
+{
+  pEntry->Blink = pListHead;
+  pEntry->Flink = pListHead->Flink;
+  pListHead->Flink = pEntry;
+}
+
+/***********************************************************************
+ *           InsertTailList32
+ */
+VOID InsertTailList32(PLIST_ENTRY32 pListHead, PLIST_ENTRY32 pEntry)
+{
+  pEntry->Flink = pListHead;
+  pEntry->Blink = pListHead->Blink;
+  pListHead->Blink = pEntry;
+}
+
+/***********************************************************************
+ *           IsListEmpty32
+ */
+BOOLEAN IsListEmpty32(PLIST_ENTRY32 pListHead)
+{
+  return !pListHead;
+}
+
+/***********************************************************************
+ *           PopEntryList32
+ */
+PSINGLE_LIST_ENTRY32 PopEntryList32(PSINGLE_LIST_ENTRY32 pListHead)
+{
+  pListHead->Next = NULL;
+  return pListHead;
+}
+
+/***********************************************************************
+ *           PushEntryList32
+ */
+VOID PushEntryList32(
+  PSINGLE_LIST_ENTRY32 pListHead, PSINGLE_LIST_ENTRY32 pEntry)
+{
+  pEntry->Next=pListHead;
+}
+
+/***********************************************************************
+ *           RemoveEntryList32
+ */
+VOID RemoveEntryList32(PLIST_ENTRY32 pEntry)
+{
+  pEntry->Flink->Blink = pEntry->Blink;
+  pEntry->Blink->Flink = pEntry->Flink;
+  pEntry->Flink = NULL;
+  pEntry->Blink = NULL;
+}
+
+/***********************************************************************
+ *           RemoveHeadList32
+ */
+PLIST_ENTRY32 RemoveHeadList32(PLIST_ENTRY32 pListHead)
+{
+  PLIST_ENTRY32 p = pListHead->Flink;
+  
+  if(p != pListHead)
+    {
+      RemoveEntryList32(pListHead); 
+      return p;
+    }
+  else
+    {
+      pListHead->Flink = NULL;
+      pListHead->Blink = NULL;
+      return NULL;
+    }
+}
+
+/***********************************************************************
+ *           RemoveTailList32
+ */
+PLIST_ENTRY32 RemoveTailList32(PLIST_ENTRY32 pListHead)
+{
+  RemoveHeadList32(pListHead->Blink);
+  if(pListHead != pListHead->Blink)
+    return pListHead;
+  else
+    return NULL;
+}
+
+
+
+
diff --git a/dlls/imagehlp/modify.c b/dlls/imagehlp/modify.c
new file mode 100644
index 0000000..de67bab
--- /dev/null
+++ b/dlls/imagehlp/modify.c
@@ -0,0 +1,163 @@
+/*
+ *	IMAGEHLP library
+ *
+ *	Copyright 1998	Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "winerror.h"
+#include "wintypes.h"
+#include "debug.h"
+#include "imagehlp.h"
+
+/***********************************************************************
+ *           BindImage32 (IMAGEHLP.1)
+ */
+BOOL32 WINAPI BindImage32(
+  LPSTR ImageName, LPSTR DllPath, LPSTR SymbolPath)
+{
+  return BindImageEx32(0, ImageName, DllPath, SymbolPath, NULL);
+}
+
+/***********************************************************************
+ *           BindImageEx32 (IMAGEHLP.2)
+ */
+BOOL32 WINAPI BindImageEx32(
+  DWORD Flags, LPSTR ImageName, LPSTR DllPath, LPSTR SymbolPath,
+  PIMAGEHLP_STATUS_ROUTINE32 StatusRoutine)
+{
+  FIXME(imagehlp, "(%ld, %s, %s, %s, %p): stub\n", 
+    Flags, debugstr_a(ImageName), debugstr_a(DllPath),
+    debugstr_a(SymbolPath), StatusRoutine
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           CheckSumMappedFile32 (IMAGEHLP.3)
+ */
+PIMAGE_NT_HEADERS32 WINAPI CheckSumMappedFile32(
+  LPVOID BaseAddress, DWORD FileLength, 
+  LPDWORD HeaderSum, LPDWORD CheckSum)
+{
+  FIXME(imagehlp, "(%p, %ld, %p, %p): stub\n",
+    BaseAddress, FileLength, HeaderSum, CheckSum
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return NULL;
+}
+
+/***********************************************************************
+ *           MapFileAndCheckSum32A (IMAGEHLP.27)
+ */
+DWORD WINAPI MapFileAndCheckSum32A(
+  LPSTR Filename, LPDWORD HeaderSum, LPDWORD CheckSum)
+{
+  FIXME(imagehlp, "(%s, %p, %p): stub\n",
+    debugstr_a(Filename), HeaderSum, CheckSum
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return CHECKSUM_OPEN_FAILURE;
+}
+
+/***********************************************************************
+ *           MapFileAndCheckSum32W (IMAGEHLP.28)
+ */
+DWORD WINAPI MapFileAndCheckSum32W(
+  LPWSTR Filename, LPDWORD HeaderSum, LPDWORD CheckSum)
+{
+  FIXME(imagehlp, "(%s, %p, %p): stub\n",
+    debugstr_w(Filename), HeaderSum, CheckSum
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return CHECKSUM_OPEN_FAILURE;
+}
+
+/***********************************************************************
+ *           ReBaseImage32 (IMAGEHLP.30)
+ */
+BOOL32 WINAPI ReBaseImage32(
+  LPSTR CurrentImageName, LPSTR SymbolPath, BOOL32 fReBase,
+  BOOL32 fRebaseSysfileOk, BOOL32 fGoingDown, ULONG CheckImageSize,
+  ULONG *OldImageSize, ULONG *OldImageBase, ULONG *NewImageSize,
+  ULONG *NewImageBase, ULONG TimeStamp)
+{
+  FIXME(imagehlp,
+    "(%s, %s, %d, %d, %d, %ld, %p, %p, %p, %p, %ld): stub\n",
+      debugstr_a(CurrentImageName),debugstr_a(SymbolPath), fReBase, 
+      fRebaseSysfileOk, fGoingDown, CheckImageSize, OldImageSize, 
+      OldImageBase, NewImageSize, NewImageBase, TimeStamp
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           RemovePrivateCvSymbolic32 (IMAGEHLP.31)
+ */
+BOOL32 WINAPI RemovePrivateCvSymbolic32(
+  PCHAR DebugData, PCHAR *NewDebugData, ULONG *NewDebugSize)
+{
+  FIXME(imagehlp, "(%p, %p, %p): stub\n",
+    DebugData, NewDebugData, NewDebugSize
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           RemoveRelocations32 (IMAGEHLP.32)
+ */
+VOID WINAPI RemoveRelocations32(PCHAR ImageName)
+{
+  FIXME(imagehlp, "(%p): stub\n", ImageName);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+}
+
+/***********************************************************************
+ *           SplitSymbols32 (IMAGEHLP.35)
+ */
+BOOL32 WINAPI SplitSymbols32(
+  LPSTR ImageName, LPSTR SymbolsPath, 
+  LPSTR SymbolFilePath, DWORD Flags)
+{
+  FIXME(imagehlp, "(%s, %s, %s, %ld): stub\n",
+    debugstr_a(ImageName), debugstr_a(SymbolsPath),
+    debugstr_a(SymbolFilePath), Flags
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           UpdateDebugInfoFile32 (IMAGEHLP.60)
+ */
+BOOL32 WINAPI UpdateDebugInfoFile32(
+  LPSTR ImageFileName, LPSTR SymbolPath,
+  LPSTR DebugFilePath, PIMAGE_NT_HEADERS32 NtHeaders)
+{
+  FIXME(imagehlp, "(%s, %s, %s, %p): stub\n",
+    debugstr_a(ImageFileName), debugstr_a(SymbolPath),
+    debugstr_a(DebugFilePath), NtHeaders
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           UpdateDebugInfoFileEx32 (IMAGEHLP.?)
+ * FIXME
+ *   Function has no ordinal.
+ */
+BOOL32 WINAPI UpdateDebugInfoFileEx32(
+  LPSTR ImageFileName, LPSTR SymbolPath, LPSTR DebugFilePath,
+  PIMAGE_NT_HEADERS32 NtHeaders, DWORD OldChecksum)
+{
+  FIXME(imagehlp, "(%s, %s, %s, %p, %ld): stub\n",
+    debugstr_a(ImageFileName), debugstr_a(SymbolPath),
+    debugstr_a(DebugFilePath), NtHeaders, OldChecksum
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
diff --git a/dlls/imagehlp/symbol.c b/dlls/imagehlp/symbol.c
new file mode 100644
index 0000000..4ff3512
--- /dev/null
+++ b/dlls/imagehlp/symbol.c
@@ -0,0 +1,244 @@
+/*
+ *	IMAGEHLP library
+ *
+ *	Copyright 1998	Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "winerror.h"
+#include "wintypes.h"
+#include "debug.h"
+#include "imagehlp.h"
+
+/***********************************************************************
+ *           SymCleanup32 (IMAGEHLP.37)
+ */
+BOOL32 WINAPI SymCleanup32(HANDLE32 hProcess)
+{
+  FIXME(imagehlp, "(0x%08x): stub\n", hProcess);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymEnumerateModules32 (IMAGEHLP.38)
+ */
+
+BOOL32 WINAPI SymEnumerateModules32(
+  HANDLE32 hProcess, PSYM_ENUMMODULES_CALLBACK32 EnumModulesCallback,
+  PVOID UserContext)
+{
+  FIXME(imagehlp, "(0x%08x, %p, %p): stub\n",
+    hProcess, EnumModulesCallback, UserContext
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymEnumerateSymbols32 (IMAGEHLP.39)
+ */
+BOOL32 WINAPI SymEnumerateSymbols32(
+  HANDLE32 hProcess, DWORD BaseOfDll,
+  PSYM_ENUMSYMBOLS_CALLBACK32 EnumSymbolsCallback, PVOID UserContext)
+{
+  FIXME(imagehlp, "(0x%08x, %p, %p): stub\n",
+    hProcess, EnumSymbolsCallback, UserContext
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymFunctionTableAccess32 (IMAGEHLP.40)
+ */
+PVOID WINAPI SymFunctionTableAccess32(HANDLE32 hProcess, DWORD AddrBase)
+{
+  FIXME(imagehlp, "(0x%08x, 0x%08lx): stub\n", hProcess, AddrBase);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymGetModuleBase32 (IMAGEHLP.41)
+ */
+DWORD WINAPI SymGetModuleBase32(HANDLE32 hProcess, DWORD dwAddr)
+{
+  FIXME(imagehlp, "(0x%08x, 0x%08lx): stub\n", hProcess, dwAddr);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return 0;
+}
+
+/***********************************************************************
+ *           SymGetModuleInfo32 (IMAGEHLP.42)
+ */
+BOOL32 WINAPI SymGetModuleInfo32(
+  HANDLE32 hProcess, DWORD dwAddr,
+  PIMAGEHLP_MODULE32 ModuleInfo)
+{
+  FIXME(imagehlp, "(0x%08x, 0x%08lx, %p): stub\n",
+    hProcess, dwAddr, ModuleInfo
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymGetOptions32 (IMAGEHLP.43)
+ */
+DWORD WINAPI SymGetOptions32()
+{
+  FIXME(imagehlp, "(): stub\n");
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return 0;
+}
+
+/***********************************************************************
+ *           SymGetSearchPath32 (IMAGEHLP.44)
+ */
+BOOL32 WINAPI SymGetSearchPath32(
+  HANDLE32 hProcess, LPSTR szSearchPath, DWORD SearchPathLength)
+{
+  FIXME(imagehlp, "(0x%08x, %s, %ld): stub\n",
+    hProcess, debugstr_an(szSearchPath,SearchPathLength), SearchPathLength
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymGetSymFromAddr32 (IMAGEHLP.45)
+ */
+BOOL32 WINAPI SymGetSymFromAddr32(
+  HANDLE32 hProcess, DWORD dwAddr, 
+  PDWORD pdwDisplacement, PIMAGEHLP_SYMBOL32 Symbol)
+{
+  FIXME(imagehlp, "(0x%08x, 0x%08lx, %p, %p): stub\n",
+    hProcess, dwAddr, pdwDisplacement, Symbol
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymGetSymFromName32 (IMAGEHLP.46)
+ */
+BOOL32 WINAPI SymGetSymFromName32(
+  HANDLE32 hProcess, LPSTR Name, PIMAGEHLP_SYMBOL32 Symbol)
+{
+  FIXME(imagehlp, "(0x%08x, %s, %p): stub\n", hProcess, Name, Symbol);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymGetSymNext32 (IMAGEHLP.47)
+ */
+BOOL32 WINAPI SymGetSymNext32(
+  HANDLE32 hProcess, PIMAGEHLP_SYMBOL32 Symbol)
+{
+  FIXME(imagehlp, "(0x%08x, %p): stub\n", hProcess, Symbol);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymGetSymPrev32 (IMAGEHLP.48)
+ */
+
+BOOL32 WINAPI SymGetSymPrev32(
+  HANDLE32 hProcess, PIMAGEHLP_SYMBOL32 Symbol)
+{
+  FIXME(imagehlp, "(0x%08x, %p): stub\n", hProcess, Symbol);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymInitialize32 (IMAGEHLP.49)
+ */
+BOOL32 WINAPI SymInitialize32(
+  HANDLE32 hProcess, LPSTR UserSearchPath, BOOL32 fInvadeProcess)
+{
+  FIXME(imagehlp, "(0x%08x, %s, %d): stub\n",
+    hProcess, debugstr_a(UserSearchPath), fInvadeProcess
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymLoadModule32 (IMAGEHLP.50)
+ */
+
+BOOL32 WINAPI SymLoadModule32(
+  HANDLE32 hProcess, HANDLE32 hFile, LPSTR ImageName, LPSTR ModuleName,
+  DWORD BaseOfDll, DWORD SizeOfDll)
+{
+  FIXME(imagehlp, "(0x%08x, 0x%08x, %s, %s, %ld, %ld): stub\n",
+    hProcess, hFile, debugstr_a(ImageName), debugstr_a(ModuleName),
+    BaseOfDll, SizeOfDll
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymRegisterCallback32 (IMAGEHLP.51)
+ */
+BOOL32 WINAPI SymRegisterCallback32(
+  HANDLE32 hProcess, PSYMBOL_REGISTERED_CALLBACK32 CallbackFunction,
+  PVOID UserContext)
+{
+  FIXME(imagehlp, "(0x%08x, %p, %p): stub\n",
+    hProcess, CallbackFunction, UserContext
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymSetOptions32 (IMAGEHLP.52)
+ */
+DWORD WINAPI SymSetOptions32(DWORD SymOptions)
+{
+  FIXME(imagehlp, "(%lx): stub\n", SymOptions);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return 0;
+}
+
+/***********************************************************************
+ *           SymSetSearchPath32 (IMAGEHLP.53)
+ */
+BOOL32 WINAPI SymSetSearchPath32(HANDLE32 hProcess, LPSTR szSearchPath)
+{
+  FIXME(imagehlp, "(0x%08x, %s): stub\n",
+    hProcess, debugstr_a(szSearchPath)
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymUnDName32 (IMAGEHLP.54)
+ */
+BOOL32 WINAPI SymUnDName32(
+  PIMAGEHLP_SYMBOL32 sym, LPSTR UnDecName, DWORD UnDecNameLength)
+{
+  FIXME(imagehlp, "(%p, %s, %ld): stub\n",
+    sym, UnDecName, UnDecNameLength
+  );
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}
+
+/***********************************************************************
+ *           SymUnloadModule32 (IMAGEHLP.55)
+ */
+BOOL32 WINAPI SymUnloadModule32(
+  HANDLE32 hProcess, DWORD BaseOfDll)
+{
+  FIXME(imagehlp, "(0x%08x, 0x%08lx): stub\n", hProcess, BaseOfDll);
+  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+  return FALSE;
+}