/*********************************************************************** * NE_FindNameTableId * * Find the type and resource id from their names. * Return value is MAKELONG( typeId, resId ), or 0 if not found. */ static DWORD NE_FindNameTableId( NE_MODULE *pModule, LPCSTR typeId, LPCSTR resId ) { NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->ne_rsrctab + 2); NE_NAMEINFO *pNameInfo; HGLOBAL16 handle; WORD *p; DWORD ret = 0; int count; for (; pTypeInfo->type_id != 0; pTypeInfo = (NE_TYPEINFO *)((char*)(pTypeInfo+1) + pTypeInfo->count * sizeof(NE_NAMEINFO))) { if (pTypeInfo->type_id != 0x800f) continue; pNameInfo = (NE_NAMEINFO *)(pTypeInfo + 1); for (count = pTypeInfo->count; count > 0; count--, pNameInfo++) { TRACE("NameTable entry: type=%04x id=%04x\n", pTypeInfo->type_id, pNameInfo->id ); handle = LoadResource16( pModule->self, (HRSRC16)((char *)pNameInfo - (char *)pModule) ); for(p = (WORD*)LockResource16(handle); p && *p; p = (WORD *)((char*)p+*p)) { TRACE(" type=%04x '%s' id=%04x '%s'\n", p[1], (char *)(p+3), p[2], (char *)(p+3)+strlen((char *)(p+3))+1 ); /* Check for correct type */ if (p[1] & 0x8000) { if (!HIWORD(typeId)) continue; if (strcasecmp( typeId, (char *)(p + 3) )) continue; } else if (HIWORD(typeId) || (((DWORD)typeId & ~0x8000)!= p[1])) continue; /* Now check for the id */ if (p[2] & 0x8000) { if (!HIWORD(resId)) continue; if (strcasecmp( resId, (char*)(p+3)+strlen((char*)(p+3))+1 )) continue; } else if (HIWORD(resId) || ((LOWORD(resId) & ~0x8000) != p[2])) continue; /* If we get here, we've found the entry */ TRACE(" Found!\n" ); ret = MAKELONG( p[1], p[2] ); break; } FreeResource16( handle ); if (ret) return ret; } } return 0; }
/********************************************************************** * LockResource (KERNEL32.@) */ LPVOID WINAPI LockResource( HGLOBAL handle ) { TRACE("(%08x)\n", handle ); if (HIWORD( handle )) /* 32-bit memory handle */ return (LPVOID)handle; /* 16-bit memory handle */ return LockResource16( handle ); }
/*********************************************************************** * VERSION_GetFileVersionInfo_16 [internal] * * NOTE: returns size of the 16-bit VERSION resource or 0xFFFFFFFF * in the case if file exists, but VERSION_INFO not found. * FIXME: handle is not used. */ static DWORD VERSION_GetFileVersionInfo_16( LPCSTR filename, LPDWORD handle, DWORD datasize, LPVOID data ) { VS_FIXEDFILEINFO *vffi; DWORD len; BYTE *buf; HMODULE16 hModule; HRSRC16 hRsrc; HGLOBAL16 hMem; BOOL do_free_library = FALSE; TRACE("(%s,%p)\n", debugstr_a(filename), handle ); hModule = GetModuleHandle16(filename); if(hModule < 32) { hModule = LoadLibrary16(filename); do_free_library = TRUE; } if(hModule < 32) { WARN("Could not load %s\n", debugstr_a(filename)); return 0; } hRsrc = FindResource16(hModule, MAKEINTRESOURCEA(VS_VERSION_INFO), MAKEINTRESOURCEA(VS_FILE_INFO)); if(!hRsrc) { WARN("Could not find VS_VERSION_INFO in %s\n", debugstr_a(filename)); if(do_free_library) FreeLibrary16(hModule); return 0xFFFFFFFF; } len = SizeofResource16(hModule, hRsrc); hMem = LoadResource16(hModule, hRsrc); if(!hMem) { WARN("Could not load VS_VERSION_INFO from %s\n", debugstr_a(filename)); if(do_free_library) FreeLibrary16(hModule); return 0xFFFFFFFF; } buf = LockResource16(hMem); if(!VersionInfoIs16(buf)) goto END; vffi = (VS_FIXEDFILEINFO *)VersionInfo16_Value( (VS_VERSION_INFO_STRUCT16 *)buf ); if ( vffi->dwSignature != VS_FFI_SIGNATURE ) { WARN("vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n", vffi->dwSignature, VS_FFI_SIGNATURE ); len = 0xFFFFFFFF; goto END; } if ( TRACE_ON(ver) ) print_vffi_debug( vffi ); if(data) { if(datasize < len) len = datasize; /* truncate data */ if(len) memcpy(data, buf, len); else len = 0xFFFFFFFF; } END: FreeResource16(hMem); if(do_free_library) FreeLibrary16(hModule); return len; }