ReactOS 0.4.16-dev-2104-gb84fa49
res.c
Go to the documentation of this file.
1/*
2 * PE file resources
3 *
4 * Copyright 1995 Thomas Sandford
5 * Copyright 1996 Martin von Loewis
6 * Copyright 2003 Alexandre Julliard
7 * Copyright 1993 Robert J. Amstadt
8 * Copyright 1997 Marcus Meissner
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25/* INCLUDES *****************************************************************/
26
27#include <rtl.h>
28
29#define NDEBUG
30#include <debug.h>
31
33 ULONG level, void **ret, int want_dir );
34
35/* FUNCTIONS ****************************************************************/
36
38{
43}
44
45/**********************************************************************
46 * is_data_file_module
47 *
48 * Check if a module handle is for a LOAD_LIBRARY_AS_DATAFILE module.
49 */
51{
52 return (ULONG_PTR)BaseAddress & 1;
53}
54
55
56/**********************************************************************
57 * push_language
58 *
59 * push a language in the list of languages to try
60 */
62{
63 ULONG i;
64 for (i = 0; i < pos; i++) if (list[i] == lang) return pos;
65 list[pos++] = lang;
66 return pos;
67}
68
69
70/**********************************************************************
71 * find_first_entry
72 *
73 * Find the first suitable entry in a resource directory
74 */
76 void *root, int want_dir )
77{
79 int pos;
80
81 for (pos = 0; pos < dir->NumberOfNamedEntries + dir->NumberOfIdEntries; pos++)
82 {
83 if (!entry[pos].DataIsDirectory == !want_dir)
84 return (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry[pos].OffsetToDirectory);
85 }
86 return NULL;
87}
88
89
90/**********************************************************************
91 * find_entry_by_id
92 *
93 * Find an entry by id in a resource directory
94 */
96 WORD id, void *root, int want_dir )
97{
99 int min, max, pos;
100
102 min = dir->NumberOfNamedEntries;
103 max = min + dir->NumberOfIdEntries - 1;
104 while (min <= max)
105 {
106 pos = (min + max) / 2;
107 if (entry[pos].Id == id)
108 {
109 if (!entry[pos].DataIsDirectory == !want_dir)
110 {
111 DPRINT("root %p dir %p id %04x ret %p\n",
112 root, dir, id, (const char*)root + entry[pos].OffsetToDirectory);
113 return (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry[pos].OffsetToDirectory);
114 }
115 break;
116 }
117 if (entry[pos].Id > id) max = pos - 1;
118 else min = pos + 1;
119 }
120 DPRINT("root %p dir %p id %04x not found\n", root, dir, id );
121 return NULL;
122}
123
124/*
125 * This function performs a case-insensitive comparison of a
126 * null-terminated wide string with a resource string.
127 * Unlike _wcsicmp, which lowercases the characters before comparison,
128 * this function uppercases them, because that is how resource strings
129 * are sorted (e.g. '_' comes after 'z' / 'Z').
130 */
131static
132int
134 const wchar_t *SearchString,
135 const IMAGE_RESOURCE_DIR_STRING_U *ResourceString)
136{
137 wchar_t const* p1 = SearchString;
138 wchar_t const* p2 = ResourceString->NameString;
139 size_t remaining = ResourceString->Length;
140 wchar_t chr1, chr2;
141
142 while (remaining-- != 0)
143 {
144 chr1 = *p1++;
145 chr2 = *p2++;
146
147 /* Quick direct comparison first */
148 if (chr1 != chr2)
149 {
150 /* No direct match, upcase both characters */
151 if ((chr1 >= 'a') && (chr1 <= 'z'))
152 chr1 -= ('a' - 'A');
153 if ((chr2 >= 'a') && (chr2 <= 'z'))
154 chr2 -= ('a' - 'A');
155
156 /* Compare again, if they don't match, return the difference */
157 if (chr1 != chr2)
158 return chr1 - chr2;
159 }
160 }
161
162 /* All characters matched, check if the search string ends here */
163 if (*p1 != 0)
164 {
165 /* The search string is longer, return a positive result */
166 return 1;
167 }
168
169 return 0;
170}
171
172/**********************************************************************
173 * find_entry_by_name
174 *
175 * Find an entry by name in a resource directory
176 */
178 LPCWSTR name, void *root,
179 int want_dir )
180{
183 int min, max, res, pos;
184
185 if (!((ULONG_PTR)name & 0xFFFF0000)) return find_entry_by_id( dir, (ULONG_PTR)name & 0xFFFF, root, want_dir );
187 min = 0;
188 max = dir->NumberOfNamedEntries - 1;
189 while (min <= max)
190 {
191 pos = (min + max) / 2;
192 str = (const IMAGE_RESOURCE_DIR_STRING_U *)((const char *)root + entry[pos].NameOffset);
194 if (!res)
195 {
196 if (!entry[pos].DataIsDirectory == !want_dir)
197 {
198 DPRINT("root %p dir %p name %ws ret %p\n",
199 root, dir, name, (const char*)root + entry[pos].OffsetToDirectory);
200 return (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry[pos].OffsetToDirectory);
201 }
202 break;
203 }
204 if (res < 0) max = pos - 1;
205 else min = pos + 1;
206 }
207 DPRINT("root %p dir %p name %ws not found\n", root, dir, name);
208 return NULL;
209}
210
211#ifdef __i386__
213 void **ptr, ULONG *size )
214#else
216 void **ptr, ULONG *size )
217#endif
218{
220
222 {
223 ULONG dirsize;
224
227 else
228 {
229 if (ptr)
230 {
232 {
234 *ptr = RtlImageRvaToVa( RtlImageNtHeader(mod), mod, entry->OffsetToData, NULL );
235 }
236 else *ptr = (char *)BaseAddress + entry->OffsetToData;
237 }
238 if (size) *size = entry->Size;
239 }
240 }
242 {
244 }
245 _SEH2_END;
246 return status;
247}
248
249
250/*
251 * @implemented
252 */
255 PLDR_RESOURCE_INFO ResourceInfo,
256 ULONG Level,
257 PIMAGE_RESOURCE_DATA_ENTRY* ResourceDataEntry)
258{
259 void *res;
261
263 {
264 if (ResourceInfo)
265 {
266 DPRINT( "module %p type %lx name %lx lang %04lx level %lu\n",
267 BaseAddress, ResourceInfo->Type,
268 Level > 1 ? ResourceInfo->Name : 0,
269 Level > 2 ? ResourceInfo->Language : 0, Level );
270 }
271
272 status = find_entry( BaseAddress, ResourceInfo, Level, &res, FALSE );
273 if (NT_SUCCESS(status))
274 *ResourceDataEntry = res;
275 }
277 {
279 }
280 _SEH2_END;
281 return status;
282}
283
284#ifndef __i386__
285/*
286 * @implemented
287 */
290 IN PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry,
293{
294 return LdrpAccessResource( BaseAddress, ResourceDataEntry, Resource, Size );
295}
296#endif
297
298/*
299 * @implemented
300 */
304 IN ULONG level,
306{
307 void *res;
309
311 {
312 if (info)
313 {
314 DPRINT( "module %p type %ws name %ws lang %04lx level %lu\n",
315 BaseAddress, (LPCWSTR)info->Type,
316 level > 1 ? (LPCWSTR)info->Name : L"",
317 level > 2 ? info->Language : 0, level );
318 }
319
321 if (NT_SUCCESS(status))
322 *addr = res;
323 }
325 {
327 }
328 _SEH2_END;
329 return status;
330}
331
332
333#define NAME_FROM_RESOURCE_ENTRY(RootDirectory, Entry) \
334 ((Entry)->NameIsString ? (ULONG_PTR)(RootDirectory) + (Entry)->NameOffset : (Entry)->Id)
335
336static
337LONG
339 _In_ PUCHAR ResourceData,
342{
343 PIMAGE_RESOURCE_DIR_STRING_U ResourceString;
344 PWSTR String1, String2;
345 USHORT ResourceStringLength;
346 WCHAR Char1, Char2;
347
348 /* Check if the resource name is an ID */
349 if (CompareName <= USHRT_MAX)
350 {
351 /* Just compare the 2 IDs */
352 return (CompareName - Entry->Id);
353 }
354 else
355 {
356 /* Get the resource string */
357 ResourceString = (PIMAGE_RESOURCE_DIR_STRING_U)(ResourceData +
358 Entry->NameOffset);
359
360 /* Get the string length */
361 ResourceStringLength = ResourceString->Length;
362
363 String1 = ResourceString->NameString;
365
366 /* Loop all characters of the resource string */
367 while (ResourceStringLength--)
368 {
369 /* Get the next characters */
370 Char1 = *String1++;
371 Char2 = *String2++;
372
373 /* Check if they don't match, or if the compare string ends */
374 if ((Char1 != Char2) || (Char2 == 0))
375 {
376 /* They don't match, fail */
377 return Char2 - Char1;
378 }
379 }
380
381 /* All characters match, check if the compare string ends here */
382 return (*String2 == 0) ? 0 : 1;
383 }
384}
385
387NTAPI
389 _In_ PVOID ImageBase,
390 _In_ PLDR_RESOURCE_INFO ResourceInfo,
394{
395 PUCHAR ResourceData;
397 ULONG i, j, k;
398 ULONG NumberOfTypeEntries, NumberOfNameEntries, NumberOfLangEntries;
399 ULONG Count, MaxResourceCount;
400 PIMAGE_RESOURCE_DIRECTORY TypeDirectory, NameDirectory, LangDirectory;
401 PIMAGE_RESOURCE_DIRECTORY_ENTRY TypeEntry, NameEntry, LangEntry;
403 ULONG Size;
404 LONG Result;
405
406 /* If the caller wants data, get the maximum count of entries */
407 MaxResourceCount = (Resources != NULL) ? *ResourceCount : 0;
408
409 /* Default to 0 */
410 *ResourceCount = 0;
411
412 /* Locate the resource directory */
413 ResourceData = RtlImageDirectoryEntryToData(ImageBase,
414 TRUE,
416 &Size);
417 if (ResourceData == NULL)
419
420 /* The type directory is at the root, followed by the entries */
421 TypeDirectory = (PIMAGE_RESOURCE_DIRECTORY)ResourceData;
422 TypeEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(TypeDirectory + 1);
423
424 /* Get the number of entries in the type directory */
425 NumberOfTypeEntries = TypeDirectory->NumberOfNamedEntries +
426 TypeDirectory->NumberOfIdEntries;
427
428 /* Start with 0 resources and status success */
430 Count = 0;
431
432 /* Loop all entries in the type directory */
433 for (i = 0; i < NumberOfTypeEntries; ++i, ++TypeEntry)
434 {
435 /* Check if comparison of types is requested */
437 {
438 /* Compare the type with the requested Type */
439 Result = LdrpCompareResourceNames_U(ResourceData,
440 TypeEntry,
441 ResourceInfo->Type);
442
443 /* Not equal, continue with next entry */
444 if (Result != 0) continue;
445 }
446
447 /* The entry must point to the name directory */
448 if (!TypeEntry->DataIsDirectory)
449 {
451 }
452
453 /* Get a pointer to the name subdirectory and it's first entry */
454 NameDirectory = (PIMAGE_RESOURCE_DIRECTORY)(ResourceData +
455 TypeEntry->OffsetToDirectory);
456 NameEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(NameDirectory + 1);
457
458 /* Get the number of entries in the name directory */
459 NumberOfNameEntries = NameDirectory->NumberOfNamedEntries +
460 NameDirectory->NumberOfIdEntries;
461
462 /* Loop all entries in the name directory */
463 for (j = 0; j < NumberOfNameEntries; ++j, ++NameEntry)
464 {
465 /* Check if comparison of names is requested */
467 {
468 /* Compare the name with the requested name */
469 Result = LdrpCompareResourceNames_U(ResourceData,
470 NameEntry,
471 ResourceInfo->Name);
472
473 /* Not equal, continue with next entry */
474 if (Result != 0) continue;
475 }
476
477 /* The entry must point to the language directory */
478 if (!NameEntry->DataIsDirectory)
479 {
481 }
482
483 /* Get a pointer to the language subdirectory and it's first entry */
484 LangDirectory = (PIMAGE_RESOURCE_DIRECTORY)(ResourceData +
485 NameEntry->OffsetToDirectory);
486 LangEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(LangDirectory + 1);
487
488 /* Get the number of entries in the language directory */
489 NumberOfLangEntries = LangDirectory->NumberOfNamedEntries +
490 LangDirectory->NumberOfIdEntries;
491
492 /* Loop all entries in the language directory */
493 for (k = 0; k < NumberOfLangEntries; ++k, ++LangEntry)
494 {
495 /* Check if comparison of languages is requested */
497 {
498 /* Compare the language with the requested language */
499 Result = LdrpCompareResourceNames_U(ResourceData,
500 LangEntry,
501 ResourceInfo->Language);
502
503 /* Not equal, continue with next entry */
504 if (Result != 0) continue;
505 }
506
507 /* This entry must point to data */
508 if (LangEntry->DataIsDirectory)
509 {
511 }
512
513 /* Get a pointer to the data entry */
514 DataEntry = (PIMAGE_RESOURCE_DATA_ENTRY)(ResourceData +
515 LangEntry->OffsetToData);
516
517 /* Check if there is still space to store the data */
518 if (Count < MaxResourceCount)
519 {
520 /* There is, fill the entry */
521 Resources[Count].Type =
522 NAME_FROM_RESOURCE_ENTRY(ResourceData, TypeEntry);
523 Resources[Count].Name =
524 NAME_FROM_RESOURCE_ENTRY(ResourceData, NameEntry);
525 Resources[Count].Language =
526 NAME_FROM_RESOURCE_ENTRY(ResourceData, LangEntry);
527 Resources[Count].Data = (PUCHAR)ImageBase + DataEntry->OffsetToData;
528 Resources[Count].Reserved = 0;
529 Resources[Count].Size = DataEntry->Size;
530 }
531 else
532 {
533 /* There is not enough space, save error status */
535 }
536
537 /* Count this resource */
538 ++Count;
539 }
540 }
541 }
542
543 /* Return the number of matching resources */
545 return Status;
546}
DWORD Id
std::map< E_MODULE, HMODULE > mod
Definition: LocaleTests.cpp:66
unsigned int dir
Definition: maze.c:112
LONG NTSTATUS
Definition: precomp.h:26
static BOOL CompareName(LPCWSTR pszName1, LPCWSTR pszName2)
Definition: find.c:60
_Inout_ PIRP _In_ NTSTATUS ExceptionCode
Definition: cdprocs.h:1774
_Acquires_exclusive_lock_ Resource _Acquires_shared_lock_ Resource _Inout_ PERESOURCE Resource
Definition: cdprocs.h:843
Definition: list.h:37
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define RtlImageDirectoryEntryToData
Definition: compat.h:809
#define RtlImageRvaToVa
Definition: compat.h:807
#define RtlImageNtHeader
Definition: compat.h:806
#define USHRT_MAX
Definition: limits.h:23
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
Status
Definition: gdiplustypes.h:25
GLint level
Definition: gl.h:1546
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLenum const GLvoid * addr
Definition: glext.h:9621
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
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 GLint GLint j
Definition: glfuncs.h:250
static ULONG ResourceCount
Definition: inbv.c:50
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define EXCEPTION_CONTINUE_SEARCH
Definition: excpt.h:91
uint32_t entry
Definition: isohybrid.c:63
NTSTATUS NTAPI LdrAccessResource(_In_ PVOID BaseAddress, _In_ PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry, _Out_opt_ PVOID *Resource, _Out_opt_ PULONG Size)
NTSTATUS NTAPI LdrFindResource_U(_In_ PVOID BaseAddress, _In_ PLDR_RESOURCE_INFO ResourceInfo, _In_ ULONG Level, _Out_ PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry)
NTSTATUS NTAPI LdrFindResourceDirectory_U(_In_ PVOID BaseAddress, _In_ PLDR_RESOURCE_INFO ResourceInfo, _In_ ULONG Level, _Out_ PIMAGE_RESOURCE_DIRECTORY *ResourceDirectory)
#define RESOURCE_NAME_LEVEL
Definition: ldrtypes.h:31
#define RESOURCE_LANGUAGE_LEVEL
Definition: ldrtypes.h:32
#define RESOURCE_TYPE_LEVEL
Definition: ldrtypes.h:30
#define EXCEPTION_ACCESS_VIOLATION
Definition: minwinbase.h:44
#define EXCEPTION_PRIV_INSTRUCTION
Definition: minwinbase.h:58
static PVOID ptr
Definition: dispmode.c:27
#define min(a, b)
Definition: monoChain.cc:55
int k
Definition: mpi.c:3369
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
_In_ const STRING * String2
Definition: rtlfuncs.h:2404
#define _Inout_
Definition: no_sal2.h:162
#define _In_
Definition: no_sal2.h:158
#define _Out_writes_to_(s, c)
Definition: no_sal2.h:188
int Count
Definition: noreturn.cpp:7
#define STATUS_INVALID_IMAGE_FORMAT
Definition: ntstatus.h:453
#define STATUS_RESOURCE_DATA_NOT_FOUND
Definition: ntstatus.h:467
struct _IMAGE_RESOURCE_DIRECTORY * PIMAGE_RESOURCE_DIRECTORY
struct _IMAGE_RESOURCE_DATA_ENTRY * PIMAGE_RESOURCE_DATA_ENTRY
struct _IMAGE_RESOURCE_DIR_STRING_U * PIMAGE_RESOURCE_DIR_STRING_U
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
struct _IMAGE_RESOURCE_DIRECTORY_ENTRY * PIMAGE_RESOURCE_DIRECTORY_ENTRY
#define IMAGE_DIRECTORY_ENTRY_RESOURCE
Definition: pedump.c:261
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:181
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:82
#define _SEH2_END
Definition: pseh2_64.h:171
#define _SEH2_TRY
Definition: pseh2_64.h:71
const WCHAR * str
IMAGE_RESOURCE_DIRECTORY * find_entry_by_id(IMAGE_RESOURCE_DIRECTORY *dir, WORD id, void *root, int want_dir)
Definition: res.c:95
int page_fault(ULONG ExceptionCode)
Definition: res.c:37
static int is_data_file_module(PVOID BaseAddress)
Definition: res.c:50
static int CompareResourceString(const wchar_t *SearchString, const IMAGE_RESOURCE_DIR_STRING_U *ResourceString)
Definition: res.c:133
static NTSTATUS LdrpAccessResource(PVOID BaseAddress, IMAGE_RESOURCE_DATA_ENTRY *entry, void **ptr, ULONG *size)
Definition: res.c:215
#define NAME_FROM_RESOURCE_ENTRY(RootDirectory, Entry)
Definition: res.c:333
IMAGE_RESOURCE_DIRECTORY * find_entry_by_name(IMAGE_RESOURCE_DIRECTORY *dir, LPCWSTR name, void *root, int want_dir)
Definition: res.c:177
int push_language(USHORT *list, ULONG pos, WORD lang)
Definition: res.c:61
NTSTATUS NTAPI LdrEnumResources(_In_ PVOID ImageBase, _In_ PLDR_RESOURCE_INFO ResourceInfo, _In_ ULONG Level, _Inout_ ULONG *ResourceCount, _Out_writes_to_(*ResourceCount, *ResourceCount) LDR_ENUM_RESOURCE_INFO *Resources)
Definition: res.c:388
IMAGE_RESOURCE_DIRECTORY * find_first_entry(IMAGE_RESOURCE_DIRECTORY *dir, void *root, int want_dir)
Definition: res.c:75
NTSTATUS find_entry(PVOID BaseAddress, LDR_RESOURCE_INFO *info, ULONG level, void **ret, int want_dir)
Definition: libsupp.c:569
static LONG LdrpCompareResourceNames_U(_In_ PUCHAR ResourceData, _In_ PIMAGE_RESOURCE_DIRECTORY_ENTRY Entry, _In_ ULONG_PTR CompareName)
Definition: res.c:338
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
base of all file and directory entries
Definition: entries.h:83
Definition: pedump.c:458
DWORD OffsetToData
Definition: pedump.c:459
DWORD Size
Definition: pedump.c:460
Definition: pedump.c:414
DWORD OffsetToData
Definition: pedump.c:416
ULONG OffsetToDirectory
Definition: ntimage.h:194
ULONG DataIsDirectory
Definition: ntimage.h:195
DWORD Name
Definition: pedump.c:415
ULONG_PTR Language
Definition: ldrtypes.h:187
ULONG_PTR Name
Definition: ldrtypes.h:186
ULONG_PTR Type
Definition: ldrtypes.h:185
Definition: name.c:39
Definition: ps.c:97
#define max(a, b)
Definition: svc.c:63
uint16_t * PWSTR
Definition: typedefs.h:56
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
static const WCHAR lang[]
Definition: wbemdisp.c:287
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180