#nullable enable
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace IPA.AntiMalware.ComAPI
{
    [ComImport]
    [Guid(AmsiConstants.IAntimalwareGuidStr)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface IAntimalware
    {
        void Scan([In] IAmsiStream stream, [Out] out AmsiResult result, [Out] out IAntimalwareProvider provider);
        void CloseSession([In] ulong session);
    }

    [ComImport]
    [Guid("3e47f2e5-81d4-4d3b-897f-545096770373")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface IAmsiStream
    {
        unsafe void GetAttribute([In] AmsiAttribute attribute, [In] uint dataSize, [Out] byte* buffer, [Out] out uint writtenData);
        unsafe void Read([In] ulong position, [In] uint dataSize, [Out] byte* buffer, [Out] out uint readSize);
    }

    [ComImport]
    [Guid("b2cabfe3-fe04-42b1-a5df-08d483d4d125")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface IAntimalwareProvider
    {
        [return: MarshalAs(UnmanagedType.LPWStr)] string DisplayName();

        AmsiResult Scan([In] IAmsiStream stream);
        void CloseSession([In] ulong session);
    }

    internal enum AmsiAttribute
    {
        AppName = 0,
        ContentName = 1,
        ContentSize = 2,
        ContentAddress = 3,
        Session = 4,
        RedirectChainSize = 5,
        RedirectChainAddress = 6,
        AllSize = 7,
        AllAddress = 8,
    }
}
