3 * PE (Portable Execute) File Resources
5 * Copyright 1995 Thomas Sandford
6 * Copyright 1996 Martin von Loewis
8 * Based on the Win16 resource handling code in loader/resource.c
9 * Copyright 1993 Robert J. Amstadt
10 * Copyright 1995 Alexandre Julliard
12 * This is not even at ALPHA level yet. Don't expect it to work!
15 #include <sys/types.h>
23 #include "resource32.h"
24 #include "stackframe.h"
32 int language
= 0x0409;
34 #define PrintIdA(name) \
35 if (HIWORD((DWORD)name)) \
36 dprintf_resource( stddeb, "'%s'", name); \
38 dprintf_resource( stddeb, "#%04x", LOWORD(name));
39 #define PrintIdW(name)
42 /**********************************************************************
45 * Helper function - goes down one level of PE resource tree
48 PIMAGE_RESOURCE_DIRECTORY
GetResDirEntryW(PIMAGE_RESOURCE_DIRECTORY resdirptr
,
53 PIMAGE_RESOURCE_DIRECTORY_ENTRY entryTable
;
57 /* FIXME: what about #xxx names? */
58 entryTable
= (PIMAGE_RESOURCE_DIRECTORY_ENTRY
) (
60 sizeof(IMAGE_RESOURCE_DIRECTORY
));
61 namelen
= lstrlen32W(name
);
62 for (entrynum
= 0; entrynum
< resdirptr
->NumberOfNamedEntries
; entrynum
++)
64 PIMAGE_RESOURCE_DIR_STRING_U str
=
65 (PIMAGE_RESOURCE_DIR_STRING_U
) (root
+
66 (entryTable
[entrynum
].Name
& 0x7fffffff));
67 if(namelen
!= str
->Length
)
69 if(lstrncmpi32W(name
,str
->NameString
,str
->Length
)==0)
70 return (PIMAGE_RESOURCE_DIRECTORY
) (
72 (entryTable
[entrynum
].OffsetToData
& 0x7fffffff));
76 entryTable
= (PIMAGE_RESOURCE_DIRECTORY_ENTRY
) (
78 sizeof(IMAGE_RESOURCE_DIRECTORY
) +
79 resdirptr
->NumberOfNamedEntries
* sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY
));
80 for (entrynum
= 0; entrynum
< resdirptr
->NumberOfIdEntries
; entrynum
++)
81 if ((DWORD
)entryTable
[entrynum
].Name
== (DWORD
)name
)
82 return (PIMAGE_RESOURCE_DIRECTORY
) (
84 (entryTable
[entrynum
].OffsetToData
& 0x7fffffff));
89 /**********************************************************************
92 * Helper function - goes down one level of PE resource tree
95 PIMAGE_RESOURCE_DIRECTORY
GetResDirEntryA(PIMAGE_RESOURCE_DIRECTORY resdirptr
,
100 PIMAGE_RESOURCE_DIRECTORY ret
;
102 if (HIWORD((DWORD
)name
))
103 xname
= STRING32_DupAnsiToUni(name
);
105 xname
= (LPWSTR
)name
;
107 ret
=GetResDirEntryW(resdirptr
,xname
,root
);
108 if (HIWORD((DWORD
)name
))
113 /**********************************************************************
116 HANDLE32
PE_FindResource32W( HINSTANCE hModule
, LPCWSTR name
, LPCWSTR type
)
120 PIMAGE_RESOURCE_DIRECTORY resdirptr
;
124 hModule
= GetExePtr( hModule
); /* In case we were passed an hInstance */
125 dprintf_resource(stddeb
, "FindResource: module=%08x type=", hModule
);
127 dprintf_resource( stddeb
, " name=" );
129 dprintf_resource( stddeb
, "\n" );
130 if (!(pModule
= MODULE_GetPtr( hModule
))) return 0;
131 if (!(pModule
->flags
& NE_FFLAGS_WIN32
)) return 0; /* FIXME? */
132 if (!(pe
= pModule
->pe_module
) || !pe
->pe_resource
) return 0;
134 resdirptr
= (PIMAGE_RESOURCE_DIRECTORY
) pe
->pe_resource
;
135 root
= (DWORD
) resdirptr
;
136 if ((resdirptr
= GetResDirEntryW(resdirptr
, type
, root
)) == NULL
)
138 if ((resdirptr
= GetResDirEntryW(resdirptr
, name
, root
)) == NULL
)
140 result
= (HANDLE32
)GetResDirEntryW(resdirptr
, (LPCWSTR
)language
, root
);
141 /* Try LANG_NEUTRAL, too */
143 return (HANDLE32
)GetResDirEntryW(resdirptr
, (LPCWSTR
)0, root
);
148 /**********************************************************************
151 HANDLE32
PE_LoadResource32( HINSTANCE hModule
, HANDLE32 hRsrc
)
156 if (!hModule
) hModule
= GetTaskDS(); /* FIXME: see FindResource32W */
157 hModule
= GetExePtr( hModule
); /* In case we were passed an hInstance */
158 dprintf_resource(stddeb
, "PE_LoadResource32: module=%04x res=%04x\n",
160 if (!hRsrc
) return 0;
162 if (!(pModule
= MODULE_GetPtr( hModule
))) return 0;
163 if (!(pModule
->flags
& NE_FFLAGS_WIN32
)) return 0; /* FIXME? */
164 if (!(pe
= pModule
->pe_module
) || !pe
->pe_resource
) return 0;
165 return (HANDLE32
) (pe
->load_addr
+((PIMAGE_RESOURCE_DATA_ENTRY
)hRsrc
)->OffsetToData
);