S.M.A.R.T. HDD Temperatur in vb.Net
Hallo, ich bin dabei ein Programm zu basteln was mir die Temperatur meiner Festplatte ausliest.
Es funktioniert auch alles sehr gut nur weiss ich nicht wie man eine Funktion refreshen kann.
Ich benutze ein Timer aber der refresht die ausgelesenen Daten nicht.
Grüße waldgnarf
Es funktioniert auch alles sehr gut nur weiss ich nicht wie man eine Funktion refreshen kann.
Ich benutze ein Timer aber der refresht die ausgelesenen Daten nicht.
Imports System.Runtime.InteropServices
Public Class Form1
Dim NUMMER As Integer
Public Enum ReadSmart_Results
DRIVE_DOES_NOT_EXIST
ACCESS_DENIED
NO_SMART_AVAILABLE
SUCCEEDED
End Enum
Public Enum Attributes
SMART_ATTRIB_Invalid = 0
SMART_ATTRIB_AIRFLOW_TEMPERATURE = 190
SMART_ATTRIB_HDA_TEMPERATURE = 194
End Enum
Private Const IOCTL_STORAGE_PREDICT_FAILURE As Integer = &H2D1100
Private Const STATUS_INVALID_DEVICE_REQUEST As Integer = &HC0000010
Private Const FILE_SHARE_NONE As Short = 0
Private Const OPEN_EXISTING As Short = 3
Private Const INVALID_HANDLE_VALUE As Short = -1
Private Const GENERIC_READ As Integer = &H80000000
Private Const GENERIC_WRITE As Integer = &H40000000
Private Const FILE_SHARE_READ As Integer = 1
Private Const FILE_SHARE_WRITE As Integer = 2
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As IntPtr, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As IntPtr) As IntPtr
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As IntPtr) As Boolean
Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As IntPtr, ByVal dwIoControlCode As Integer, ByRef lpInBuffer As IntPtr, ByVal nInBufferSize As Integer, <Out()> ByVal lpOutBuffer As STORAGE_PREDICT_FAILURE, ByVal nOutBufferSize As Integer, ByRef lpBytesReturned As Integer, ByVal lpOverlapped As IntPtr) As Integer
Public DRIVES, BEZEIC As String()
Dim STRLA1, STRLA2, STRLH1, STRLH2 As String
Dim INTOFF, INTATT, INTVAL, INTWOR, INTDAT As Integer
Dim INTLAU As Integer = 0
Dim LISVIE As ArrayList
Public SmartData As STORAGE_PREDICT_FAILURE
Public Function GetPhysicalDrives()
Dim COLITE As Object
Dim A As Integer
COLITE = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("SELECT * FROM Win32_DiskDrive")
DRIVES = New String(COLITE.count - 1) {}
BEZEIC = New String(COLITE.count - 1) {}
A = 0
For Each OBJITE In COLITE
DRIVES(A) = OBJITE.deviceid()
BEZEIC(A) = OBJITE.caption
If A = 0 Then LATEH1.Text = BEZEIC(A)
If A = 1 Then LATEH2.Text = BEZEIC(A)
A += 1
Next
Return COLITE.Count
End Function
Public Function ReadSmart(ByVal STRLAU As String) As ReadSmart_Results
Dim DEVICE As IntPtr
Dim RESULT As Boolean
Dim RETBYT As Integer
SmartData = New STORAGE_PREDICT_FAILURE
DEVICE = CreateFile(STRLAU, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero)
If DEVICE.ToInt32 = INVALID_HANDLE_VALUE Then
If Marshal.GetLastWin32Error = 5 Then
Return ReadSmart_Results.ACCESS_DENIED
Else
Return ReadSmart_Results.DRIVE_DOES_NOT_EXIST
End If
End If
RESULT = DeviceIoControl(DEVICE, IOCTL_STORAGE_PREDICT_FAILURE, IntPtr.Zero, 0, SmartData, Marshal.SizeOf(SmartData), RETBYT, IntPtr.Zero)
CloseHandle(DEVICE)
If RESULT Then
Return ReadSmart_Results.SUCCEEDED
Else
Return ReadSmart_Results.NO_SMART_AVAILABLE
End If
End Function
Public Sub GetSmartValue(ByVal INTOFF As Integer, ByRef INTATT As Integer, ByRef INTVAL As Integer, ByRef INTWOR As Integer, ByRef INTDAT As Integer)
If SmartData.VendorSpecific(INTOFF) = 190 Or SmartData.VendorSpecific(INTOFF) = 194 Then
Dim STRINT As String = ""
For Z As Integer = 11 To 5 Step -1
STRINT &= Hex(SmartData.VendorSpecific(INTOFF + Z))
Next
INTDAT = Convert.ToInt64(STRINT, 16)
INTLAU += 1
If SmartData.VendorSpecific(INTOFF) = 190 Then
If INTLAU < 3 Then
STRLA1 = "AIR" & " / " & INTDAT & " / " & NUMMER
Else
STRLA2 = "AIR" & " / " & INTDAT
End If
Else
If INTLAU < 3 Then
STRLH1 = "HDA" & " / " & INTDAT
Else
STRLH2 = "HDA" & " / " & INTDAT
End If
End If
End If
End Sub
Public Sub SMAARR(ByVal LISVIE As ArrayList, ByVal INTIND As Integer)
For A As Integer = 0 To 29
GetSmartValue(A * 12 + 2, INTATT, INTVAL, INTWOR, INTDAT)
Next
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim B As Integer = GetPhysicalDrives() - 1
For C As Integer = 0 To B
ReadSmart(DRIVES(C))
SMAARR(LISVIE, C)
Next
LABLA1.Text = STRLA1
LABLA2.Text = STRLA2
LABLH1.Text = STRLH1
LABLH2.Text = STRLH2
End Sub
End Class
<StructLayout(LayoutKind.Sequential)> Public Class STORAGE_PREDICT_FAILURE
Public PredictFailure As Integer
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=512)> Public VendorSpecific() As Byte
Sub New()
VendorSpecific = New Byte(511) {}
End Sub
End Class
Grüße waldgnarf
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 159017
Url: https://administrator.de/contentid/159017
Ausgedruckt am: 20.11.2024 um 11:11 Uhr
2 Kommentare
Neuester Kommentar
Hallo waldgnarf!
Keine Ahnung von vb-net, aber finde ich in Deinem Code keinen Hinweis auf das setzen des <Timer1.Interval = 0815> und den <Timer1.Start()>?
Gruß Dieter
Keine Ahnung von vb-net, aber finde ich in Deinem Code keinen Hinweis auf das setzen des <Timer1.Interval = 0815> und den <Timer1.Start()>?
Gruß Dieter