Browse Source

Add support for .net 1.x XML security declarations

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
53af650a9e
  1. 213
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

213
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -337,52 +337,62 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine(" = {"); output.WriteLine(" = {");
output.Indent(); output.Indent();
var blob = metadata.GetBlobReader(secdecl.PermissionSet); var blob = metadata.GetBlobReader(secdecl.PermissionSet);
if ((char)blob.ReadByte() != '.') throw new InvalidOperationException("sanity check!"); if ((char)blob.ReadByte() != '.') {
int count = blob.ReadCompressedInteger(); blob.Reset();
for (int i = 0; i < count; i++) { WriteXmlSecurityDeclaration(blob.ReadUTF8(blob.RemainingBytes));
var typeName = blob.ReadSerializedString(); } else {
string[] nameParts = typeName.Split(new[] { ", " }, 2, StringSplitOptions.None); int count = blob.ReadCompressedInteger();
if (nameParts.Length != 2) for (int i = 0; i < count; i++) {
throw new NotImplementedException(); var typeName = blob.ReadSerializedString();
var referencedModule = module.AssemblyResolver.Resolve(AssemblyNameReference.Parse(nameParts[1])); string[] nameParts = typeName.Split(new[] { ", " }, 2, StringSplitOptions.None);
if (referencedModule == module) { if (nameParts.Length != 2)
output.Write("class ");
output.Write(DisassemblerHelpers.Escape(typeName));
} else {
string[] typeNameParts = typeName.Split(new[] { ", " }, StringSplitOptions.None);
if (typeNameParts.Length < 2)
throw new NotImplementedException(); throw new NotImplementedException();
output.Write('['); var referencedModule = module.AssemblyResolver.Resolve(AssemblyNameReference.Parse(nameParts[1]));
output.Write(typeNameParts[1]); if (referencedModule == module) {
output.Write(']'); output.Write("class ");
output.WriteReference(typeNameParts[0], null); // TODO : hyperlink! output.Write(DisassemblerHelpers.Escape(typeName));
} } else {
output.Write(" = {"); string[] typeNameParts = typeName.Split(new[] { ", " }, StringSplitOptions.None);
blob.ReadCompressedInteger(); // ? if (typeNameParts.Length < 2)
// The specification seems to be incorrect here, so I'm using the logic from Cecil instead. throw new NotImplementedException();
int argCount = blob.ReadCompressedInteger(); output.Write('[');
if (argCount > 0) { output.Write(typeNameParts[1]);
output.WriteLine(); output.Write(']');
output.Indent(); output.WriteReference(typeNameParts[0], null); // TODO : hyperlink!
}
for (int j = 0; j < argCount; j++) { output.Write(" = {");
WriteSecurityDeclarationArgument(module, ref blob); blob.ReadCompressedInteger(); // ?
// The specification seems to be incorrect here, so I'm using the logic from Cecil instead.
int argCount = blob.ReadCompressedInteger();
if (argCount > 0) {
output.WriteLine(); output.WriteLine();
output.Indent();
for (int j = 0; j < argCount; j++) {
WriteSecurityDeclarationArgument(module, ref blob);
output.WriteLine();
}
output.Unindent();
} }
output.Write('}');
output.Unindent(); if (i + 1 < count)
output.Write(',');
output.WriteLine();
} }
output.Write('}');
if (i + 1 < count)
output.Write(',');
output.WriteLine();
} }
output.Unindent(); output.Unindent();
output.WriteLine("}"); output.WriteLine("}");
} }
} }
void WriteXmlSecurityDeclaration(string xml)
{
output.Write("property string XML = ");
output.Write("string('{0}')", DisassemblerHelpers.EscapeString(xml).Replace("'", "\'"));
}
enum TypeKind enum TypeKind
{ {
Primitive, Primitive,
@ -709,7 +719,8 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Write("unsigned int"); output.Write("unsigned int");
break; break;
case 0x26: // NATIVE_TYPE_FUNC case 0x26: // NATIVE_TYPE_FUNC
goto default; // ?? output.Write("Func");
break;
case 0x2a: // NATIVE_TYPE_ARRAY case 0x2a: // NATIVE_TYPE_ARRAY
if (blob.RemainingBytes > 0) if (blob.RemainingBytes > 0)
WriteNativeType(ref blob); WriteNativeType(ref blob);
@ -755,70 +766,72 @@ namespace ICSharpCode.Decompiler.Disassembler
break; break;
case 0x1d: // SafeArray case 0x1d: // SafeArray
output.Write("safearray "); output.Write("safearray ");
byte elementType = blob.ReadByte(); if (blob.RemainingBytes > 0) {
switch (elementType) { byte elementType = blob.ReadByte();
case 0: // None switch (elementType) {
break; case 0: // None
case 2: // I2 break;
output.Write("int16"); case 2: // I2
break; output.Write("int16");
case 3: // I4 break;
output.Write("int32"); case 3: // I4
break; output.Write("int32");
case 4: // R4 break;
output.Write("float32"); case 4: // R4
break; output.Write("float32");
case 5: // R8 break;
output.Write("float64"); case 5: // R8
break; output.Write("float64");
case 6: // Currency break;
output.Write("currency"); case 6: // Currency
break; output.Write("currency");
case 7: // Date break;
output.Write("date"); case 7: // Date
break; output.Write("date");
case 8: // BStr break;
output.Write("bstr"); case 8: // BStr
break; output.Write("bstr");
case 9: // Dispatch break;
output.Write("idispatch"); case 9: // Dispatch
break; output.Write("idispatch");
case 10: // Error break;
output.Write("error"); case 10: // Error
break; output.Write("error");
case 11: // Bool break;
output.Write("bool"); case 11: // Bool
break; output.Write("bool");
case 12: // Variant break;
output.Write("variant"); case 12: // Variant
break; output.Write("variant");
case 13: // Unknown break;
output.Write("iunknown"); case 13: // Unknown
break; output.Write("iunknown");
case 14: // Decimal break;
output.Write("decimal"); case 14: // Decimal
break; output.Write("decimal");
case 16: // I1 break;
output.Write("int8"); case 16: // I1
break; output.Write("int8");
case 17: // UI1 break;
output.Write("unsigned int8"); case 17: // UI1
break; output.Write("unsigned int8");
case 18: // UI2 break;
output.Write("unsigned int16"); case 18: // UI2
break; output.Write("unsigned int16");
case 19: // UI4 break;
output.Write("unsigned int32"); case 19: // UI4
break; output.Write("unsigned int32");
case 22: // Int break;
output.Write("int"); case 22: // Int
break; output.Write("int");
case 23: // UInt break;
output.Write("unsigned int"); case 23: // UInt
break; output.Write("unsigned int");
default: break;
output.Write(elementType.ToString()); default:
break; output.Write(elementType.ToString());
break;
}
} }
break; break;
case 0x1e: // FixedArray case 0x1e: // FixedArray

Loading…
Cancel
Save