using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.IO;
using System.IO.MemoryMappedFiles;
namespace WindowsFormsApplication1
{
public class GPUZ_SHMEM
{
private const int MAX_RECORDS = 128;
private bool gPUZ_Running = false;
public class GPUZ_SENSOR_RECORD
{
public string name;
public string unit;
public UInt32 digits;
public Double value;
};
public class GPUZ_SH_MEM
{
public UInt32 version;
public volatile Int32 busy;
public UInt32 lastUpdate;
public List<KeyValuePair<string, string>> data = new List<KeyValuePair<string, string>>(MAX_RECORDS);
public List<GPUZ_SENSOR_RECORD> sensors = new List<GPUZ_SENSOR_RECORD>(MAX_RECORDS);
};
public GPUZ_SH_MEM shMem = new GPUZ_SH_MEM();
public GPUZ_SHMEM()
{
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName.Contains("GPU-Z")) gPUZ_Running = true;
}
}
public bool GPUZ_Running { get { return gPUZ_Running; } }
public void ReadSharedMemory()
{
string key, value;
string name, unit;
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("GPUZShMem"))
{
using (MemoryMappedViewStream mmvs = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(mmvs, Encoding.Unicode);
shMem.version = reader.ReadUInt32();
shMem.busy = reader.ReadInt32();
shMem.lastUpdate = reader.ReadUInt32();
for (int i = 0; i < MAX_RECORDS; i++)
{
key = new string(reader.ReadChars(256)).Trim('\0');
if (key.Contains("\0")) key = key.Substring(0, key.IndexOf("\0"));
value = new string(reader.ReadChars(256)).Trim('\0');
if (value.Contains("\0")) value = value.Substring(0, value.IndexOf("\0"));
if (key != String.Empty)
{
KeyValuePair<string, string> dataItem = new KeyValuePair<string, string>(key, value);
shMem.data.Add(dataItem);
}
}
for (int i = 0; i < MAX_RECORDS; i++)
{
name = new string(reader.ReadChars(256)).Trim('\0');
if (name.Contains("\0")) name = name.Substring(0, name.IndexOf("\0"));
unit = new string(reader.ReadChars(8)).Trim('\0');
if (unit.Contains("\0")) unit = unit.Substring(0, unit.IndexOf('\0'));
if (name != String.Empty)
{
GPUZ_SENSOR_RECORD sensorItem = new GPUZ_SENSOR_RECORD();
sensorItem.name = name;
sensorItem.unit = unit;
sensorItem.digits = reader.ReadUInt32();
sensorItem.value = reader.ReadDouble();
shMem.sensors.Add(sensorItem);
}
}
}
}
}
public List<KeyValuePair<string, string>> GetListOfRecords()
{
return shMem.data;
}
public KeyValuePair<string, string>[] GetArrayOfRecords()
{
KeyValuePair<string, string>[] kvpArray;
return kvpArray = shMem.data.ToArray();
}
public List<GPUZ_SENSOR_RECORD> GetListOfSensors()
{
return shMem.sensors;
}
public GPUZ_SENSOR_RECORD[] GetArrayOfSensors()
{
GPUZ_SENSOR_RECORD[] sensorArrray;
return sensorArrray = shMem.sensors.ToArray();
}
public KeyValuePair<string, string> GetRecordByName(string name)
{
foreach (KeyValuePair<string, string> k in shMem.data)
{
if (k.Key == name) return k;
}
return new KeyValuePair<string, string>(null, null);
}
public GPUZ_SENSOR_RECORD GetSensorByName(string name)
{
foreach (GPUZ_SENSOR_RECORD r in shMem.sensors)
{
if (r.name == name) return r;
}
return null;
}
public KeyValuePair<string, string> GetRecordByIndex(int index)
{
if (index >= 0 && index < shMem.data.Count) return shMem.data[index];
else return new KeyValuePair<string, string>(null, null);
}
public GPUZ_SENSOR_RECORD GetSensorByIndex(int index)
{
if (index >= 0 && index < shMem.sensors.Count) return shMem.sensors[index];
else return null;
}
}
}