void CVersionInfo::WriteVarInfo(CVersionInfoBuffer & viBuf) { //Check string tables if (m_stringFileInfo.IsEmpty()) return; //Prepare to write VarFileInfo DWORD posVarInfo = viBuf.PadToDWORD(); //Skip size of VarFileInfo for now; viBuf.Pad(sizeof WORD); //Write wValueLength viBuf.WriteWord(0); //Write type viBuf.WriteWord(1); viBuf.WriteString(L"VarFileInfo"); //Save offset of Var structure (Translation) DWORD posTranslation = viBuf.PadToDWORD(); viBuf.Pad(sizeof WORD); //Write size of translation, that is number of string tables * size of DWORD DWORD dwTableCount = m_stringFileInfo.GetStringTableCount(); viBuf.WriteWord(LOWORD(dwTableCount * sizeof DWORD)); //Write type viBuf.WriteWord(0); //Write key (Translation) viBuf.WriteString(L"Translation"); //Pad for value viBuf.PadToDWORD(); //Collect all id's in one DWORD array DWORD *pTranslationBuf = (DWORD*)_alloca(dwTableCount * sizeof DWORD); DWORD *pTranslation = pTranslationBuf; POSITION posTable = m_stringFileInfo.GetFirstStringTablePosition(); while (posTable) { CStringTable * pStringTable = m_stringFileInfo.GetNextStringTable(posTable); TCHAR* pchEnding = NULL; DWORD dwKey = _tcstol(pStringTable->GetKey(),&pchEnding, 16); *pTranslation = (LOWORD(dwKey) << 16) | (HIWORD(dwKey)); pTranslation++; } viBuf.Write(pTranslationBuf, dwTableCount * sizeof DWORD); //Write structure sizes viBuf.WriteStructSize(posTranslation); viBuf.WriteStructSize(posVarInfo); }
void CStringTable::Write(CVersionInfoBuffer & viBuf) { //Pad to DWORD and save position for wLength DWORD pos = viBuf.PadToDWORD(); //Skip size for now; viBuf.Pad(sizeof WORD); //Write wValueLength viBuf.WriteWord(0); //Write wType viBuf.WriteWord(1); //Write key viBuf.WriteString(m_strKey); POSITION posString = m_lstStrings.GetHeadPosition(); while (posString) { CVersionInfoString * pString = (CVersionInfoString*) m_lstStrings.GetNext(posString); pString->Write(viBuf); } //Set the size of the structure based on current offset from the position viBuf.WriteStructSize(pos); }
void CVersionInfo::Write(CVersionInfoBuffer & viBuf) { //Pad to DWORD and save position for wLength DWORD pos = viBuf.PadToDWORD(); //Skip size for now; viBuf.Pad(sizeof WORD); //Write wValueLength viBuf.WriteWord(sizeof VS_FIXEDFILEINFO); //Write wType viBuf.WriteWord(0); //Write key viBuf.WriteString(L"VS_VERSION_INFO"); //Pad Fixed info viBuf.PadToDWORD(); //Write Fixed file info viBuf.Write(&m_vsFixedFileInfo, sizeof VS_FIXEDFILEINFO); if (m_bRegularInfoOrder) { //Write string file info, it will pad as needed m_stringFileInfo.Write(viBuf); WriteVarInfo(viBuf); } else { WriteVarInfo(viBuf); //Write string file info, it will pad as needed m_stringFileInfo.Write(viBuf); } //Set the size of the Version Info viBuf.WriteStructSize(pos); }