2 * (c) 1994 Erik Bos <erik@hacktic.nl>
4 * based on Eric Youndale's pe-test and:
6 * ftp.microsoft.com:/pub/developer/MSDN/CD8/PEFILE.ZIP
12 #include <sys/types.h>
22 /* #define DEBUG_RESOURCE */
23 /* #undef DEBUG_RESOURCE */
28 find_lang(char *root
, struct PE_Resource_Directory
*resource
, RESOURCE
*r
)
30 struct PE_Directory_Entry
*type_dir
;
31 struct PE_Resource_Leaf_Entry
*leaf
;
33 type_dir
= (struct PE_Directory_Entry
*)(resource
+ 1);
34 type_dir
+= resource
->NumberOfNamedEntries
;
36 /* grab the 1st resource available */
37 leaf
= (struct PE_Resource_Leaf_Entry
*) (root
+ type_dir
->OffsetToData
);
38 dprintf_resource(stddeb
, "\t\tPE_findlang: id %8x\n", (int) type_dir
->Name
);
39 dprintf_resource(stddeb
, "\t\taddress %ld, size %ld, language id %ld\n", leaf
->OffsetToData
, leaf
->Size
, leaf
->CodePage
);
40 r
->offset
= leaf
->OffsetToData
- r
->wpnt
->pe
->resource_offset
;
42 printf("\t\toffset %d, size %d\n", r
->offset
, r
->size
);
45 /* for(i=0; i< resource->NumberOfIdEntries; i++) {
46 leaf = (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY));
47 dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n",
48 (int) type_dir->Name);
49 dprintf_resource(stddeb, "\t\t%x %x %x\n", leaf->OffsetToData,
50 leaf->Size, leaf->CodePage);
56 find_resource(char *root
, struct PE_Resource_Directory
*resource
,
57 LPSTR resource_name
, RESOURCE
*r
)
61 struct PE_Directory_Entry
*type_dir
;
62 struct PE_Directory_Name_String_U
*name
;
64 type_dir
= (struct PE_Directory_Entry
*)(resource
+ 1);
66 if (HIWORD((DWORD
)resource_name
)) {
67 for(i
=0; i
< resource
->NumberOfNamedEntries
; i
++) {
68 name
= (struct PE_Directory_Name_String_U
*)(root
+ (type_dir
->Name
& ~IMAGE_RESOURCE_NAME_IS_STRING
));
69 memset(res_name
, 0, sizeof(res_name
));
70 my_wcstombs(res_name
, name
->NameString
, name
->Length
);
71 dprintf_resource(stddeb
, "\tPE_findresource: name %s\n", res_name
);
72 if (strcasecmp(res_name
, resource_name
) == 0)
73 return find_lang(root
, (struct PE_Resource_Directory
*) (root
+ (type_dir
->OffsetToData
& ~IMAGE_RESOURCE_DATA_IS_DIRECTORY
)), r
);
77 type_dir
+= resource
->NumberOfNamedEntries
;
78 for(i
=0; i
< resource
->NumberOfIdEntries
; i
++) {
79 dprintf_resource(stddeb
, "\tPE_findresource: name %8x\n", (int) type_dir
->Name
);
80 if (type_dir
->Name
== ((int) resource_name
& 0xff))
81 return find_lang(root
, (struct PE_Resource_Directory
*) (root
+ (type_dir
->OffsetToData
& ~IMAGE_RESOURCE_DATA_IS_DIRECTORY
)), r
);
89 find_type(struct PE_Resource_Directory
*resource
, LPSTR resource_name
,
90 LPSTR type_name
, RESOURCE
*r
)
93 char *root
, res_name
[256];
94 struct PE_Directory_Entry
*type_dir
;
95 struct PE_Directory_Name_String_U
*name
;
97 root
= (char *) resource
;
98 type_dir
= (struct PE_Directory_Entry
*)(resource
+ 1);
100 if (HIWORD((DWORD
)type_name
)) {
101 for(i
=0; i
< resource
->NumberOfNamedEntries
; i
++) {
102 name
= (struct PE_Directory_Name_String_U
*)(root
+ (type_dir
->Name
& ~IMAGE_RESOURCE_NAME_IS_STRING
));
103 memset(res_name
, 0, sizeof(res_name
));
104 my_wcstombs(res_name
, name
->NameString
, name
->Length
);
105 dprintf_resource(stddeb
, "PE_findtype: type %s\n",
107 if (strcasecmp(res_name
, type_name
) == 0)
108 return find_resource(root
, (struct PE_Resource_Directory
*) (root
+ (type_dir
->OffsetToData
& ~IMAGE_RESOURCE_DATA_IS_DIRECTORY
)), resource_name
, r
);
112 type_dir
+= resource
->NumberOfNamedEntries
;
113 for(i
=0; i
< resource
->NumberOfIdEntries
; i
++) {
114 dprintf_resource(stddeb
, "PE_findtype: type %8x\n", (int) type_dir
->Name
);
115 if (type_dir
->Name
== ((int) type_name
& 0xff))
116 return find_resource(root
, (struct PE_Resource_Directory
*) (root
+ (type_dir
->OffsetToData
& ~IMAGE_RESOURCE_DATA_IS_DIRECTORY
)), resource_name
, r
);
123 /**********************************************************************
124 * PE_FindResource [KERNEL.60]
127 PE_FindResource(HANDLE instance
, LPSTR resource_name
, LPSTR type_name
,
130 dprintf_resource(stddeb
, "PE_FindResource hInst=%04X typename=%08X resname=%08X\n",
131 instance
, (int) type_name
, (int) resource_name
);
132 if (HIWORD((DWORD
)resource_name
))
133 if (resource_name
[0] == '#')
134 resource_name
= (LPSTR
) atoi(resource_name
+ 1);
136 if (HIWORD((DWORD
)type_name
))
137 if (type_name
[0] == '#')
138 type_name
= (LPSTR
) atoi(type_name
+ 1);
140 return find_type(r
->wpnt
->pe
->pe_resource
, resource_name
, type_name
,r
);