//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