ReactOS  r75625
image.c File Reference
#include <stdio.h>
#include <stdarg.h>
#include <windef.h>
#include <winbase.h>
#include <winver.h>
#include <winnt.h>
#include <imagehlp.h>
#include "wine/test.h"
#include <pshpack1.h>
#include <poppack.h>
Include dependency graph for image.c:

Go to the source code of this file.

Classes

struct  Imports
 
struct  Imports::__IMPORT_BY_NAME
 
struct  _PeImage
 
struct  blob
 
struct  expected_blob
 
struct  update_accum
 
struct  expected_update_accum
 

Macros

#define NONAMELESSUNION
 
#define VA_START   0x400000
 
#define FILE_PE_START   0x50
 
#define NUM_SECTIONS   3
 
#define FILE_TEXT   0x200
 
#define RVA_TEXT   0x1000
 
#define RVA_BSS   0x2000
 
#define FILE_IDATA   0x400
 
#define RVA_IDATA   0x3000
 
#define FILE_TOTAL   0x600
 
#define RVA_TOTAL   0x4000
 
#define EXIT_PROCESS   (VA_START+RVA_IDATA+FIELD_OFFSET(struct Imports, thunks))
 

Functions

static BOOL (WINAPI *pImageGetDigestStream)(HANDLE
 
static DWORD (WINAPI *pGetImageUnusedHeaderBytes)(PLOADED_IMAGE
 
static PLOADED_IMAGE (WINAPI *pImageLoad)(PCSTR
 
static BOOL WINAPI accumulating_stream_output (DIGEST_HANDLE handle, BYTE *pb, DWORD cb)
 
static void check_updates (LPCSTR header, const struct expected_update_accum *expected, const struct update_accum *got)
 
static void free_updates (struct update_accum *accum)
 
static HANDLE create_temp_file (char *temp_file)
 
static void update_checksum (void)
 
static BOOL CALLBACK testing_status_routine (IMAGEHLP_STATUS_REASON reason, const char *ImageName, const char *DllName, ULONG_PTR Va, ULONG_PTR Parameter)
 
static void test_get_digest_stream (void)
 
static void test_bind_image_ex (void)
 
static void test_image_load (void)
 
 START_TEST (image)
 

Variables

static HMODULE hImageHlp
 
static DWORD
 
static DIGEST_FUNCTION
 
static DIGEST_HANDLE
 
static const charImageName
 
static const char const charDllPath
 
static const char const char
const char
SymbolPath
 
static const char const char
const char
PIMAGEHLP_STATUS_ROUTINE 
StatusRoutine
 
static LPDWORD
 
static PCSTR
 
static struct _PeImage bin
 
static int status_routine_called [BindSymbolsNotUpdated+1]
 
static const struct expected_blob b1 []
 
static const struct
expected_update_accum 
a1 = { sizeof(b1) / sizeof(b1[0]), b1, TRUE }
 
static const struct expected_blob b2 []
 
static const struct
expected_update_accum 
a2 = { sizeof(b2) / sizeof(b2[0]), b2, FALSE }
 

Macro Definition Documentation

#define EXIT_PROCESS   (VA_START+RVA_IDATA+FIELD_OFFSET(struct Imports, thunks))

Definition at line 63 of file image.c.

#define FILE_IDATA   0x400

Definition at line 48 of file image.c.

#define FILE_PE_START   0x50

Definition at line 43 of file image.c.

#define FILE_TEXT   0x200

Definition at line 45 of file image.c.

#define FILE_TOTAL   0x600

Definition at line 50 of file image.c.

#define NONAMELESSUNION

Definition at line 22 of file image.c.

#define NUM_SECTIONS   3

Definition at line 44 of file image.c.

#define RVA_BSS   0x2000

Definition at line 47 of file image.c.

#define RVA_IDATA   0x3000

Definition at line 49 of file image.c.

#define RVA_TEXT   0x1000

Definition at line 46 of file image.c.

#define RVA_TOTAL   0x4000

Definition at line 51 of file image.c.

#define VA_START   0x400000

Definition at line 42 of file image.c.

Function Documentation

static BOOL WINAPI accumulating_stream_output ( DIGEST_HANDLE  handle,
BYTE pb,
DWORD  cb 
)
static

Definition at line 161 of file image.c.

Referenced by test_get_digest_stream().

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 
176  blob->pb = HeapAlloc(GetProcessHeap(), 0, cb);
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 }
#define TRUE
Definition: types.h:120
DWORD cb
Definition: image.c:135
Definition: image.c:133
#define FALSE
Definition: types.h:117
void UINT cb
Definition: fci.h:175
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
BYTE * pb
Definition: image.c:136
int ret
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define HeapReAlloc
Definition: compat.h:393
DWORD cUpdates
Definition: msg.c:538
CRYPT_DATA_BLOB * updates
Definition: msg.c:539
static BOOL ( WINAPI pImageGetDigestStream)
static
static void check_updates ( LPCSTR  header,
const struct expected_update_accum expected,
const struct update_accum got 
)
static

Definition at line 188 of file image.c.

Referenced by test_get_digest_stream().

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 }
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
DWORD DWORD
Definition: winlogon.h:75
GLuint n
Definition: s_context.h:57
GLenum GLclampf GLint i
Definition: glfuncs.h:14
#define todo_wine_if(is_todo)
Definition: test.h:155
#define d
Definition: ke_i.h:81
#define for
Definition: utility.h:88
GLdouble s
Definition: gl.h:2039
const struct expected_blob * updates
Definition: image.c:154
#define min(a, b)
Definition: monoChain.cc:55
CRYPT_DATA_BLOB * updates
Definition: msg.c:539
#define ok(value,...)
Definition: CImage.cpp:33
struct CFHEADER header
Definition: fdi.c:109
static HANDLE create_temp_file ( char temp_file)
static

Definition at line 247 of file image.c.

Referenced by test_bind_image_ex(), test_get_digest_stream(), and test_image_load().

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 }
Definition: fci.c:97
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
#define GENERIC_WRITE
Definition: nt_native.h:90
smooth NULL
Definition: ftsmooth.c:513
#define MAX_PATH
Definition: compat.h:26
const char file[]
Definition: icontest.c:11
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define GENERIC_READ
Definition: compat.h:124
#define CREATE_ALWAYS
Definition: disk.h:72
DWORD *typedef HANDLE
Definition: winlogon.h:52
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:2054
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:399
UINT WINAPI GetTempFileNameA(IN LPCSTR lpPathName, IN LPCSTR lpPrefixString, IN UINT uUnique, OUT LPSTR lpTempFileName)
Definition: filename.c:26
Definition: fci.c:114
static DWORD ( WINAPI pGetImageUnusedHeaderBytes)
static
static void free_updates ( struct update_accum accum)
static

Definition at line 207 of file image.c.

Referenced by test_get_digest_stream().

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 }
DWORD DWORD
Definition: winlogon.h:75
GLenum GLclampf GLint i
Definition: glfuncs.h:14
smooth NULL
Definition: ftsmooth.c:513
#define GetProcessHeap()
Definition: compat.h:395
DWORD cUpdates
Definition: msg.c:538
CRYPT_DATA_BLOB * updates
Definition: msg.c:539
#define HeapFree(x, y, z)
Definition: compat.h:394
static PLOADED_IMAGE ( WINAPI pImageLoad)
static
START_TEST ( image  )

Definition at line 521 of file image.c.

522 {
523  hImageHlp = LoadLibraryA("imagehlp.dll");
524 
525  if (!hImageHlp)
526  {
527  win_skip("ImageHlp unavailable\n");
528  return;
529  }
530 
531  pImageGetDigestStream = (void *) GetProcAddress(hImageHlp, "ImageGetDigestStream");
532  pBindImageEx = (void *) GetProcAddress(hImageHlp, "BindImageEx");
533  pGetImageUnusedHeaderBytes = (void *) GetProcAddress(hImageHlp, "GetImageUnusedHeaderBytes");
534  pImageLoad = (void *) GetProcAddress(hImageHlp, "ImageLoad");
535  pImageUnload = (void *) GetProcAddress(hImageHlp, "ImageUnload");
536 
539  test_image_load();
540 
542 }
static void test_get_digest_stream(void)
Definition: image.c:317
static void test_image_load(void)
Definition: image.c:432
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
#define FreeLibrary(x)
Definition: compat.h:405
static void test_bind_image_ex(void)
Definition: image.c:378
static HMODULE hImageHlp
Definition: image.c:31
#define GetProcAddress(x, y)
Definition: compat.h:410
#define win_skip
Definition: test.h:141
static void test_bind_image_ex ( void  )
static

Definition at line 378 of file image.c.

Referenced by START_TEST().

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,
395  ok(!ret && ((GetLastError() == ERROR_FILE_NOT_FOUND) ||
397  "expected ERROR_FILE_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n",
398  GetLastError());
399 
400  file = create_temp_file(temp_file);
401  if (file == INVALID_HANDLE_VALUE)
402  {
403  skip("couldn't create temp file\n");
404  return;
405  }
406 
407  WriteFile(file, &bin, sizeof(bin), &count, NULL);
408  CloseHandle(file);
409 
410  /* call with a proper PE file, but with StatusRoutine set to NULL */
411  ret = pBindImageEx(BIND_NO_BOUND_IMPORTS | BIND_NO_UPDATE | BIND_ALL_IMAGES, temp_file, 0, 0,
412  NULL);
413  ok(ret, "BindImageEx failed: %d\n", GetLastError());
414 
415  /* call with a proper PE file and StatusRoutine */
416  ret = pBindImageEx(BIND_NO_BOUND_IMPORTS | BIND_NO_UPDATE | BIND_ALL_IMAGES, temp_file, 0, 0,
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)
425  || broken(status_routine_called[BindImportProcedure] == 0) /* < Win8 */
426 #endif
427  , "StatusRoutine was called %d times\n", status_routine_called[BindImportProcedure]);
428 
429  DeleteFileA(temp_file);
430 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
#define CloseHandle
Definition: compat.h:398
Definition: fci.c:97
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
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1056
DWORD DWORD
Definition: winlogon.h:75
static HANDLE create_temp_file(char *temp_file)
Definition: image.c:247
smooth NULL
Definition: ftsmooth.c:513
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
#define BIND_NO_BOUND_IMPORTS
Definition: imagehlp.h:28
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
unsigned int BOOL
Definition: ntddk_ex.h:94
static int status_routine_called[BindSymbolsNotUpdated+1]
Definition: image.c:158
#define MAX_PATH
Definition: compat.h:26
const char file[]
Definition: icontest.c:11
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define SetLastError(x)
Definition: compat.h:409
#define BIND_NO_UPDATE
Definition: imagehlp.h:29
int ret
#define BIND_ALL_IMAGES
Definition: imagehlp.h:30
#define broken(x)
Definition: _sntprintf.h:21
DWORD *typedef HANDLE
Definition: winlogon.h:52
#define skip(...)
Definition: CString.cpp:57
static struct _PeImage bin
#define ok(value,...)
Definition: CImage.cpp:33
#define win_skip
Definition: test.h:141
static void test_get_digest_stream ( void  )
static

Definition at line 317 of file image.c.

Referenced by START_TEST().

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());
334  file = create_temp_file(temp_file);
335  if (file == INVALID_HANDLE_VALUE)
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  */
356  update_checksum();
357  WriteFile(file, &bin, sizeof(bin), &count, NULL);
358  FlushFileBuffers(file);
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);
374  CloseHandle(file);
375  DeleteFileA(temp_file);
376 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:91
#define CloseHandle
Definition: compat.h:398
Definition: fci.c:97
static void check_updates(LPCSTR header, const struct expected_update_accum *expected, const struct update_accum *got)
Definition: image.c:188
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1056
DWORD DWORD
Definition: winlogon.h:75
#define CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO
Definition: imagehlp.h:39
static HANDLE create_temp_file(char *temp_file)
Definition: image.c:247
smooth NULL
Definition: ftsmooth.c:513
static const struct expected_update_accum a2
Definition: image.c:242
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
unsigned int BOOL
Definition: ntddk_ex.h:94
static void update_checksum(void)
Definition: image.c:261
BOOL WINAPI FlushFileBuffers(IN HANDLE hFile)
Definition: fileinfo.c:175
static const struct expected_update_accum a1
Definition: image.c:232
#define MAX_PATH
Definition: compat.h:26
const char file[]
Definition: icontest.c:11
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define SetLastError(x)
Definition: compat.h:409
int ret
static void free_updates(struct update_accum *accum)
Definition: image.c:207
DWORD *typedef HANDLE
Definition: winlogon.h:52
#define skip(...)
Definition: CString.cpp:57
static struct _PeImage bin
static BOOL WINAPI accumulating_stream_output(DIGEST_HANDLE handle, BYTE *pb, DWORD cb)
Definition: image.c:161
#define ok(value,...)
Definition: CImage.cpp:33
#define win_skip
Definition: test.h:141
static void test_image_load ( void  )
static

Definition at line 432 of file image.c.

Referenced by START_TEST().

433 {
434  char temp_file[MAX_PATH];
436  DWORD ret, count;
437  HANDLE file;
438 
439  if (!pImageLoad || !pImageUnload)
440  {
441  win_skip("ImageLoad or ImageUnload function is not available\n");
442  return;
443  }
444  if (!pGetImageUnusedHeaderBytes)
445  {
446  win_skip("GetImageUnusedHeaderBytes function is not available\n");
447  return;
448  }
449 
450  file = create_temp_file(temp_file);
451  if (file == INVALID_HANDLE_VALUE)
452  {
453  skip("couldn't create temp file\n");
454  return;
455  }
456 
457  WriteFile(file, &bin, sizeof(bin), &count, NULL);
458  CloseHandle(file);
459 
460  img = pImageLoad(temp_file, NULL);
461  ok(img != NULL, "ImageLoad unexpectedly failed\n");
462 
463  if (img)
464  {
465  ok(!strcmp(img->ModuleName, temp_file),
466  "unexpected ModuleName, got %s instead of %s\n", img->ModuleName, temp_file);
467  ok(img->MappedAddress != NULL, "MappedAddress != NULL\n");
468  if (img->MappedAddress)
469  {
470  ok(!memcmp(img->MappedAddress, &bin.dos_header, sizeof(bin.dos_header)),
471  "MappedAddress doesn't point to IMAGE_DOS_HEADER\n");
472  }
473  ok(img->FileHeader != NULL, "FileHeader != NULL\n");
474  if (img->FileHeader)
475  {
476  ok(!memcmp(img->FileHeader, &bin.nt_headers, sizeof(bin.nt_headers)),
477  "FileHeader doesn't point to IMAGE_NT_HEADERS32\n");
478  }
479  ok(img->NumberOfSections == 3,
480  "unexpected NumberOfSections, got %d instead of 3\n", img->NumberOfSections);
481  if (img->NumberOfSections >= 3)
482  {
483  ok(!strcmp((const char *)img->Sections[0].Name, ".text"),
484  "unexpected name for section 0, expected .text, got %s\n",
485  (const char *)img->Sections[0].Name);
486  ok(!strcmp((const char *)img->Sections[1].Name, ".bss"),
487  "unexpected name for section 1, expected .bss, got %s\n",
488  (const char *)img->Sections[1].Name);
489  ok(!strcmp((const char *)img->Sections[2].Name, ".idata"),
490  "unexpected name for section 2, expected .idata, got %s\n",
491  (const char *)img->Sections[2].Name);
492  }
493  ok(img->Characteristics == 0x102,
494  "unexpected Characteristics, got 0x%x instead of 0x102\n", img->Characteristics);
495  ok(img->fSystemImage == 0,
496  "unexpected fSystemImage, got %d instead of 0\n", img->fSystemImage);
497  ok(img->fDOSImage == 0,
498  "unexpected fDOSImage, got %d instead of 0\n", img->fDOSImage);
499  todo_wine
500  ok(img->fReadOnly == 1 || broken(!img->fReadOnly) /* <= WinXP */,
501  "unexpected fReadOnly, got %d instead of 1\n", img->fReadOnly);
502  todo_wine
503  ok(img->Version == 1 || broken(!img->Version) /* <= WinXP */,
504  "unexpected Version, got %d instead of 1\n", img->Version);
505  ok(img->SizeOfImage == 0x600,
506  "unexpected SizeOfImage, got 0x%x instead of 0x600\n", img->SizeOfImage);
507 
508  count = 0xdeadbeef;
509  ret = pGetImageUnusedHeaderBytes(img, &count);
510  todo_wine
511  ok(ret == 448, "GetImageUnusedHeaderBytes returned %u instead of 448\n", ret);
512  todo_wine
513  ok(count == 64, "unexpected size for unused header bytes, got %u instead of 64\n", count);
514 
515  pImageUnload(img);
516  }
517 
518  DeleteFileA(temp_file);
519 }
BOOLEAN fDOSImage
Definition: dbghelp.h:108
#define CloseHandle
Definition: compat.h:398
Definition: fci.c:97
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
PIMAGE_SECTION_HEADER Sections
Definition: dbghelp.h:105
PIMAGE_NT_HEADERS FileHeader
Definition: dbghelp.h:102
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD DWORD
Definition: winlogon.h:75
ULONG NumberOfSections
Definition: dbghelp.h:104
UCHAR Version
Definition: dbghelp.h:110
static HANDLE create_temp_file(char *temp_file)
Definition: image.c:247
smooth NULL
Definition: ftsmooth.c:513
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
PUCHAR MappedAddress
Definition: dbghelp.h:101
BOOLEAN fReadOnly
Definition: dbghelp.h:109
GLint GLvoid * img
Definition: gl.h:1956
#define MAX_PATH
Definition: compat.h:26
const char file[]
Definition: icontest.c:11
GLuint GLuint GLsizei count
Definition: gl.h:1545
int ret
#define todo_wine
Definition: test.h:154
ULONG Characteristics
Definition: dbghelp.h:106
#define broken(x)
Definition: _sntprintf.h:21
DWORD *typedef HANDLE
Definition: winlogon.h:52
#define skip(...)
Definition: CString.cpp:57
PSTR ModuleName
Definition: dbghelp.h:99
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]
Definition: pedump.c:281
static struct _PeImage bin
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define ok(value,...)
Definition: CImage.cpp:33
ULONG SizeOfImage
Definition: dbghelp.h:112
#define win_skip
Definition: test.h:141
BOOLEAN fSystemImage
Definition: dbghelp.h:107
static BOOL CALLBACK testing_status_routine ( IMAGEHLP_STATUS_REASON  reason,
const char ImageName,
const char DllName,
ULONG_PTR  Va,
ULONG_PTR  Parameter 
)
static

Definition at line 283 of file image.c.

Referenced by test_bind_image_ex().

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 
300  case BindImportProcedure:
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 }
#define TRUE
Definition: types.h:120
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2283
_In_ PVOID Parameter
Definition: ldrtypes.h:239
static int status_routine_called[BindSymbolsNotUpdated+1]
Definition: image.c:158
#define MAX_PATH
Definition: compat.h:26
static WCHAR reason[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1927
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define ok(value,...)
Definition: CImage.cpp:33
static void update_checksum ( void  )
static

Definition at line 261 of file image.c.

Referenced by test_get_digest_stream().

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 }
unsigned short WORD
Definition: ntddk_ex.h:93
DWORD DWORD
Definition: winlogon.h:75
static PVOID ptr
Definition: dispmode.c:41
static int sum(int x_, int y_)
Definition: ptr2_test.cpp:35
GLsizeiptr size
Definition: glext.h:5919
static struct _PeImage bin
#define HIWORD(l)
Definition: typedefs.h:247
#define LOWORD(l)
Definition: pedump.c:82

Variable Documentation

Definition at line 232 of file image.c.

Definition at line 242 of file image.c.

const struct expected_blob b1[]
static
Initial value:
= {
{sizeof(bin.nt_headers), &bin.nt_headers},
{sizeof(bin.sections), &bin.sections},
{FILE_IDATA-FILE_TEXT, &bin.text_section},
{sizeof(bin.idata_section.descriptors[0].u.OriginalFirstThunk),
&bin.idata_section.descriptors[0].u.OriginalFirstThunk},
{FIELD_OFFSET(struct Imports, thunks)-
&bin.idata_section.descriptors[0].Name},
&bin.idata_section.ibn}
}
#define FILE_PE_START
Definition: image.c:43
#define FILE_IDATA
Definition: image.c:48
_In_ PUNICODE_STRING Name
Definition: mrx.h:218
#define FILE_TOTAL
Definition: image.c:50
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
static struct _PeImage bin
Definition: image.c:53
#define FILE_TEXT
Definition: image.c:45

Definition at line 218 of file image.c.

const struct expected_blob b2[]
static
Initial value:
= {
{sizeof(bin.nt_headers), &bin.nt_headers},
{sizeof(bin.sections), &bin.sections},
{FILE_IDATA-FILE_TEXT, &bin.text_section},
{FILE_TOTAL-FILE_IDATA, &bin.idata_section}
}
#define FILE_PE_START
Definition: image.c:43
#define FILE_IDATA
Definition: image.c:48
#define FILE_TOTAL
Definition: image.c:50
static struct _PeImage bin
#define FILE_TEXT
Definition: image.c:45

Definition at line 234 of file image.c.

DIGEST_FUNCTION

Definition at line 33 of file image.c.

Definition at line 33 of file image.c.

Definition at line 33 of file image.c.

HMODULE hImageHlp
static

Definition at line 31 of file image.c.

Referenced by START_TEST().

Definition at line 36 of file image.c.

Definition at line 37 of file image.c.

int status_routine_called[BindSymbolsNotUpdated+1]
static

Definition at line 158 of file image.c.

Definition at line 34 of file image.c.

Referenced by BindImageEx().

const char const char const char* SymbolPath

Definition at line 34 of file image.c.