ReactOS 0.4.16-dev-2357-g35d0dfe
assembly.c
Go to the documentation of this file.
1/*
2 * assembly parser
3 *
4 * Copyright 2008 James Hawkins
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 <stdio.h>
23
24#include "windef.h"
25#include "winbase.h"
26#include "winuser.h"
27#include "winver.h"
28#include "dbghelp.h"
29#include "ole2.h"
30#include "mscoree.h"
31#include "corhdr.h"
32#include "metahost.h"
33#include "cordebug.h"
34#include "wine/list.h"
35#include "mscoree_private.h"
36
37#include "wine/debug.h"
38
39typedef struct
40{
45 ULONG VersionLength;
47 BYTE Flags;
48 WORD Streams;
50
51typedef struct
52{
54 DWORD Size;
56
57typedef struct tagCLRTABLE
58{
59 INT rows;
62
63struct tagASSEMBLY
64{
66
67 /* mapped files */
71
72 BYTE *data;
73
76
78};
79
81{
82 if (assembly->is_mapped_file)
83 return ImageRvaToVa(assembly->nthdr, assembly->data, rva, NULL);
84 else
85 return assembly->data + rva;
86}
87
89 IMAGE_DATA_DIRECTORY *datadir, void **data)
90{
91 if (!datadir->VirtualAddress || !datadir->Size)
92 {
93 *data = NULL;
94 return 0;
95 }
96 else
97 {
99 return datadir->Size;
100 }
101}
102
104{
105 METADATAHDR *metadatahdr;
106 BYTE *ptr, *dest;
107 DWORD size, ofs;
108 ULONG rva;
109
110 rva = assembly->corhdr->MetaData.VirtualAddress;
112 if (!ptr)
113 return E_FAIL;
114
115 metadatahdr = (METADATAHDR *)ptr;
116
117 assembly->metadatahdr = malloc(sizeof(METADATAHDR));
118 if (!assembly->metadatahdr)
119 return E_OUTOFMEMORY;
120
122 memcpy(assembly->metadatahdr, metadatahdr, size);
123
124 assembly->metadatahdr->Version = (LPSTR)&metadatahdr->Version;
125
127 ptr += FIELD_OFFSET(METADATAHDR, Version) + metadatahdr->VersionLength + 1;
128 dest = (BYTE *)assembly->metadatahdr + ofs;
129 memcpy(dest, ptr, sizeof(METADATAHDR) - ofs);
130
131 *hdrsz = sizeof(METADATAHDR) - sizeof(LPSTR) + metadatahdr->VersionLength + 1;
132
133 return S_OK;
134}
135
137{
138 HRESULT hr;
139 DWORD hdrsz;
140
142 if (FAILED(hr))
143 return hr;
144
145 return S_OK;
146}
147
149{
150 IMAGE_DATA_DIRECTORY *datadirs;
151
152 assembly->nthdr = ImageNtHeader(assembly->data);
153 if (!assembly->nthdr)
154 return E_FAIL;
155
156 if (assembly->nthdr->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
157 {
159 (IMAGE_OPTIONAL_HEADER64 *)&assembly->nthdr->OptionalHeader;
160 datadirs = opthdr->DataDirectory;
161 }
162 else
163 {
165 (IMAGE_OPTIONAL_HEADER32 *)&assembly->nthdr->OptionalHeader;
166 datadirs = opthdr->DataDirectory;
167 }
168
169 if (!datadirs)
170 return E_FAIL;
171
173 return E_FAIL;
174
175 return S_OK;
176}
177
179{
180 HRESULT hr;
181
183
184 if (SUCCEEDED(hr))
186
187 return hr;
188}
189
191{
193 HRESULT hr;
194
195 *out = NULL;
196
197 assembly = calloc(1, sizeof(ASSEMBLY));
198 if (!assembly)
199 return E_OUTOFMEMORY;
200
201 assembly->is_mapped_file = TRUE;
202
203 assembly->path = wcsdup(file);
204 if (!assembly->path)
205 {
207 goto failed;
208 }
209
212 if (assembly->hfile == INVALID_HANDLE_VALUE)
213 {
215 goto failed;
216 }
217
219 0, 0, NULL);
220 if (!assembly->hmap)
221 {
223 goto failed;
224 }
225
226 assembly->data = MapViewOfFile(assembly->hmap, FILE_MAP_READ, 0, 0, 0);
227 if (!assembly->data)
228 {
230 goto failed;
231 }
232
234 if (FAILED(hr)) goto failed;
235
236 *out = assembly;
237 return S_OK;
238
239failed:
241 return hr;
242}
243
245{
247 HRESULT hr;
248
249 *out = NULL;
250
251 assembly = calloc(1, sizeof(ASSEMBLY));
252 if (!assembly)
253 return E_OUTOFMEMORY;
254
255 assembly->is_mapped_file = FALSE;
256
257 assembly->data = (BYTE*)hmodule;
258
260 if (SUCCEEDED(hr))
261 *out = assembly;
262 else
264
265 return hr;
266}
267
269{
270 if (!assembly)
271 return S_OK;
272
273 if (assembly->is_mapped_file)
274 {
276 CloseHandle(assembly->hmap);
277 CloseHandle(assembly->hfile);
278 }
279 free(assembly->metadatahdr);
280 free(assembly->path);
281 free(assembly);
282
283 return S_OK;
284}
285
287{
288 *version = assembly->metadatahdr->Version;
289
290 return S_OK;
291}
292
294{
295 ULONG size;
296
297 size = assembly_datadir_get_data(assembly, &assembly->corhdr->VTableFixups, (void**)fixups);
298 *count = size / sizeof(VTableFixup);
299
300 return S_OK;
301}
302
304{
305 if (assembly->corhdr->Flags & COMIMAGE_FLAGS_NATIVE_ENTRYPOINT)
306 {
307 *func = assembly_rva_to_va(assembly, assembly->corhdr->EntryPointRVA);
308 return S_OK;
309 }
310 else
311 {
312 *func = NULL;
313 return S_FALSE;
314 }
315}
PIMAGE_NT_HEADERS WINAPI ImageNtHeader(_In_ PVOID)
PVOID WINAPI ImageRvaToVa(_In_ PIMAGE_NT_HEADERS, _In_ PVOID, _In_ ULONG, _In_opt_ PIMAGE_SECTION_HEADER *)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#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 PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define FILE_MAP_READ
Definition: compat.h:776
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define MapViewOfFile
Definition: compat.h:745
#define FILE_SHARE_READ
Definition: compat.h:136
static const WCHAR version[]
Definition: asmname.c:66
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
static const WCHAR Signature[]
Definition: parser.c:141
ULONG MajorVersion
Definition: ros_glue.cpp:4
ULONG MinorVersion
Definition: ros_glue.cpp:5
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT assembly_release(ASSEMBLY *assembly)
Definition: assembly.c:694
static HRESULT parse_metadata_header(ASSEMBLY *assembly, DWORD *hdrsz)
Definition: assembly.c:529
static HRESULT parse_pe_header(ASSEMBLY *assembly)
Definition: assembly.c:603
HRESULT assembly_get_runtime_version(ASSEMBLY *assembly, LPSTR *version)
Definition: assembly.c:865
static HRESULT parse_clr_metadata(ASSEMBLY *assembly)
Definition: assembly.c:560
HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file)
Definition: assembly.c:641
struct tagCLRTABLE CLRTABLE
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum func
Definition: glext.h:6028
GLsizeiptr size
Definition: glext.h:5919
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
static char * dest
Definition: rtl.c:135
static HMODULE hmodule
Definition: rasapi.c:29
static HRESULT parse_headers(ASSEMBLY *assembly)
Definition: assembly.c:178
HRESULT assembly_get_native_entrypoint(ASSEMBLY *assembly, NativeEntryPointFunc *func)
Definition: assembly.c:303
HRESULT assembly_from_hmodule(ASSEMBLY **out, HMODULE hmodule)
Definition: assembly.c:244
HRESULT assembly_get_vtable_fixups(ASSEMBLY *assembly, VTableFixup **fixups, DWORD *count)
Definition: assembly.c:293
static void * assembly_rva_to_va(ASSEMBLY *assembly, ULONG rva)
Definition: assembly.c:80
static ULONG assembly_datadir_get_data(ASSEMBLY *assembly, IMAGE_DATA_DIRECTORY *datadir, void **data)
Definition: assembly.c:88
BOOL(WINAPI * NativeEntryPointFunc)(HINSTANCE, DWORD, LPVOID)
struct _VTableFixup VTableFixup
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC
Definition: ntimage.h:377
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
Definition: ntimage.h:489
unsigned short USHORT
Definition: pedump.c:61
#define calloc
Definition: rosglue.h:14
HRESULT hr
Definition: shlfolder.c:183
ULONG VersionLength
Definition: fusionpriv.h:48
LPSTR Version
Definition: fusionpriv.h:49
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntimage.h:370
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntddk_ex.h:178
Definition: fci.c:127
HANDLE hfile
Definition: assembly.c:58
BOOL is_mapped_file
Definition: assembly.c:65
IMAGE_COR20_HEADER * corhdr
Definition: assembly.c:63
HANDLE hmap
Definition: assembly.c:59
IMAGE_NT_HEADERS * nthdr
Definition: assembly.c:62
METADATAHDR * metadatahdr
Definition: assembly.c:65
LPWSTR path
Definition: assembly.c:56
BYTE * data
Definition: assembly.c:60
DWORD offset
Definition: assembly.c:51
INT rows
Definition: assembly.c:50
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
@ COMIMAGE_FLAGS_NATIVE_ENTRYPOINT
Definition: winnt_old.h:3507
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char * LPSTR
Definition: xmlstorage.h:182
unsigned char BYTE
Definition: xxhash.c:193