blob: b0d62035857b00e58ee8d542b617f3b9503b729c [file] [log] [blame]
Alexandre Julliardade697e1995-11-26 13:59:11 +00001#ifndef WINELIB
Alexandre Julliardaca05781994-10-17 18:12:41 +00002/*
Alexandre Julliard234bc241994-12-10 13:02:28 +00003 * (c) 1994 Erik Bos <erik@xs4all.nl>
Alexandre Julliardaca05781994-10-17 18:12:41 +00004 *
5 * based on Eric Youndale's pe-test and:
6 *
7 * ftp.microsoft.com:/pub/developer/MSDN/CD8/PEFILE.ZIP
8 */
9
10#include <stdio.h>
11#include <stdlib.h>
12#include <string.h>
13#include <sys/types.h>
14#include <sys/stat.h>
15#include <fcntl.h>
16#include <unistd.h>
17#include "windows.h"
Alexandre Julliarde2abbb11995-03-19 17:39:39 +000018#include "ldt.h"
Alexandre Julliardaca05781994-10-17 18:12:41 +000019#include "neexe.h"
20#include "peexe.h"
21#include "dlls.h"
Alexandre Julliard234bc241994-12-10 13:02:28 +000022#include "pe_image.h"
Alexandre Julliardaca05781994-10-17 18:12:41 +000023#include "resource.h"
Alexandre Julliard3a405ba1994-10-30 16:25:19 +000024#include "stddebug.h"
25/* #define DEBUG_RESOURCE */
Alexandre Julliard3a405ba1994-10-30 16:25:19 +000026#include "debug.h"
Alexandre Julliardaca05781994-10-17 18:12:41 +000027
Alexandre Julliard594997c1995-04-30 10:05:20 +000028#if 0
Alexandre Julliardaca05781994-10-17 18:12:41 +000029
30static int
31find_lang(char *root, struct PE_Resource_Directory *resource, RESOURCE *r)
32{
Alexandre Julliardaca05781994-10-17 18:12:41 +000033 struct PE_Directory_Entry *type_dir;
34 struct PE_Resource_Leaf_Entry *leaf;
35
36 type_dir = (struct PE_Directory_Entry *)(resource + 1);
37 type_dir += resource->NumberOfNamedEntries;
38
39 /* grab the 1st resource available */
40 leaf = (struct PE_Resource_Leaf_Entry *) (root + type_dir->OffsetToData);
Alexandre Julliard3a405ba1994-10-30 16:25:19 +000041 dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n", (int) type_dir->Name);
42 dprintf_resource(stddeb, "\t\taddress %ld, size %ld, language id %ld\n", leaf->OffsetToData, leaf->Size, leaf->CodePage);
Alexandre Julliardaca05781994-10-17 18:12:41 +000043 r->offset = leaf->OffsetToData - r->wpnt->pe->resource_offset;
44 r->size = leaf->Size;
45 printf("\t\toffset %d, size %d\n", r->offset, r->size);
46 return 1;
47
48/* for(i=0; i< resource->NumberOfIdEntries; i++) {
49 leaf = (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY));
Alexandre Julliard3a405ba1994-10-30 16:25:19 +000050 dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n",
51 (int) type_dir->Name);
52 dprintf_resource(stddeb, "\t\t%x %x %x\n", leaf->OffsetToData,
53 leaf->Size, leaf->CodePage);
Alexandre Julliardaca05781994-10-17 18:12:41 +000054 type_dir++;
55 } */
56}
57
58static int
59find_resource(char *root, struct PE_Resource_Directory *resource,
60 LPSTR resource_name, RESOURCE *r)
61{
62 int i;
63 char res_name[256];
64 struct PE_Directory_Entry *type_dir;
65 struct PE_Directory_Name_String_U *name;
66
67 type_dir = (struct PE_Directory_Entry *)(resource + 1);
68
69 if (HIWORD((DWORD)resource_name)) {
70 for(i=0; i< resource->NumberOfNamedEntries; i++) {
71 name = (struct PE_Directory_Name_String_U *)(root + (type_dir->Name & ~IMAGE_RESOURCE_NAME_IS_STRING));
72 memset(res_name, 0, sizeof(res_name));
73 my_wcstombs(res_name, name->NameString, name->Length);
Alexandre Julliard3a405ba1994-10-30 16:25:19 +000074 dprintf_resource(stddeb, "\tPE_findresource: name %s\n", res_name);
Alexandre Julliard4f8c37b1996-01-14 18:12:01 +000075 if (lstrcmpi(res_name, resource_name) == 0)
Alexandre Julliardaca05781994-10-17 18:12:41 +000076 return find_lang(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), r);
77 type_dir++;
78 }
79 } else {
80 type_dir += resource->NumberOfNamedEntries;
81 for(i=0; i< resource->NumberOfIdEntries; i++) {
Alexandre Julliard3a405ba1994-10-30 16:25:19 +000082 dprintf_resource(stddeb, "\tPE_findresource: name %8x\n", (int) type_dir->Name);
Alexandre Julliardaca05781994-10-17 18:12:41 +000083 if (type_dir->Name == ((int) resource_name & 0xff))
84 return find_lang(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), r);
85 type_dir++;
86 }
87 }
88 return 0;
89}
90
91static int
92find_type(struct PE_Resource_Directory *resource, LPSTR resource_name,
Alexandre Julliard594997c1995-04-30 10:05:20 +000093 LPSTR type_name)
Alexandre Julliardaca05781994-10-17 18:12:41 +000094{
95 int i;
96 char *root, res_name[256];
97 struct PE_Directory_Entry *type_dir;
98 struct PE_Directory_Name_String_U *name;
99
100 root = (char *) resource;
101 type_dir = (struct PE_Directory_Entry *)(resource + 1);
102
103 if (HIWORD((DWORD)type_name)) {
104 for(i=0; i< resource->NumberOfNamedEntries; i++) {
105 name = (struct PE_Directory_Name_String_U *)(root + (type_dir->Name & ~IMAGE_RESOURCE_NAME_IS_STRING));
106 memset(res_name, 0, sizeof(res_name));
107 my_wcstombs(res_name, name->NameString, name->Length);
Alexandre Julliard3a405ba1994-10-30 16:25:19 +0000108 dprintf_resource(stddeb, "PE_findtype: type %s\n",
109 res_name);
Alexandre Julliard4f8c37b1996-01-14 18:12:01 +0000110 if (lstrcmpi(res_name, type_name) == 0)
Alexandre Julliardaca05781994-10-17 18:12:41 +0000111 return find_resource(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), resource_name, r);
112 type_dir++;
113 }
114 } else {
115 type_dir += resource->NumberOfNamedEntries;
116 for(i=0; i< resource->NumberOfIdEntries; i++) {
Alexandre Julliard3a405ba1994-10-30 16:25:19 +0000117 dprintf_resource(stddeb, "PE_findtype: type %8x\n", (int) type_dir->Name);
Alexandre Julliardaca05781994-10-17 18:12:41 +0000118 if (type_dir->Name == ((int) type_name & 0xff))
119 return find_resource(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), resource_name, r);
120 type_dir++;
121 }
122 }
123 return 0;
124}
125
126/**********************************************************************
127 * PE_FindResource [KERNEL.60]
128 */
129int
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000130PE_FindResource(HANDLE instance, SEGPTR resource_name, SEGPTR type_name,
Alexandre Julliardaca05781994-10-17 18:12:41 +0000131 RESOURCE *r)
132{
Alexandre Julliard3a405ba1994-10-30 16:25:19 +0000133 dprintf_resource(stddeb, "PE_FindResource hInst=%04X typename=%08X resname=%08X\n",
Alexandre Julliardaca05781994-10-17 18:12:41 +0000134 instance, (int) type_name, (int) resource_name);
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000135 if (HIWORD(resource_name))
136 {
137 char *resource_name_ptr = PTR_SEG_TO_LIN( resource_name );
138 if (resource_name_ptr[0] == '#')
139 resource_name = (SEGPTR) atoi(resource_name_ptr + 1);
140 else
141 resource_name = (SEGPTR)resource_name_ptr;
142 }
143 if (HIWORD(type_name))
144 {
145 char *type_name_ptr = PTR_SEG_TO_LIN( type_name );
146 if (type_name_ptr[0] == '#')
147 type_name = (SEGPTR) atoi(type_name_ptr + 1);
148 else
149 type_name = (SEGPTR) type_name_ptr;
150 }
Alexandre Julliard594997c1995-04-30 10:05:20 +0000151 return find_type(r->wpnt->pe->pe_resource, resource_name, type_name);
Alexandre Julliardaca05781994-10-17 18:12:41 +0000152}
Alexandre Julliard594997c1995-04-30 10:05:20 +0000153#endif
Alexandre Julliardade697e1995-11-26 13:59:11 +0000154
155#endif /* WINELIB */