コード例 #1
0
ファイル: SignatureComparer.cs プロジェクト: xuhaoa/WinPIT
        public bool Equals(CustomMarshalDescriptor x, CustomMarshalDescriptor y)
        {
            if (x == null && y == null)
            {
                return(true);
            }
            if (x == null || y == null)
            {
                return(false);
            }

            return(x.Cookie == y.Cookie &&
                   x.Guid == y.Guid &&
                   x.ManagedType == y.ManagedType &&
                   x.UnmanagedType == y.ManagedType);
        }
コード例 #2
0
        /// <summary>
        /// Reads a marshal descriptor signature from the provided input stream.
        /// </summary>
        /// <param name="parentModule">The module that defines the marshal descriptor</param>
        /// <param name="reader">The input stream.</param>
        /// <returns>The marshal descriptor.</returns>
        public static MarshalDescriptor FromReader(ModuleDefinition parentModule, IBinaryStreamReader reader)
        {
            var nativeType = (NativeType)reader.ReadByte();
            MarshalDescriptor descriptor = nativeType switch
            {
                NativeType.SafeArray => SafeArrayMarshalDescriptor.FromReader(parentModule, reader),
                NativeType.FixedArray => FixedArrayMarshalDescriptor.FromReader(reader),
                NativeType.LPArray => LPArrayMarshalDescriptor.FromReader(reader),
                NativeType.CustomMarshaller => CustomMarshalDescriptor.FromReader(parentModule, reader),
                NativeType.FixedSysString => FixedSysStringMarshalDescriptor.FromReader(reader),
                NativeType.Interface => ComInterfaceMarshalDescriptor.FromReader(nativeType, reader),
                NativeType.IDispatch => ComInterfaceMarshalDescriptor.FromReader(nativeType, reader),
                NativeType.IUnknown => ComInterfaceMarshalDescriptor.FromReader(nativeType, reader),
                _ => new SimpleMarshalDescriptor(nativeType)
            };

            descriptor.ExtraData = reader.ReadToEnd();
            return(descriptor);
        }
コード例 #3
0
        public void CreateCustomMarshalDescriptor()
        {
            var assembly   = Utilities.CreateTempNetAssembly();
            var descriptor = new CustomMarshalDescriptor()
            {
                Guid          = Guid.NewGuid(),
                UnmanagedType = "SomeUnmanagedType",
                ManagedType   = "System.WitchCraft.Marshaler",
                Cookie        = "1337",
            };

            var newDescriptor = BuildAppWithDescriptor(assembly,
                                                       new SzArrayTypeSignature(assembly.NetDirectory.MetadataHeader.TypeSystem.Int32),
                                                       descriptor, false);

            Assert.AreEqual(descriptor.Guid, newDescriptor.Guid);
            Assert.AreEqual(descriptor.UnmanagedType, newDescriptor.UnmanagedType);
            Assert.AreEqual(descriptor.ManagedType, newDescriptor.ManagedType);
            Assert.AreEqual(descriptor.Cookie, newDescriptor.Cookie);
        }
コード例 #4
0
ファイル: MarshalDescriptor.cs プロジェクト: xuhaoa/WinPIT
        public static MarshalDescriptor FromReader(IBinaryStreamReader reader)
        {
            var type = (NativeType)reader.ReadByte();

            switch (type)
            {
            case NativeType.Array:
                return(ArrayMarshalDescriptor.FromReader(reader));

            case NativeType.FixedArray:
                return(FixedArrayMarshalDescriptor.FromReader(reader));

            case NativeType.SafeArray:
                return(SafeArrayMarshalDescriptor.FromReader(reader));

            case NativeType.CustomMarshaler:
                return(CustomMarshalDescriptor.FromReader(reader));

            default:
                return(new SimpleMarshalDescriptor(type));
            }
        }