public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) { if (evt == ModuleWriterEvent.MDBeginCreateTables) { // Add key signature uint sigBlob = writer.MetaData.BlobHeap.Add(ctx.KeySig); uint sigRid = writer.MetaData.TablesHeap.StandAloneSigTable.Add(new RawStandAloneSigRow(sigBlob)); Debug.Assert(sigRid == 1); uint sigToken = 0x11000000 | sigRid; ctx.KeyToken = sigToken; MutationHelper.InjectKey(writer.Module.EntryPoint, 2, (int)sigToken); } else if (evt == ModuleWriterEvent.MDBeginAddResources) { // Compute hash byte[] hash = SHA1.Create().ComputeHash(ctx.OriginModule); uint hashBlob = writer.MetaData.BlobHeap.Add(hash); MDTable <RawFileRow> fileTbl = writer.MetaData.TablesHeap.FileTable; uint fileRid = fileTbl.Add(new RawFileRow( (uint)FileAttributes.ContainsMetaData, writer.MetaData.StringsHeap.Add("koi"), hashBlob)); uint impl = CodedToken.Implementation.Encode(new MDToken(Table.File, fileRid)); // Add resources MDTable <RawManifestResourceRow> resTbl = writer.MetaData.TablesHeap.ManifestResourceTable; foreach (var resource in ctx.ManifestResources) { resTbl.Add(new RawManifestResourceRow(resource.Item1, resource.Item2, writer.MetaData.StringsHeap.Add(resource.Item3), impl)); } } }
public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) { if (evt == ModuleWriterEvent.MDBeginCreateTables) { // Add key signature var sigBlob = writer.MetaData.BlobHeap.Add(ctx.KeySig); var sigRid = writer.MetaData.TablesHeap.StandAloneSigTable.Add(new RawStandAloneSigRow(sigBlob)); Debug.Assert(sigRid == 1); var sigToken = 0x11000000 | sigRid; ctx.KeyToken = sigToken; MutationHelper.InjectKey(writer.Module.EntryPoint, 2, (int)sigToken); } else if (evt == ModuleWriterEvent.MDBeginAddResources && !ctx.CompatMode) { // Compute hash var hash = SHA1.Create().ComputeHash(ctx.OriginModule); var hashBlob = writer.MetaData.BlobHeap.Add(hash); var fileTbl = writer.MetaData.TablesHeap.FileTable; var fileRid = fileTbl.Add(new RawFileRow( (uint)FileAttributes.ContainsMetaData, writer.MetaData.StringsHeap.Add("koi"), hashBlob)); var impl = CodedToken.Implementation.Encode(new MDToken(Table.File, fileRid)); // Add resources var resTbl = writer.MetaData.TablesHeap.ManifestResourceTable; foreach (var resource in ctx.ManifestResources) { resTbl.Add(new RawManifestResourceRow(resource.Item1, resource.Item2, writer.MetaData.StringsHeap.Add(resource.Item3), impl)); } // Add exported types var exTbl = writer.MetaData.TablesHeap.ExportedTypeTable; foreach (var type in ctx.OriginModuleDef.GetTypes()) { if (!type.IsVisibleOutside()) { continue; } exTbl.Add(new RawExportedTypeRow((uint)type.Attributes, 0, writer.MetaData.StringsHeap.Add(type.Name), writer.MetaData.StringsHeap.Add(type.Namespace), impl)); } } }