Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}