ReactOS  0.4.14-dev-297-g23e575c
access.c
Go to the documentation of this file.
1 /*
2  * IMAGEHLP library
3  *
4  * Copyright 1998 Patrik Stridvall
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include <stdarg.h>
22 #include <string.h>
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winnt.h"
26 #include "winternl.h"
27 #include "winerror.h"
28 #include "wine/debug.h"
29 #include "imagehlp.h"
30 
32 
33 /***********************************************************************
34  * Data
35  */
37 
38 
39 /***********************************************************************
40  * GetImageConfigInformation (IMAGEHLP.@)
41  */
43  PLOADED_IMAGE LoadedImage,
44  PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
45 {
46  FIXME("(%p, %p): stub\n",
47  LoadedImage, ImageConfigInformation
48  );
50  return FALSE;
51 }
52 
53 /***********************************************************************
54  * GetImageUnusedHeaderBytes (IMAGEHLP.@)
55  */
57  PLOADED_IMAGE LoadedImage,
58  LPDWORD SizeUnusedHeaderBytes)
59 {
60  FIXME("(%p, %p): stub\n",
61  LoadedImage, SizeUnusedHeaderBytes
62  );
64  return 0;
65 }
66 
67 /***********************************************************************
68  * ImageLoad (IMAGEHLP.@)
69  */
71 {
73 
74  TRACE("(%s, %s)\n", dll_name, dll_path);
75 
76  image = HeapAlloc(GetProcessHeap(), 0, sizeof(*image));
77  if (!image) return NULL;
78 
79  if (!MapAndLoad(dll_name, dll_path, image, TRUE, TRUE))
80  {
82  return NULL;
83  }
84 
85  image->Links.Flink = image_list.Flink;
86  image->Links.Blink = &image_list;
87  image_list.Flink->Blink = &image->Links;
88  image_list.Flink = &image->Links;
89 
90  return image;
91 }
92 
93 /***********************************************************************
94  * ImageUnload (IMAGEHLP.@)
95  */
97 {
98  LIST_ENTRY *entry, *mark;
100 
101  TRACE("(%p)\n", loaded_image);
102 
103  /* FIXME: do we really need to check this? */
104  mark = &image_list;
105  for (entry = mark->Flink; entry != mark; entry = entry->Flink)
106  {
108  if (image == loaded_image)
109  break;
110  }
111 
112  if (entry == mark)
113  {
114  /* Not found */
116  return FALSE;
117  }
118 
119  entry->Blink->Flink = entry->Flink;
120  entry->Flink->Blink = entry->Blink;
121 
122  UnMapAndLoad(loaded_image);
123  HeapFree(GetProcessHeap(), 0, loaded_image);
124 
125  return TRUE;
126 }
127 
128 /***********************************************************************
129  * MapAndLoad (IMAGEHLP.@)
130  */
132  BOOL bDotDll, BOOL bReadOnly)
133 {
134  CHAR szFileName[MAX_PATH];
136  HANDLE hFileMapping = NULL;
137  PVOID mapping = NULL;
138  PIMAGE_NT_HEADERS pNtHeader = NULL;
139 
140  TRACE("(%s, %s, %p, %d, %d)\n",
141  pszImageName, pszDllPath, pLoadedImage, bDotDll, bReadOnly);
142 
143  if (!SearchPathA(pszDllPath, pszImageName, bDotDll ? ".DLL" : ".EXE",
144  sizeof(szFileName), szFileName, NULL))
145  {
147  goto Error;
148  }
149 
150  hFile = CreateFileA(szFileName,
151  GENERIC_READ | (bReadOnly ? 0 : GENERIC_WRITE),
153  NULL, OPEN_EXISTING, 0, NULL);
155  {
156  WARN("CreateFile: Error = %d\n", GetLastError());
157  goto Error;
158  }
159 
160  hFileMapping = CreateFileMappingA(hFile, NULL,
161  (bReadOnly ? PAGE_READONLY : PAGE_READWRITE) | SEC_COMMIT,
162  0, 0, NULL);
163  if (!hFileMapping)
164  {
165  WARN("CreateFileMapping: Error = %d\n", GetLastError());
166  goto Error;
167  }
168 
169  mapping = MapViewOfFile(hFileMapping, bReadOnly ? FILE_MAP_READ : FILE_MAP_WRITE, 0, 0, 0);
170  CloseHandle(hFileMapping);
171  if (!mapping)
172  {
173  WARN("MapViewOfFile: Error = %d\n", GetLastError());
174  goto Error;
175  }
176 
177  if (!(pNtHeader = RtlImageNtHeader(mapping)))
178  {
179  WARN("Not an NT header\n");
181  goto Error;
182  }
183 
184  pLoadedImage->ModuleName = HeapAlloc(GetProcessHeap(), 0,
185  strlen(szFileName) + 1);
186  if (pLoadedImage->ModuleName) strcpy(pLoadedImage->ModuleName, szFileName);
187  pLoadedImage->hFile = hFile;
188  pLoadedImage->MappedAddress = mapping;
189  pLoadedImage->FileHeader = pNtHeader;
190  pLoadedImage->Sections = (PIMAGE_SECTION_HEADER)
191  ((LPBYTE) &pNtHeader->OptionalHeader +
192  pNtHeader->FileHeader.SizeOfOptionalHeader);
193  pLoadedImage->NumberOfSections = pNtHeader->FileHeader.NumberOfSections;
194  pLoadedImage->SizeOfImage = GetFileSize(hFile, NULL);
195  pLoadedImage->Characteristics = pNtHeader->FileHeader.Characteristics;
196  pLoadedImage->LastRvaSection = pLoadedImage->Sections;
197 
198  pLoadedImage->fSystemImage = FALSE; /* FIXME */
199  pLoadedImage->fDOSImage = FALSE; /* FIXME */
200 
201  pLoadedImage->Links.Flink = &pLoadedImage->Links;
202  pLoadedImage->Links.Blink = &pLoadedImage->Links;
203 
204  return TRUE;
205 
206 Error:
208  return FALSE;
209 }
210 
211 /***********************************************************************
212  * SetImageConfigInformation (IMAGEHLP.@)
213  */
215  PLOADED_IMAGE LoadedImage,
216  PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
217 {
218  FIXME("(%p, %p): stub\n",
219  LoadedImage, ImageConfigInformation
220  );
222  return FALSE;
223 }
224 
225 /***********************************************************************
226  * UnMapAndLoad (IMAGEHLP.@)
227  */
229 {
230  HeapFree(GetProcessHeap(), 0, pLoadedImage->ModuleName);
231  /* FIXME: MSDN states that a new checksum is computed and stored into the file */
232  if (pLoadedImage->MappedAddress) UnmapViewOfFile(pLoadedImage->MappedAddress);
233  if (pLoadedImage->hFile != INVALID_HANDLE_VALUE) CloseHandle(pLoadedImage->hFile);
234  return TRUE;
235 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE pLoadedImage)
Definition: access.c:228
GLeglImageOES image
Definition: gl.h:2204
BOOLEAN fDOSImage
Definition: dbghelp.h:112
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
HANDLE hFile
Definition: dbghelp.h:100
BOOL WINAPI ImageUnload(PLOADED_IMAGE loaded_image)
Definition: access.c:96
#define MapViewOfFile
Definition: compat.h:402
PIMAGE_SECTION_HEADER Sections
Definition: dbghelp.h:109
LPCWSTR pszImageName
Definition: env.c:55
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
struct _LIST_ENTRY * Blink
Definition: typedefs.h:120
char CHAR
Definition: xmlstorage.h:175
#define WARN(fmt,...)
Definition: debug.h:111
BOOL WINAPI GetImageConfigInformation(PLOADED_IMAGE LoadedImage, PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
Definition: access.c:42
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
BOOL WINAPI MapAndLoad(PCSTR pszImageName, PCSTR pszDllPath, PLOADED_IMAGE pLoadedImage, BOOL bDotDll, BOOL bReadOnly)
Definition: access.c:131
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
#define FILE_SHARE_READ
Definition: compat.h:125
ULONG NumberOfSections
Definition: dbghelp.h:108
unsigned char * LPBYTE
Definition: typedefs.h:52
#define SEC_COMMIT
Definition: mmtypes.h:99
WINE_DEFAULT_DEBUG_CHANNEL(imagehlp)
DWORD WINAPI SearchPathA(IN LPCSTR lpPath OPTIONAL, IN LPCSTR lpFileName, IN LPCSTR lpExtension OPTIONAL, IN DWORD nBufferLength, OUT LPSTR lpBuffer, OUT LPSTR *lpFilePart OPTIONAL)
Definition: path.c:1122
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_WRITE
Definition: nt_native.h:90
#define FIXME(fmt,...)
Definition: debug.h:110
static LIST_ENTRY image_list
Definition: access.c:36
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI SetImageConfigInformation(PLOADED_IMAGE LoadedImage, PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
Definition: access.c:214
WORD SizeOfOptionalHeader
Definition: ntddk_ex.h:127
#define FILE_MAP_READ
Definition: compat.h:427
IMAGE_FILE_HEADER FileHeader
Definition: ntddk_ex.h:183
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define OPEN_EXISTING
Definition: compat.h:426
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define TRACE(s)
Definition: solgame.cpp:4
PUCHAR MappedAddress
Definition: dbghelp.h:101
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
PIMAGE_SECTION_HEADER LastRvaSection
Definition: dbghelp.h:107
#define FILE_MAP_WRITE
Definition: winbase.h:154
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:8
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLenum GLenum GLenum mapping
Definition: glext.h:9031
BOOL Error
Definition: chkdsk.c:66
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:481
#define SetLastError(x)
Definition: compat.h:409
DWORD WINAPI GetImageUnusedHeaderBytes(PLOADED_IMAGE LoadedImage, LPDWORD SizeUnusedHeaderBytes)
Definition: access.c:56
PLOADED_IMAGE WINAPI ImageLoad(PCSTR dll_name, PCSTR dll_path)
Definition: access.c:70
uint32_t entry
Definition: isohybrid.c:63
#define GENERIC_READ
Definition: compat.h:124
Definition: typedefs.h:117
_In_ HANDLE hFile
Definition: mswsock.h:90
ULONG Characteristics
Definition: dbghelp.h:110
struct _IMAGE_SECTION_HEADER * PIMAGE_SECTION_HEADER
PSTR ModuleName
Definition: dbghelp.h:99
#define PAGE_READONLY
Definition: compat.h:127
PIMAGE_NT_HEADERS32 FileHeader
Definition: dbghelp.h:105
#define RtlImageNtHeader
Definition: compat.h:457
uint32_t * LPDWORD
Definition: typedefs.h:57
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:92
const char * PCSTR
Definition: typedefs.h:51
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
LIST_ENTRY Links
Definition: dbghelp.h:115
ULONG SizeOfImage
Definition: dbghelp.h:116
#define UnmapViewOfFile
Definition: compat.h:403
#define HeapFree(x, y, z)
Definition: compat.h:394
HANDLE NTAPI CreateFileMappingA(IN HANDLE hFile, IN LPSECURITY_ATTRIBUTES lpFileMappingAttributes, IN DWORD flProtect, IN DWORD dwMaximumSizeHigh, IN DWORD dwMaximumSizeLow, IN LPCSTR lpName)
Definition: filemap.c:23
BOOLEAN fSystemImage
Definition: dbghelp.h:111
#define PAGE_READWRITE
Definition: nt_native.h:1304