public override void WriteTo (Stream ms)
{
using (BinaryWriter w = new BinaryWriter (ms, Encoding.Unicode)) {
//
// See the documentation for the VS_VERSIONINFO structure and
// its children on MSDN
//
// VS_VERSIONINFO
w.Write ((short)0);
w.Write ((short)0x34);
w.Write ((short)0);
w.Write ("VS_VERSION_INFO".ToCharArray ());
w.Write ((short)0);
emit_padding (w);
// VS_FIXEDFILEINFO
w.Write ((uint)signature);
w.Write ((int)struct_version);
w.Write ((int)(file_version >> 32));
w.Write ((int)((file_version & 0xffffffff)));
w.Write ((int)(product_version >> 32));
w.Write ((int)(product_version & 0xffffffff));
w.Write ((int)file_flags_mask);
w.Write ((int)file_flags);
w.Write ((int)file_os);
w.Write ((int)file_type);
w.Write ((int)file_subtype);
w.Write ((int)(file_date >> 32));
w.Write ((int)(file_date & 0xffffffff));
emit_padding (w);
// VarFileInfo
long var_file_info_pos = ms.Position;
w.Write ((short)0);
w.Write ((short)0);
w.Write ((short)1);
w.Write ("VarFileInfo".ToCharArray ());
w.Write ((short)0);
if ((ms.Position % 4) != 0)
w.Write ((short)0);
// Var
long var_pos = ms.Position;
w.Write ((short)0);
w.Write ((short)4);
w.Write ((short)0);
w.Write ("Translation".ToCharArray ());
w.Write ((short)0);
if ((ms.Position % 4) != 0)
w.Write ((short)0);
w.Write ((short)file_lang);
w.Write ((short)file_codepage);
patch_length (w, var_pos);
patch_length (w, var_file_info_pos);
// StringFileInfo
long string_file_info_pos = ms.Position;
w.Write ((short)0);
w.Write ((short)0);
w.Write ((short)1);
w.Write ("StringFileInfo".ToCharArray ());
emit_padding (w);
// StringTable
long string_table_pos = ms.Position;
w.Write ((short)0);
w.Write ((short)0);
w.Write ((short)1);
w.Write (String.Format ("{0:x4}{1:x4}", file_lang, file_codepage).ToCharArray ());
emit_padding (w);
// Strings
foreach (string key in properties.Keys) {
string value = (string)properties [key];
long string_pos = ms.Position;
w.Write ((short)0);
w.Write ((short)(value.ToCharArray ().Length + 1));
w.Write ((short)1);
w.Write (key.ToCharArray ());
w.Write ((short)0);
emit_padding (w);
w.Write (value.ToCharArray ());
w.Write ((short)0);
emit_padding (w);
patch_length (w, string_pos);
}
patch_length (w, string_table_pos);
patch_length (w, string_file_info_pos);
patch_length (w, 0);
}
}
}