ReactOS 0.4.16-dev-2357-g35d0dfe
assembly.c File Reference
#include <stdarg.h>
#include <stdio.h>
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winver.h"
#include "dbghelp.h"
#include "ole2.h"
#include "mscoree.h"
#include "corhdr.h"
#include "metahost.h"
#include "cordebug.h"
#include "wine/list.h"
#include "mscoree_private.h"
#include "wine/debug.h"
Include dependency graph for assembly.c:

Go to the source code of this file.

Classes

struct  METADATAHDR
 
struct  METADATASTREAMHDR
 
struct  tagCLRTABLE
 
struct  tagASSEMBLY
 

Typedefs

typedef struct tagCLRTABLE CLRTABLE
 

Functions

static voidassembly_rva_to_va (ASSEMBLY *assembly, ULONG rva)
 
static ULONG assembly_datadir_get_data (ASSEMBLY *assembly, IMAGE_DATA_DIRECTORY *datadir, void **data)
 
static HRESULT parse_metadata_header (ASSEMBLY *assembly, DWORD *hdrsz)
 
static HRESULT parse_clr_metadata (ASSEMBLY *assembly)
 
static HRESULT parse_pe_header (ASSEMBLY *assembly)
 
static HRESULT parse_headers (ASSEMBLY *assembly)
 
HRESULT assembly_create (ASSEMBLY **out, LPCWSTR file)
 
HRESULT assembly_from_hmodule (ASSEMBLY **out, HMODULE hmodule)
 
HRESULT assembly_release (ASSEMBLY *assembly)
 
HRESULT assembly_get_runtime_version (ASSEMBLY *assembly, LPSTR *version)
 
HRESULT assembly_get_vtable_fixups (ASSEMBLY *assembly, VTableFixup **fixups, DWORD *count)
 
HRESULT assembly_get_native_entrypoint (ASSEMBLY *assembly, NativeEntryPointFunc *func)
 

Typedef Documentation

◆ CLRTABLE

Function Documentation

◆ assembly_create()

HRESULT assembly_create ( ASSEMBLY **  out,
LPCWSTR  file 
)

Definition at line 190 of file assembly.c.

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}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define PAGE_READONLY
Definition: compat.h:138
#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 wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
HRESULT assembly_release(ASSEMBLY *assembly)
Definition: assembly.c:694
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
static HRESULT parse_headers(ASSEMBLY *assembly)
Definition: assembly.c:178
#define calloc
Definition: rosglue.h:14
HRESULT hr
Definition: shlfolder.c:183
Definition: fci.c:127
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210

◆ assembly_datadir_get_data()

static ULONG assembly_datadir_get_data ( ASSEMBLY assembly,
IMAGE_DATA_DIRECTORY datadir,
void **  data 
)
static

Definition at line 88 of file assembly.c.

90{
91 if (!datadir->VirtualAddress || !datadir->Size)
92 {
93 *data = NULL;
94 return 0;
95 }
96 else
97 {
99 return datadir->Size;
100 }
101}
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
static void * assembly_rva_to_va(ASSEMBLY *assembly, ULONG rva)
Definition: assembly.c:80

Referenced by assembly_get_vtable_fixups(), and parse_pe_header().

◆ assembly_from_hmodule()

HRESULT assembly_from_hmodule ( ASSEMBLY **  out,
HMODULE  hmodule 
)

Definition at line 244 of file assembly.c.

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}
#define FALSE
Definition: types.h:117
#define SUCCEEDED(hr)
Definition: intsafe.h:50
static HMODULE hmodule
Definition: rasapi.c:29
unsigned char BYTE
Definition: xxhash.c:193

Referenced by _CorDllMain(), and FixupVTable().

◆ assembly_get_native_entrypoint()

HRESULT assembly_get_native_entrypoint ( ASSEMBLY assembly,
NativeEntryPointFunc func 
)

Definition at line 303 of file assembly.c.

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}
GLenum func
Definition: glext.h:6028
#define S_FALSE
Definition: winerror.h:3451
@ COMIMAGE_FLAGS_NATIVE_ENTRYPOINT
Definition: winnt_old.h:3507

Referenced by _CorDllMain().

◆ assembly_get_runtime_version()

HRESULT assembly_get_runtime_version ( ASSEMBLY assembly,
LPSTR version 
)

Definition at line 286 of file assembly.c.

287{
288 *version = assembly->metadatahdr->Version;
289
290 return S_OK;
291}
static const WCHAR version[]
Definition: asmname.c:66

◆ assembly_get_vtable_fixups()

HRESULT assembly_get_vtable_fixups ( ASSEMBLY assembly,
VTableFixup **  fixups,
DWORD count 
)

Definition at line 293 of file assembly.c.

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}
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
static ULONG assembly_datadir_get_data(ASSEMBLY *assembly, IMAGE_DATA_DIRECTORY *datadir, void **data)
Definition: assembly.c:88
struct _VTableFixup VTableFixup
uint32_t ULONG
Definition: typedefs.h:59

Referenced by FixupVTable_Assembly().

◆ assembly_release()

HRESULT assembly_release ( ASSEMBLY assembly)

Definition at line 268 of file assembly.c.

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}
#define free
Definition: debug_ros.c:5
#define CloseHandle
Definition: compat.h:739
#define UnmapViewOfFile
Definition: compat.h:746

◆ assembly_rva_to_va()

static void * assembly_rva_to_va ( ASSEMBLY assembly,
ULONG  rva 
)
static

Definition at line 80 of file assembly.c.

81{
82 if (assembly->is_mapped_file)
83 return ImageRvaToVa(assembly->nthdr, assembly->data, rva, NULL);
84 else
85 return assembly->data + rva;
86}
PVOID WINAPI ImageRvaToVa(_In_ PIMAGE_NT_HEADERS, _In_ PVOID, _In_ ULONG, _In_opt_ PIMAGE_SECTION_HEADER *)

Referenced by assembly_datadir_get_data(), assembly_get_native_entrypoint(), and parse_metadata_header().

◆ parse_clr_metadata()

static HRESULT parse_clr_metadata ( ASSEMBLY assembly)
static

Definition at line 136 of file assembly.c.

137{
138 HRESULT hr;
139 DWORD hdrsz;
140
142 if (FAILED(hr))
143 return hr;
144
145 return S_OK;
146}
unsigned long DWORD
Definition: ntddk_ex.h:95
static HRESULT parse_metadata_header(ASSEMBLY *assembly, DWORD *hdrsz)
Definition: assembly.c:529

◆ parse_headers()

static HRESULT parse_headers ( ASSEMBLY assembly)
static

Definition at line 178 of file assembly.c.

179{
180 HRESULT hr;
181
183
184 if (SUCCEEDED(hr))
186
187 return hr;
188}
static HRESULT parse_pe_header(ASSEMBLY *assembly)
Definition: assembly.c:603
static HRESULT parse_clr_metadata(ASSEMBLY *assembly)
Definition: assembly.c:560

Referenced by assembly_create(), and assembly_from_hmodule().

◆ parse_metadata_header()

static HRESULT parse_metadata_header ( ASSEMBLY assembly,
DWORD hdrsz 
)
static

Definition at line 103 of file assembly.c.

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}
#define E_FAIL
Definition: ddrawi.h:102
#define malloc
Definition: debug_ros.c:4
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
static char * dest
Definition: rtl.c:135
ULONG VersionLength
Definition: fusionpriv.h:48
LPSTR Version
Definition: fusionpriv.h:49
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
char * LPSTR
Definition: xmlstorage.h:182

◆ parse_pe_header()

static HRESULT parse_pe_header ( ASSEMBLY assembly)
static

Definition at line 148 of file assembly.c.

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}
PIMAGE_NT_HEADERS WINAPI ImageNtHeader(_In_ PVOID)
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC
Definition: ntimage.h:377
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
Definition: ntimage.h:489
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