| #ifndef WINELIB |
| /* |
| * (c) 1994 Erik Bos <erik@xs4all.nl> |
| * |
| * based on Eric Youndale's pe-test and: |
| * |
| * ftp.microsoft.com:/pub/developer/MSDN/CD8/PEFILE.ZIP |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| #include "windows.h" |
| #include "ldt.h" |
| #include "neexe.h" |
| #include "peexe.h" |
| #include "pe_image.h" |
| #include "resource.h" |
| #include "stddebug.h" |
| /* #define DEBUG_RESOURCE */ |
| #include "debug.h" |
| |
| #if 0 |
| |
| static int |
| find_lang(char *root, struct PE_Resource_Directory *resource, RESOURCE *r) |
| { |
| struct PE_Directory_Entry *type_dir; |
| struct PE_Resource_Leaf_Entry *leaf; |
| |
| type_dir = (struct PE_Directory_Entry *)(resource + 1); |
| type_dir += resource->NumberOfNamedEntries; |
| |
| /* grab the 1st resource available */ |
| leaf = (struct PE_Resource_Leaf_Entry *) (root + type_dir->OffsetToData); |
| dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n", (int) type_dir->Name); |
| dprintf_resource(stddeb, "\t\taddress %ld, size %ld, language id %ld\n", leaf->OffsetToData, leaf->Size, leaf->CodePage); |
| r->offset = leaf->OffsetToData - r->wpnt->pe->resource_offset; |
| r->size = leaf->Size; |
| printf("\t\toffset %d, size %d\n", r->offset, r->size); |
| return 1; |
| |
| /* for(i=0; i< resource->NumberOfIdEntries; i++) { |
| leaf = (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)); |
| dprintf_resource(stddeb, "\t\tPE_findlang: id %8x\n", |
| (int) type_dir->Name); |
| dprintf_resource(stddeb, "\t\t%x %x %x\n", leaf->OffsetToData, |
| leaf->Size, leaf->CodePage); |
| type_dir++; |
| } */ |
| } |
| |
| static int |
| find_resource(char *root, struct PE_Resource_Directory *resource, |
| LPSTR resource_name, RESOURCE *r) |
| { |
| int i; |
| char res_name[256]; |
| struct PE_Directory_Entry *type_dir; |
| struct PE_Directory_Name_String_U *name; |
| |
| type_dir = (struct PE_Directory_Entry *)(resource + 1); |
| |
| if (HIWORD((DWORD)resource_name)) { |
| for(i=0; i< resource->NumberOfNamedEntries; i++) { |
| name = (struct PE_Directory_Name_String_U *)(root + (type_dir->Name & ~IMAGE_RESOURCE_NAME_IS_STRING)); |
| memset(res_name, 0, sizeof(res_name)); |
| my_wcstombs(res_name, name->NameString, name->Length); |
| dprintf_resource(stddeb, "\tPE_findresource: name %s\n", res_name); |
| if (lstrcmpi(res_name, resource_name) == 0) |
| return find_lang(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), r); |
| type_dir++; |
| } |
| } else { |
| type_dir += resource->NumberOfNamedEntries; |
| for(i=0; i< resource->NumberOfIdEntries; i++) { |
| dprintf_resource(stddeb, "\tPE_findresource: name %8x\n", (int) type_dir->Name); |
| if (type_dir->Name == ((int) resource_name & 0xff)) |
| return find_lang(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), r); |
| type_dir++; |
| } |
| } |
| return 0; |
| } |
| |
| static int |
| find_type(struct PE_Resource_Directory *resource, LPSTR resource_name, |
| LPSTR type_name) |
| { |
| int i; |
| char *root, res_name[256]; |
| struct PE_Directory_Entry *type_dir; |
| struct PE_Directory_Name_String_U *name; |
| |
| root = (char *) resource; |
| type_dir = (struct PE_Directory_Entry *)(resource + 1); |
| |
| if (HIWORD((DWORD)type_name)) { |
| for(i=0; i< resource->NumberOfNamedEntries; i++) { |
| name = (struct PE_Directory_Name_String_U *)(root + (type_dir->Name & ~IMAGE_RESOURCE_NAME_IS_STRING)); |
| memset(res_name, 0, sizeof(res_name)); |
| my_wcstombs(res_name, name->NameString, name->Length); |
| dprintf_resource(stddeb, "PE_findtype: type %s\n", |
| res_name); |
| if (lstrcmpi(res_name, type_name) == 0) |
| return find_resource(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), resource_name, r); |
| type_dir++; |
| } |
| } else { |
| type_dir += resource->NumberOfNamedEntries; |
| for(i=0; i< resource->NumberOfIdEntries; i++) { |
| dprintf_resource(stddeb, "PE_findtype: type %8x\n", (int) type_dir->Name); |
| if (type_dir->Name == ((int) type_name & 0xff)) |
| return find_resource(root, (struct PE_Resource_Directory *) (root + (type_dir->OffsetToData & ~IMAGE_RESOURCE_DATA_IS_DIRECTORY)), resource_name, r); |
| type_dir++; |
| } |
| } |
| return 0; |
| } |
| |
| /********************************************************************** |
| * PE_FindResource [KERNEL.60] |
| */ |
| int |
| PE_FindResource(HANDLE instance, SEGPTR resource_name, SEGPTR type_name, |
| RESOURCE *r) |
| { |
| dprintf_resource(stddeb, "PE_FindResource hInst=%04X typename=%08X resname=%08X\n", |
| instance, (int) type_name, (int) resource_name); |
| if (HIWORD(resource_name)) |
| { |
| char *resource_name_ptr = PTR_SEG_TO_LIN( resource_name ); |
| if (resource_name_ptr[0] == '#') |
| resource_name = (SEGPTR) atoi(resource_name_ptr + 1); |
| else |
| resource_name = (SEGPTR)resource_name_ptr; |
| } |
| if (HIWORD(type_name)) |
| { |
| char *type_name_ptr = PTR_SEG_TO_LIN( type_name ); |
| if (type_name_ptr[0] == '#') |
| type_name = (SEGPTR) atoi(type_name_ptr + 1); |
| else |
| type_name = (SEGPTR) type_name_ptr; |
| } |
| return find_type(r->wpnt->pe->pe_resource, resource_name, type_name); |
| } |
| #endif |
| |
| #endif /* WINELIB */ |