#ifndef WINELIB /* * (c) 1994 Erik Bos * * based on Eric Youndale's pe-test and: * * ftp.microsoft.com:/pub/developer/MSDN/CD8/PEFILE.ZIP */ #include #include #include #include #include #include #include #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 */