Option Explicit

Private Declare Function OpenFileMapping Lib "kernel32" Alias "OpenFileMappingA" (ByVal dwDesiredAccess As Long, _
  ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function MapViewOfFile Lib "kernel32" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, _
  ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function UnmapViewOfFile Lib "kernel32" (ByVal lpBaseAddress As Long) As Long

Private Const FILE_MAP_READ As Long = &H4
Private Const FILE_MAP_WRITE As Long = &H2

Private Type SF_Raw_MemMap
   Unknown(5) As Integer 'unbekanntes Tag
   NumTemps As Integer 'Anzahl der Temperaturen
   NumFans As Integer 'Anzahl der Lüfter
   NumVolts As Integer 'Anzahl der Spannungen
   Temps(63) As Integer 'Werte der Temperaturen
   Fans(63) As Integer 'Drehzahl der Lüfter
   Volts(63) As Integer 'Werte der Spannungen
End Type

Public Type SpeedFan_Data
  Temps As Long 's.o.
  Fans As Long
  Volts As Long
  Temp(32) As Double
  Fan(32) As Long
  Volt(32) As Double
End Type

Public Function SpeedFan_GetStatus() As SpeedFan_Data
Dim MyAreaPtr As Long
Dim MyAreaH As Long
Dim mMyArea As SF_Raw_MemMap
Dim RetVal As SpeedFan_Data
Dim x As Long

MyAreaH = OpenFileMapping(FILE_MAP_READ, 0, "SFSharedMemory_ALM") 'Adresse der Memorymap herausfinden
If MyAreaH = 0 Then Exit Function 'keine Area da - weg hier!

MyAreaPtr = MapViewOfFile(MyAreaH, FILE_MAP_READ, 0, 0, 0) 'Pointer herausfinden
CopyMemory VarPtr(mMyArea), MyAreaPtr, Len(mMyArea) 'und lesen!

RetVal.Temps = mMyArea.NumTemps
RetVal.Volts = mMyArea.NumVolts
RetVal.Fans = mMyArea.NumFans
For x = 0 To 32 Step 2
  RetVal.Temp(x / 2) = mMyArea.Temps(x) / 100
  RetVal.Fan(x / 2) = mMyArea.Fans(x)
  RetVal.Volt(x / 2) = mMyArea.Volts(x) / 100
Next
CloseHandle MyAreaH
UnmapViewOfFile MyAreaPtr
SpeedFan_GetStatus = RetVal
End Function