ReactOS 0.4.15-dev-7897-g78dc504
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;
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 +
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
206Error:
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}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
BOOL Error
Definition: chkdsk.c:66
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define OPEN_EXISTING
Definition: compat.h:775
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define GENERIC_READ
Definition: compat.h:135
#define RtlImageNtHeader
Definition: compat.h:806
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define FILE_MAP_READ
Definition: compat.h:776
#define MapViewOfFile
Definition: compat.h:745
#define FILE_SHARE_READ
Definition: compat.h:136
PLOADED_IMAGE WINAPI ImageLoad(PCSTR dll_name, PCSTR dll_path)
Definition: access.c:70
BOOL WINAPI MapAndLoad(PCSTR pszImageName, PCSTR pszDllPath, PLOADED_IMAGE pLoadedImage, BOOL bDotDll, BOOL bReadOnly)
Definition: access.c:131
BOOL WINAPI SetImageConfigInformation(PLOADED_IMAGE LoadedImage, PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
Definition: access.c:214
static LIST_ENTRY image_list
Definition: access.c:36
BOOL WINAPI GetImageConfigInformation(PLOADED_IMAGE LoadedImage, PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigInformation)
Definition: access.c:42
BOOL WINAPI ImageUnload(PLOADED_IMAGE loaded_image)
Definition: access.c:96
BOOL WINAPI UnMapAndLoad(PLOADED_IMAGE pLoadedImage)
Definition: access.c:228
DWORD WINAPI GetImageUnusedHeaderBytes(PLOADED_IMAGE LoadedImage, LPDWORD SizeUnusedHeaderBytes)
Definition: access.c:56
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
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:1123
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
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLeglImageOES image
Definition: gl.h:2204
GLenum GLenum GLenum GLenum mapping
Definition: glext.h:9031
uint32_t entry
Definition: isohybrid.c:63
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
LPCWSTR pszImageName
Definition: env.c:57
_In_ HANDLE hFile
Definition: mswsock.h:90
#define SEC_COMMIT
Definition: mmtypes.h:100
#define PAGE_READWRITE
Definition: nt_native.h:1304
#define GENERIC_WRITE
Definition: nt_native.h:90
struct _IMAGE_SECTION_HEADER * PIMAGE_SECTION_HEADER
#define TRACE(s)
Definition: solgame.cpp:4
WORD SizeOfOptionalHeader
Definition: ntddk_ex.h:127
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
IMAGE_FILE_HEADER FileHeader
Definition: ntddk_ex.h:183
Definition: typedefs.h:120
struct _LIST_ENTRY * Blink
Definition: typedefs.h:122
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
PIMAGE_SECTION_HEADER Sections
Definition: dbghelp.h:109
BOOLEAN fSystemImage
Definition: dbghelp.h:111
LIST_ENTRY Links
Definition: dbghelp.h:115
ULONG Characteristics
Definition: dbghelp.h:110
ULONG SizeOfImage
Definition: dbghelp.h:116
PUCHAR MappedAddress
Definition: dbghelp.h:101
HANDLE hFile
Definition: dbghelp.h:100
PIMAGE_SECTION_HEADER LastRvaSection
Definition: dbghelp.h:107
PIMAGE_NT_HEADERS32 FileHeader
Definition: dbghelp.h:105
ULONG NumberOfSections
Definition: dbghelp.h:108
PSTR ModuleName
Definition: dbghelp.h:99
BOOLEAN fDOSImage
Definition: dbghelp.h:112
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t * LPDWORD
Definition: typedefs.h:59
const char * PCSTR
Definition: typedefs.h:52
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define FILE_MAP_WRITE
Definition: winbase.h:154
#define WINAPI
Definition: msvc.h:6
char CHAR
Definition: xmlstorage.h:175