SemlerPDX icon

AVCS SENS AIDA64 Shared Memory Monitor MAIN-v8 Inline Function in C# for VoiceAttack & AIDA64

SemlerPDX | PRO | 06/15/22 02:29:27 AM UTC (Edited) | 0 ⭐ | 628 👁️ | Never ⏰ | []
C# |

7.11 KB

|

None

|

0 👍

/

0 👎

//AVCS SENS - AIDA64 External Applications Shared Memory Monitoring Function
// -Gets new data string from memory every 2 seconds
// by SemlerPDX Mar2022 (with much help from Pfeil!)
// VETERANS-GAMING.COM
 
using System;
using System.Text;
using System.Linq;
using System.Windows.Forms;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using System.Collections.Generic;
 
public class VAInline
{
    double SharedMemTimerDelay = 2000;
    bool debugging = false;
    
    private void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (VA.GetBoolean("AVCS_SENS_Test_SharedMem") == true)
        {
            SharedMemTest();
            VA.SetBoolean("AVCS_SENS_Test_SharedMem", false);
            if (VA.GetBoolean("AVCS_SENS_Test_OnlyTest") == true)
                VA.SetBoolean("AVCS_SENS_Monitoring", false);
        }
        else
        {
            SharedMemGet(debugging);
        }
        
        if (VA.GetBoolean("AVCS_SENS_Monitoring") != true)
        {
            (sender as System.Timers.Timer).Stop();
            VA.SetBoolean("AVCS_SENS_Logging", false);
            VA.WriteToLog("AVCS AIDA64 Shared Memory Monitor has been terminated...", "black");
        }
        if (VA.Stopped)
        {
            VA.SetBoolean("AVCS_SENS_Diagnostics_Active", false);
            VA.SetBoolean("AVCS_SENS_Diagnosing", false);
            VA.ResetStopFlag();
        }
    }
    
    private void SharedMemGet(bool debugging)
    {
        int? faultCount;
        try
        {
            if (VA.GetInt("~avcs_memfault_count") != null)
            {
                faultCount = VA.GetInt("~avcs_memfault_count");
                if (faultCount >= 2)
                    throw new AVCSexception();
            }
            SharedMemSaver sf = new SharedMemSaver();
            sf.OpenView(VA);
            if (sf.GetData(VA) != "")
            {
                VA.SetText("AVCS_SENS_SHAREDMEM_XML", sf.GetData(VA));
                if (debugging || VA.GetBoolean("AVCS_SENS_DebugSensors") == true)
                    VA.WriteToLog(sf.GetData(VA), "blank");
            }
            if (VA.GetBoolean("AVCS_SharedMem_Monitor_Startup") != null)
            {
                if (String.IsNullOrEmpty(VA.GetText("AVCS_SENS_SHAREDMEM_XML")))
                    throw new AVCSexception();
            }
        }
        catch (AVCSexception e)
        {
            e.SharedMemGetException(VA);
        }
    }
    
    private void SharedMemTest()
    {
        int? faultCount;
        try
        {
            if (VA.GetInt("~avcs_memfault_count") != null)
            {
                faultCount = VA.GetInt("~avcs_memfault_count");
                if (faultCount >= 2)
                    throw new AVCSexception();
            }
            SharedMemSaver sf = new SharedMemSaver();
            sf.OpenView(VA);
            if (sf.GetData(VA) != "")
            {
                VA.WriteToLog(sf.GetData(VA), "blank");
                VA.SetText("AVCS_SENS_SHAREDMEM_XML", sf.GetData(VA));
                VA.WriteToLog("AVCS AIDA64 Shared Memory Test has succeeded!", "green");
                VA.SetText("AVCS_SENS_Test_ReturnTTS", "Test succeeded.");
            }
        }
        catch (AVCSexception e)
        {
            e.SharedMemTestException(VA);
        }
    }
    
    private void SharedMemTimer()
    {
        System.Timers.Timer t = new System.Timers.Timer(SharedMemTimerDelay);
        t.Elapsed += t_Elapsed;
        VA.WriteToLog("AVCS AIDA64 Shared Memory Monitor is now running...", "black");
        t.Start();
    }
    
    
    public class AVCSexception : Exception
    {
        public void SharedMemTestException(dynamic VA)
        {
            VA.SetText("AVCS_SENS_SHAREDMEM_XML", null);
            VA.SetBoolean("AVCS_SENS_Logging", false);
            VA.SetBoolean("AVCS_SENS_Monitoring", false);
            VA.SetText("AVCS_SENS_Test_ReturnTTS", "Test failed. Please check settings.");
            VA.WriteToLog("AVCS AIDA64 Shared Memory Test has failed!", "red");
            VA.WriteToLog("Please check AIDA64 settings. See user guide for more information.", "blank");
        }
        public void SharedMemGetException(dynamic VA)
        {
            VA.SetText("AVCS_SENS_SHAREDMEM_XML", null);
            VA.SetBoolean("AVCS_SENS_Logging", false);
            VA.SetBoolean("AVCS_SENS_Monitoring", false);
            VA.WriteToLog("AVCS AIDA64 Shared Memory Monitor has failed to get data!", "red");
            VA.WriteToLog("Please check AIDA64 settings. See user guide for more information.", "blank");
            if (VA.GetBoolean("AVCS_SharedMem_Monitor_Startup") != null)
            {
                VA.SetText("AVCS_SENS_TTS_WILDCARD", "Sensor Monitor startup has failed. Please check settings.");
                VA.Command.Execute("F_SAY_TTS", false);
            }
        }
    }
    
    
    
    public void main()
    {
        
        if (VA.GetBoolean("AVCS_SENS_Monitoring") != true && VA.GetBoolean("AVCS_SharedMem_Monitor_Startup") != true)
        {
            VA.SetBoolean("AVCS_SharedMem_Monitor_Startup", true);
            SharedMemGet(debugging);
            if (String.IsNullOrEmpty(VA.GetText("AVCS_SENS_SHAREDMEM_XML")))
            {
                VA.SetText("AVCS_SENS_SHAREDMEM_XML", null);
                VA.SetBoolean("AVCS_SENS_Logging", false);
                VA.SetBoolean("AVCS_SENS_Monitoring", false);
            }
            else
            {
                VA.SetBoolean("AVCS_SENS_Monitoring", true);
                SharedMemTimer();
            }
        }
        VA.SetBoolean("AVCS_SharedMem_Monitor_Startup", null);
    }
 
}
 
 
 
class SharedMemSaver
{
    #region Win32 API stuff
    public const int FILE_MAP_READ = 0x0004;
    private static dynamic VA;
    
    [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern IntPtr OpenFileMapping(int dwDesiredAccess,
    bool bInheritHandle, StringBuilder lpName);
 
    [DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern IntPtr MapViewOfFile(IntPtr hFileMapping,
    int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow,
    int dwNumberOfBytesToMap);
 
    [DllImport("Kernel32.dll")]
    internal static extern bool UnmapViewOfFile(IntPtr map);
 
    [DllImport("kernel32.dll")]
    internal static extern bool CloseHandle(IntPtr hObject);
    #endregion
 
    private bool fileOpen = false;
    private IntPtr map;
    private IntPtr handle;
 
    ~SharedMemSaver()
    {
        CloseView(VA);
    }
 
    public bool OpenView(dynamic VA)
    {
        int? memfaultCount;
        try
        {
            if (!fileOpen)
            {
                StringBuilder sharedMemFile = new StringBuilder("AIDA64_SensorValues");
                handle = OpenFileMapping(FILE_MAP_READ, false, sharedMemFile);
                if (handle == IntPtr.Zero)
                {
                    if (VA.GetInt("~avcs_memfault_count") != null)
                    {
                        memfaultCount = VA.GetInt("~avcs_memfault_count");
                        memfaultCount += 1;
                        VA.SetInt("~avcs_memfault_count", memfaultCount);
                    }
                    else
                    {
                        memfaultCount = 1;
                        VA.SetInt("~avcs_memfault_count", memfaultCount);
                    }
                    throw new Exception("Unable to open file mapping.");
                }
                map = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, 0);
                if (map == IntPtr.Zero)
                {
                    if (VA.GetInt("~avcs_memfault_count") != null)
                    {
                        memfaultCount = VA.GetInt("~avcs_memfault_count");
                        memfaultCount += 1;
                        VA.SetInt("~avcs_memfault_count", memfaultCount);
                    }
                    else
                    {
                        memfaultCount = 1;
                        VA.SetInt("~avcs_memfault_count", memfaultCount);
                    }
                    throw new Exception("Unable to read shared memory.");
                }
                fileOpen = true;
            }
            return fileOpen;
        }
        catch
        {
            return false;
        }
    }
 
    public void CloseView(dynamic VA)
    {
        if (fileOpen)
        {
            UnmapViewOfFile(map);
            CloseHandle(handle);
        }
    }
 
    public String GetData(dynamic VA)
    {
        if (fileOpen)
        {
            try
            {
                String data = (String)Marshal.PtrToStringAnsi(map);
                return data;
            }
            catch
            {
                return null;
            }
        }   
        else        
        {
            return null;
        }
    }
}

Comments