ReactOS 0.4.15-dev-7788-g1ad9096
image.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 Juan Lang
3 * Copyright 2010 Andrey Turkin
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19#include <stdio.h>
20#include <stdarg.h>
21
22#define NONAMELESSUNION
23#include <windef.h>
24#include <winbase.h>
25#include <winver.h>
26#include <winnt.h>
27#include <imagehlp.h>
28
29#include "wine/test.h"
30
32
33static BOOL (WINAPI *pImageGetDigestStream)(HANDLE, DWORD, DIGEST_FUNCTION, DIGEST_HANDLE);
34static BOOL (WINAPI *pBindImageEx)(DWORD Flags, const char *ImageName, const char *DllPath,
36static DWORD (WINAPI *pGetImageUnusedHeaderBytes)(PLOADED_IMAGE, LPDWORD);
37static PLOADED_IMAGE (WINAPI *pImageLoad)(PCSTR, PCSTR);
38static BOOL (WINAPI *pImageUnload)(PLOADED_IMAGE);
39
40
41/* minimal PE file image */
42#define VA_START 0x400000
43#define FILE_PE_START 0x50
44#define NUM_SECTIONS 3
45#define FILE_TEXT 0x200
46#define RVA_TEXT 0x1000
47#define RVA_BSS 0x2000
48#define FILE_IDATA 0x400
49#define RVA_IDATA 0x3000
50#define FILE_TOTAL 0x600
51#define RVA_TOTAL 0x4000
52#include <pshpack1.h>
53struct Imports {
59 char funcname[0x20];
60 } ibn;
61 char dllname[0x10];
62};
63#define EXIT_PROCESS (VA_START+RVA_IDATA+FIELD_OFFSET(struct Imports, thunks))
64
65static struct _PeImage {
75} bin = {
76 /* dos header */
77 {IMAGE_DOS_SIGNATURE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, 0, {0}, FILE_PE_START},
78 /* alignment before PE header */
79 {0},
80 /* nt headers */
82 /* basic headers - 3 sections, no symbols, EXE file */
85 /* optional header */
88 RVA_TEXT, RVA_TEXT, RVA_BSS, VA_START, 0x1000, 0x200, 4, 0, 1, 0, 4, 0, 0,
90 0x200000, 0x1000, 0x100000, 0x1000, 0, 0x10,
91 {{0, 0},
92 {RVA_IDATA, sizeof(struct Imports)}
93 }
94 }
95 },
96 /* sections */
97 {
98 {".text", {0x100}, RVA_TEXT, FILE_IDATA-FILE_TEXT, FILE_TEXT,
100 {".bss", {0x400}, RVA_BSS, 0, 0, 0, 0, 0, 0,
102 {".idata", {sizeof(struct Imports)}, RVA_IDATA, FILE_TOTAL-FILE_IDATA, FILE_IDATA, 0,
104 },
105 /* alignment before first section */
106 {0},
107 /* .text section */
108 {
109 0x31, 0xC0, /* xor eax, eax */
110 0xFF, 0x25, EXIT_PROCESS&0xFF, (EXIT_PROCESS>>8)&0xFF, (EXIT_PROCESS>>16)&0xFF,
111 (EXIT_PROCESS>>24)&0xFF, /* jmp ExitProcess */
112 0
113 },
114 /* .idata section */
115 {
116 {
117 {{RVA_IDATA + FIELD_OFFSET(struct Imports, original_thunks)}, 0, 0,
120 },
121 {{0}, 0, 0, 0, 0}
122 },
123 {{{RVA_IDATA+FIELD_OFFSET(struct Imports, ibn)}}, {{0}}},
124 {{{RVA_IDATA+FIELD_OFFSET(struct Imports, ibn)}}, {{0}}},
125 {0,"ExitProcess"},
126 "KERNEL32.DLL"
127 },
128 /* final alignment */
129 {0}
131#include <poppack.h>
132
133struct blob
134{
137};
138
140{
142 const void *pb;
143};
144
145struct update_accum
146{
147 DWORD cUpdates;
148 struct blob *updates;
149};
150
152{
154 const struct expected_blob *updates;
156};
157
159
160
162 DWORD cb)
163{
164 struct update_accum *accum = (struct update_accum *)handle;
165 BOOL ret = FALSE;
166
167 if (accum->cUpdates)
168 accum->updates = HeapReAlloc(GetProcessHeap(), 0, accum->updates,
169 (accum->cUpdates + 1) * sizeof(struct blob));
170 else
171 accum->updates = HeapAlloc(GetProcessHeap(), 0, sizeof(struct blob));
172 if (accum->updates)
173 {
174 struct blob *blob = &accum->updates[accum->cUpdates];
175
177 if (blob->pb)
178 {
179 memcpy(blob->pb, pb, cb);
180 blob->cb = cb;
181 ret = TRUE;
182 }
183 accum->cUpdates++;
184 }
185 return ret;
186}
187
189 const struct update_accum *got)
190{
191 DWORD i;
192
193 todo_wine_if (expected->todo)
194 ok(expected->cUpdates == got->cUpdates, "%s: expected %d updates, got %d\n",
195 header, expected->cUpdates, got->cUpdates);
196 for (i = 0; i < min(expected->cUpdates, got->cUpdates); i++)
197 {
198 ok(expected->updates[i].cb == got->updates[i].cb, "%s, update %d: expected %d bytes, got %d\n",
199 header, i, expected->updates[i].cb, got->updates[i].cb);
200 if (expected->updates[i].cb && expected->updates[i].cb == got->updates[i].cb)
201 ok(!memcmp(expected->updates[i].pb, got->updates[i].pb, got->updates[i].cb),
202 "%s, update %d: unexpected value\n", header, i);
203 }
204}
205
206/* Frees the updates stored in accum */
207static void free_updates(struct update_accum *accum)
208{
209 DWORD i;
210
211 for (i = 0; i < accum->cUpdates; i++)
212 HeapFree(GetProcessHeap(), 0, accum->updates[i].pb);
213 HeapFree(GetProcessHeap(), 0, accum->updates);
214 accum->updates = NULL;
215 accum->cUpdates = 0;
216}
217
218static const struct expected_blob b1[] = {
219 {FILE_PE_START, &bin},
220 /* with zeroed Checksum/SizeOfInitializedData/SizeOfImage fields */
221 {sizeof(bin.nt_headers), &bin.nt_headers},
222 {sizeof(bin.sections), &bin.sections},
223 {FILE_IDATA-FILE_TEXT, &bin.text_section},
224 {sizeof(bin.idata_section.descriptors[0].u.OriginalFirstThunk),
225 &bin.idata_section.descriptors[0].u.OriginalFirstThunk},
226 {FIELD_OFFSET(struct Imports, thunks)-
228 &bin.idata_section.descriptors[0].Name},
230 &bin.idata_section.ibn}
231};
232static const struct expected_update_accum a1 = { ARRAY_SIZE(b1), b1, TRUE };
233
234static const struct expected_blob b2[] = {
235 {FILE_PE_START, &bin},
236 /* with zeroed Checksum/SizeOfInitializedData/SizeOfImage fields */
237 {sizeof(bin.nt_headers), &bin.nt_headers},
238 {sizeof(bin.sections), &bin.sections},
239 {FILE_IDATA-FILE_TEXT, &bin.text_section},
240 {FILE_TOTAL-FILE_IDATA, &bin.idata_section}
241};
242static const struct expected_update_accum a2 = { ARRAY_SIZE(b2), b2, FALSE };
243
244/* Creates a test file and returns a handle to it. The file's path is returned
245 * in temp_file, which must be at least MAX_PATH characters in length.
246 */
248{
250 char temp_path[MAX_PATH];
251
252 if (GetTempPathA(sizeof(temp_path), temp_path))
253 {
254 if (GetTempFileNameA(temp_path, "img", 0, temp_file))
257 }
258 return file;
259}
260
261static void update_checksum(void)
262{
263 WORD const * ptr;
264 DWORD size;
265 DWORD sum = 0;
266
267 bin.nt_headers.OptionalHeader.CheckSum = 0;
268
269 for(ptr = (WORD const *)&bin, size = (sizeof(bin)+1)/sizeof(WORD); size > 0; ptr++, size--)
270 {
271 sum += *ptr;
272 if (HIWORD(sum) != 0)
273 {
274 sum = LOWORD(sum) + HIWORD(sum);
275 }
276 }
277 sum = (WORD)(LOWORD(sum) + HIWORD(sum));
278 sum += sizeof(bin);
279
280 bin.nt_headers.OptionalHeader.CheckSum = sum;
281}
282
284 const char *DllName, ULONG_PTR Va, ULONG_PTR Parameter)
285{
286 char kernel32_path[MAX_PATH];
287
288 if (0 <= (int)reason && reason <= BindSymbolsNotUpdated)
290 else
291 ok(0, "expected reason between 0 and %d, got %d\n", BindSymbolsNotUpdated+1, reason);
292
293 switch(reason)
294 {
295 case BindImportModule:
296 ok(!strcmp(DllName, "KERNEL32.DLL"), "expected DllName to be KERNEL32.DLL, got %s\n",
297 DllName);
298 break;
299
301 case BindForwarderNOT:
302 GetSystemDirectoryA(kernel32_path, MAX_PATH);
303 strcat(kernel32_path, "\\KERNEL32.DLL");
304 ok(!lstrcmpiA(DllName, kernel32_path), "expected DllName to be %s, got %s\n",
305 kernel32_path, DllName);
306 ok(!strcmp((char *)Parameter, "ExitProcess"),
307 "expected Parameter to be ExitProcess, got %s\n", (char *)Parameter);
308 break;
309
310 default:
311 ok(0, "got unexpected reason %d\n", reason);
312 break;
313 }
314 return TRUE;
315}
316
317static void test_get_digest_stream(void)
318{
319 BOOL ret;
320 HANDLE file;
321 char temp_file[MAX_PATH];
322 DWORD count;
323 struct update_accum accum = { 0, NULL };
324
325 if (!pImageGetDigestStream)
326 {
327 win_skip("ImageGetDigestStream function is not available\n");
328 return;
329 }
330 SetLastError(0xdeadbeef);
331 ret = pImageGetDigestStream(NULL, 0, NULL, NULL);
333 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
336 {
337 skip("couldn't create temp file\n");
338 return;
339 }
340 SetLastError(0xdeadbeef);
341 ret = pImageGetDigestStream(file, 0, NULL, NULL);
343 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
344 SetLastError(0xdeadbeef);
345 ret = pImageGetDigestStream(NULL, 0, accumulating_stream_output, &accum);
347 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
348 /* Even with "valid" parameters, it fails with an empty file */
349 SetLastError(0xdeadbeef);
350 ret = pImageGetDigestStream(file, 0, accumulating_stream_output, &accum);
352 "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
353 /* Finally, with a valid executable in the file, it succeeds. Note that
354 * the file pointer need not be positioned at the beginning.
355 */
357 WriteFile(file, &bin, sizeof(bin), &count, NULL);
359
360 /* zero out some fields ImageGetDigestStream would zero out */
361 bin.nt_headers.OptionalHeader.CheckSum = 0;
362 bin.nt_headers.OptionalHeader.SizeOfInitializedData = 0;
363 bin.nt_headers.OptionalHeader.SizeOfImage = 0;
364
365 ret = pImageGetDigestStream(file, 0, accumulating_stream_output, &accum);
366 ok(ret, "ImageGetDigestStream failed: %d\n", GetLastError());
367 check_updates("flags = 0", &a1, &accum);
368 free_updates(&accum);
369 ret = pImageGetDigestStream(file, CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO,
371 ok(ret, "ImageGetDigestStream failed: %d\n", GetLastError());
372 check_updates("flags = CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO", &a2, &accum);
373 free_updates(&accum);
376}
377
378static void test_bind_image_ex(void)
379{
380 BOOL ret;
381 HANDLE file;
382 char temp_file[MAX_PATH];
383 DWORD count;
384
385 if (!pBindImageEx)
386 {
387 win_skip("BindImageEx function is not available\n");
388 return;
389 }
390
391 /* call with a non-existent file */
392 SetLastError(0xdeadbeef);
393 ret = pBindImageEx(BIND_NO_BOUND_IMPORTS | BIND_NO_UPDATE | BIND_ALL_IMAGES, "nonexistent.dll", 0, 0,
397 "expected ERROR_FILE_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n",
398 GetLastError());
399
402 {
403 skip("couldn't create temp file\n");
404 return;
405 }
406
407 WriteFile(file, &bin, sizeof(bin), &count, NULL);
409
410 /* call with a proper PE file, but with StatusRoutine set to NULL */
412 NULL);
413 ok(ret, "BindImageEx failed: %d\n", GetLastError());
414
415 /* call with a proper PE file and StatusRoutine */
418 ok(ret, "BindImageEx failed: %d\n", GetLastError());
419
421 "StatusRoutine was called %d times\n", status_routine_called[BindImportModule]);
422
424#if defined(_WIN64)
426#endif
427 , "StatusRoutine was called %d times\n", status_routine_called[BindImportProcedure]);
428
430}
431
432static void test_image_load(void)
433{
434 char temp_file[MAX_PATH];
436 DWORD ret, count;
437 HANDLE file;
438
439 if (!pImageLoad || !pImageUnload || !pGetImageUnusedHeaderBytes)
440 {
441 win_skip("ImageLoad functions are not available\n");
442 return;
443 }
444
447 {
448 skip("couldn't create temp file\n");
449 return;
450 }
451
452 WriteFile(file, &bin, sizeof(bin), &count, NULL);
454
455 img = pImageLoad(temp_file, NULL);
456 ok(img != NULL, "ImageLoad unexpectedly failed\n");
457
458 if (img)
459 {
460 ok(!strcmp(img->ModuleName, temp_file),
461 "unexpected ModuleName, got %s instead of %s\n", img->ModuleName, temp_file);
462 ok(img->MappedAddress != NULL, "MappedAddress != NULL\n");
463 if (img->MappedAddress)
464 {
465 ok(!memcmp(img->MappedAddress, &bin.dos_header, sizeof(bin.dos_header)),
466 "MappedAddress doesn't point to IMAGE_DOS_HEADER\n");
467 }
468 ok(img->FileHeader != NULL, "FileHeader != NULL\n");
469 if (img->FileHeader)
470 {
471 ok(!memcmp(img->FileHeader, &bin.nt_headers, sizeof(bin.nt_headers)),
472 "FileHeader doesn't point to IMAGE_NT_HEADERS32\n");
473 }
474 ok(img->NumberOfSections == 3,
475 "unexpected NumberOfSections, got %d instead of 3\n", img->NumberOfSections);
476 if (img->NumberOfSections >= 3)
477 {
478 ok(!strcmp((const char *)img->Sections[0].Name, ".text"),
479 "unexpected name for section 0, expected .text, got %s\n",
480 (const char *)img->Sections[0].Name);
481 ok(!strcmp((const char *)img->Sections[1].Name, ".bss"),
482 "unexpected name for section 1, expected .bss, got %s\n",
483 (const char *)img->Sections[1].Name);
484 ok(!strcmp((const char *)img->Sections[2].Name, ".idata"),
485 "unexpected name for section 2, expected .idata, got %s\n",
486 (const char *)img->Sections[2].Name);
487 }
488 ok(img->Characteristics == 0x102,
489 "unexpected Characteristics, got 0x%x instead of 0x102\n", img->Characteristics);
490 ok(img->fSystemImage == 0,
491 "unexpected fSystemImage, got %d instead of 0\n", img->fSystemImage);
492 ok(img->fDOSImage == 0,
493 "unexpected fDOSImage, got %d instead of 0\n", img->fDOSImage);
494 todo_wine ok(img->fReadOnly == 1 || broken(!img->fReadOnly) /* <= WinXP */,
495 "unexpected fReadOnly, got %d instead of 1\n", img->fReadOnly);
496 todo_wine ok(img->Version == 1 || broken(!img->Version) /* <= WinXP */,
497 "unexpected Version, got %d instead of 1\n", img->Version);
498 ok(img->SizeOfImage == 0x600,
499 "unexpected SizeOfImage, got 0x%x instead of 0x600\n", img->SizeOfImage);
500
501 count = 0xdeadbeef;
502 ret = pGetImageUnusedHeaderBytes(img, &count);
504 ok(ret == 448, "GetImageUnusedHeaderBytes returned %u instead of 448\n", ret);
506 ok(count == 64, "unexpected size for unused header bytes, got %u instead of 64\n", count);
507
508 pImageUnload(img);
509 }
510
512}
513
515{
516 hImageHlp = LoadLibraryA("imagehlp.dll");
517
518 if (!hImageHlp)
519 {
520 win_skip("ImageHlp unavailable\n");
521 return;
522 }
523
524 pImageGetDigestStream = (void *) GetProcAddress(hImageHlp, "ImageGetDigestStream");
525 pBindImageEx = (void *) GetProcAddress(hImageHlp, "BindImageEx");
526 pGetImageUnusedHeaderBytes = (void *) GetProcAddress(hImageHlp, "GetImageUnusedHeaderBytes");
527 pImageLoad = (void *) GetProcAddress(hImageHlp, "ImageLoad");
528 pImageUnload = (void *) GetProcAddress(hImageHlp, "ImageUnload");
529
533
535}
#define broken(x)
Definition: _sntprintf.h:21
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ARRAY_SIZE(A)
Definition: main.h:33
struct _LOADED_IMAGE * PLOADED_IMAGE
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static WCHAR reason[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1904
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
#define GetProcAddress(x, y)
Definition: compat.h:753
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define HeapReAlloc
Definition: compat.h:734
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define FreeLibrary(x)
Definition: compat.h:748
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define CALLBACK
Definition: compat.h:35
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI FlushFileBuffers(IN HANDLE hFile)
Definition: fileinfo.c:25
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2054
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2283
UINT WINAPI GetTempFileNameA(IN LPCSTR lpPathName, IN LPCSTR lpPrefixString, IN UINT uUnique, OUT LPSTR lpTempFileName)
Definition: filename.c:26
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
struct _IMAGE_DOS_HEADER IMAGE_DOS_HEADER
struct _IMAGE_OPTIONAL_HEADER IMAGE_OPTIONAL_HEADER32
struct _IMAGE_NT_HEADERS IMAGE_NT_HEADERS32
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLvoid * img
Definition: gl.h:1956
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
enum _IMAGEHLP_STATUS_REASON IMAGEHLP_STATUS_REASON
#define BIND_NO_UPDATE
Definition: imagehlp.h:35
#define BIND_NO_BOUND_IMPORTS
Definition: imagehlp.h:34
#define CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO
Definition: imagehlp.h:45
@ BindImportModule
Definition: imagehlp.h:105
@ BindSymbolsNotUpdated
Definition: imagehlp.h:113
@ BindForwarderNOT
Definition: imagehlp.h:108
@ BindImportProcedure
Definition: imagehlp.h:106
BOOL(WINAPI * PIMAGEHLP_STATUS_ROUTINE)(IMAGEHLP_STATUS_REASON, PCSTR, PCSTR, ULONG_PTR, ULONG_PTR)
Definition: imagehlp.h:115
#define BIND_ALL_IMAGES
Definition: imagehlp.h:36
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define CREATE_ALWAYS
Definition: disk.h:72
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static PVOID ptr
Definition: dispmode.c:27
static void check_updates(LPCSTR header, const struct update_accum *expected, const struct update_accum *got)
Definition: msg.c:602
static BOOL WINAPI accumulating_stream_output(const void *pvArg, BYTE *pb, DWORD cb, BOOL final)
Definition: msg.c:542
static const struct update_accum a1
Definition: msg.c:578
static const struct update_accum a2
Definition: msg.c:586
static CRYPT_DATA_BLOB b2[]
Definition: msg.c:582
static void free_updates(struct update_accum *accum)
Definition: msg.c:625
static CRYPT_DATA_BLOB b1[]
Definition: msg.c:573
BOOL expected
Definition: store.c:2063
static UINT *static UINT UINT UINT UINT *static GdiplusAbort *static BOOL
Definition: image.c:54
#define RVA_TEXT
Definition: image.c:46
#define FILE_IDATA
Definition: image.c:48
static void update_checksum(void)
Definition: image.c:261
static void test_bind_image_ex(void)
Definition: image.c:378
static void test_image_load(void)
Definition: image.c:432
#define FILE_TOTAL
Definition: image.c:50
static DIGEST_FUNCTION
Definition: image.c:33
static const char const char * DllPath
Definition: image.c:34
#define VA_START
Definition: image.c:42
static BOOL CALLBACK testing_status_routine(IMAGEHLP_STATUS_REASON reason, const char *ImageName, const char *DllName, ULONG_PTR Va, ULONG_PTR Parameter)
Definition: image.c:283
static const char const char const char PIMAGEHLP_STATUS_ROUTINE StatusRoutine
Definition: image.c:35
#define RVA_IDATA
Definition: image.c:49
#define FILE_TEXT
Definition: image.c:45
#define NUM_SECTIONS
Definition: image.c:44
static const char * ImageName
Definition: image.c:34
static DWORD
Definition: image.c:33
static int status_routine_called[BindSymbolsNotUpdated+1]
Definition: image.c:158
static PCSTR
Definition: image.c:37
static struct _PeImage bin
static HMODULE hImageHlp
Definition: image.c:31
static const char const char const char * SymbolPath
Definition: image.c:35
static void test_get_digest_stream(void)
Definition: image.c:317
static LPDWORD
Definition: image.c:36
#define RVA_TOTAL
Definition: image.c:51
#define RVA_BSS
Definition: image.c:47
static DIGEST_HANDLE
Definition: image.c:33
#define FILE_PE_START
Definition: image.c:43
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define todo_wine_if(is_todo)
Definition: custom.c:76
#define todo_wine
Definition: custom.c:79
#define RVA_TEXT
Definition: softpub.c:651
#define FILE_IDATA
Definition: softpub.c:653
static HANDLE create_temp_file(WCHAR *temp_file)
Definition: softpub.c:286
#define EXIT_PROCESS
Definition: softpub.c:668
#define FILE_TOTAL
Definition: softpub.c:655
#define RVA_IDATA
Definition: softpub.c:654
#define FILE_TEXT
Definition: softpub.c:650
#define NUM_SECTIONS
Definition: softpub.c:649
static struct _PeImage bin
#define RVA_BSS
Definition: softpub.c:652
#define FILE_PE_START
Definition: softpub.c:648
#define min(a, b)
Definition: monoChain.cc:55
char temp_path[MAX_PATH]
Definition: mspatcha.c:123
#define GENERIC_WRITE
Definition: nt_native.h:90
#define IMAGE_SCN_MEM_WRITE
Definition: ntimage.h:241
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC
Definition: ntimage.h:376
#define IMAGE_SCN_CNT_INITIALIZED_DATA
Definition: ntimage.h:231
#define IMAGE_SUBSYSTEM_WINDOWS_GUI
Definition: ntimage.h:437
#define IMAGE_SCN_CNT_CODE
Definition: ntimage.h:230
#define IMAGE_SCN_MEM_EXECUTE
Definition: ntimage.h:239
#define IMAGE_SCN_MEM_READ
Definition: ntimage.h:240
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA
Definition: ntimage.h:232
#define LOWORD(l)
Definition: pedump.c:82
#define IMAGE_FILE_EXECUTABLE_IMAGE
Definition: pedump.c:160
#define IMAGE_FILE_MACHINE_I386
Definition: pedump.c:174
#define IMAGE_NT_SIGNATURE
Definition: pedump.c:93
#define IMAGE_DOS_SIGNATURE
Definition: pedump.c:89
#define IMAGE_FILE_32BIT_MACHINE
Definition: pedump.c:164
static int sum(int x_, int y_)
Definition: ptr2_test.cpp:35
#define win_skip
Definition: test.h:160
char funcname[0x20]
Definition: image.c:59
Definition: image.c:53
char dllname[0x10]
Definition: image.c:61
IMAGE_THUNK_DATA32 thunks[2]
Definition: image.c:56
struct Imports::__IMPORT_BY_NAME ibn
IMAGE_IMPORT_DESCRIPTOR descriptors[2]
Definition: image.c:54
IMAGE_THUNK_DATA32 original_thunks[2]
Definition: image.c:55
Definition: image.c:65
char __alignment1[FILE_PE_START - sizeof(IMAGE_DOS_HEADER)]
Definition: image.c:67
IMAGE_NT_HEADERS32 nt_headers
Definition: image.c:68
unsigned char text_section[FILE_IDATA-FILE_TEXT]
Definition: image.c:72
IMAGE_SECTION_HEADER sections[NUM_SECTIONS]
Definition: image.c:69
char __alignment2[FILE_TEXT - FILE_PE_START - sizeof(IMAGE_NT_HEADERS32) - NUM_SECTIONS *sizeof(IMAGE_SECTION_HEADER)]
Definition: image.c:71
struct Imports idata_section
Definition: image.c:73
IMAGE_DOS_HEADER dos_header
Definition: image.c:66
char __alignment3[FILE_TOTAL-FILE_IDATA-sizeof(struct Imports)]
Definition: image.c:74
Definition: image.c:134
DWORD cb
Definition: image.c:135
BYTE * pb
Definition: image.c:136
DWORD cb
Definition: image.c:141
const void * pb
Definition: image.c:142
const struct expected_blob * updates
Definition: image.c:154
Definition: fci.c:127
Definition: fci.c:110
DWORD cUpdates
Definition: msg.c:538
CRYPT_DATA_BLOB * updates
Definition: msg.c:539
struct blob * updates
Definition: image.c:148
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
PVOID HANDLE
Definition: typedefs.h:73
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define HIWORD(l)
Definition: typedefs.h:247
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define WINAPI
Definition: msvc.h:6
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:323
const char * LPCSTR
Definition: xmlstorage.h:183
unsigned char BYTE
Definition: xxhash.c:193