/*********************************************************************** * VersionInfo32_FindChild [internal] */ static VS_VERSION_INFO_STRUCT32 *VersionInfo32_FindChild( VS_VERSION_INFO_STRUCT32 *info, LPCWSTR szKey, UINT cbKey ) { VS_VERSION_INFO_STRUCT32 *child = VersionInfo32_Children( info ); while ( (DWORD)child < (DWORD)info + info->wLength ) { if ( !strncmpiW( child->szKey, szKey, cbKey ) ) return child; child = VersionInfo32_Next( child ); } return NULL; }
static PCVS_VERSION_INFO_STRUCT32 VersionInfo32_FindChild( IN PCVS_VERSION_INFO_STRUCT32 info, IN PCWSTR szKey, IN UINT cchKey) { PCVS_VERSION_INFO_STRUCT32 child = VersionInfo32_Children(info); while ((ULONG_PTR)child < (ULONG_PTR)info + info->wLength) { if (!_wcsnicmp(child->szKey, szKey, cchKey) && !child->szKey[cchKey]) return child; if (child->wLength == 0) return NULL; child = VersionInfo32_Next(child); } return NULL; }
/*********************************************************************** * ConvertVersionInfo32To16 [internal] */ void ConvertVersionInfo32To16( VS_VERSION_INFO_STRUCT32 *info32, VS_VERSION_INFO_STRUCT16 *info16 ) { /* Copy data onto local stack to prevent overwrites */ WORD wLength = info32->wLength; WORD wValueLength = info32->wValueLength; WORD bText = info32->bText; LPBYTE lpValue = VersionInfo32_Value( info32 ); VS_VERSION_INFO_STRUCT32 *child32 = VersionInfo32_Children( info32 ); VS_VERSION_INFO_STRUCT16 *child16; TRACE("Converting %p to %p\n", info32, info16 ); TRACE("wLength %d, wValueLength %d, bText %d, value %p, child %p\n", wLength, wValueLength, bText, lpValue, child32 ); /* Convert key */ WideCharToMultiByte( CP_ACP, 0, info32->szKey, -1, info16->szKey, 0x7fffffff, NULL, NULL ); TRACE("Copied key from %p to %p: %s\n", info32->szKey, info16->szKey, debugstr_a(info16->szKey) ); /* Convert value */ if ( wValueLength == 0 ) { info16->wValueLength = 0; TRACE("No value present\n" ); } else if ( bText ) { info16->wValueLength = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpValue, -1, NULL, 0, NULL, NULL ); WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpValue, -1, VersionInfo16_Value( info16 ), info16->wValueLength, NULL, NULL ); TRACE("Copied value from %p to %p: %s\n", lpValue, VersionInfo16_Value( info16 ), debugstr_a(VersionInfo16_Value( info16 )) ); } else { info16->wValueLength = wValueLength; memmove( VersionInfo16_Value( info16 ), lpValue, wValueLength ); TRACE("Copied value from %p to %p: %d bytes\n", lpValue, VersionInfo16_Value( info16 ), wValueLength ); } /* Convert children */ child16 = VersionInfo16_Children( info16 ); while ( (DWORD)child32 < (DWORD)info32 + wLength && child32->wLength != 0 ) { VS_VERSION_INFO_STRUCT32 *nextChild = VersionInfo32_Next( child32 ); ConvertVersionInfo32To16( child32, child16 ); child16 = VersionInfo16_Next( child16 ); child32 = nextChild; } /* Fixup length */ info16->wLength = (DWORD)child16 - (DWORD)info16; TRACE("Finished, length is %d (%p - %p)\n", info16->wLength, info16, child16 ); }