Page 1 of 1

Software hard disk activity monitor (like hardware LED)

Posted: Sat Jan 26, 2013 1:24 am
by viiartz
Hi All,
I want to write my own HDD status monitor in PB like this applet http://goo.gl/dLplA

Why if there is one available? To sell it and make lots one money :wink: No to learn, to know exactly what is in the code!

But I don't know where to start! I mean what do I actually monitor, what processes etc.

Has anyone done anything like this, any code a could take a peek at!

Re: Software hard disk activity monitor (like hardware LED)

Posted: Sat Jan 26, 2013 1:39 pm
by NicknameFJ
Hi viiartz,

there is a thread in the german forum

See this link: http://www.purebasic.fr/german/viewtopi ... 16&t=25092



NicknameFj

Re: Software hard disk activity monitor (like hardware LED)

Posted: Sat Jan 26, 2013 2:06 pm
by dige

Code: Select all

;http://pbasic.spb.ru/phpBB2/viewtopic.php?t=1066
; Author: kvitaliy 2010
; PureBasic v 4.4

#IOCTL_DISK_PERFORMANCE     = $70020;

Structure DISK_PERFORMANCE
  BytesRead.q;
  BytesWritten.q;
  ReadTime.q;
  WriteTime.q;
  IdleTime.q;
  ReadCount.l;
  WriteCount.l;
  QueueDepth.l;
  SplitCount.l;
  QueryTime.l;
  StorageDeviceNumber.l;
  StorageManagerName.l[8];
EndStructure
SystemPath.s=Space(255)
Result=GetSystemDirectory_(SystemPath.s,255)
Global hdh
;Procedure ScrollLock-blinken
Procedure SetScrollLED(VKkey.l, bState.b)
  
  Dim keyState.b(256)
  GetKeyboardState_(@keyState(0))
  
  If (bState = #True And keyState(VKkey) = 0) Or (bState = #False And keyState(VKkey) = 1)
    keybd_event_(VKkey, 0, #KEYEVENTF_EXTENDEDKEY, 0)
    keybd_event_(VKkey, 0, #KEYEVENTF_EXTENDEDKEY + #KEYEVENTF_KEYUP, 0)
    keyState(VKkey) = bState
    SetKeyboardState_(@keyState(0))
  EndIf
  
EndProcedure     

Procedure OpenPhysDrive(CurrentDrive.l)
  hdh = CreateFile_("\\.\PhysicalDrive" + Str(CurrentDrive),0,0,0,#OPEN_EXISTING, 0, 0)
  ProcedureReturn hdh
EndProcedure

   ;Prüft, ob eine physische Festplatte im System nach 0 (neben 1 Disc, etc.) 
If OpenPhysDrive(0) = #INVALID_HANDLE_VALUE
  End ; es gibt keinen Ausstieg aus dem Programm-CD
EndIf
   ; Programm-Icon in der Taskleiste wird aus der System-DLL übernommen
IdIcon1=ExtractIcon_(0,SystemPath+"\SetupAPI.dll",29)     
IdIcon2=ExtractIcon_(0,SystemPath+"\SetupAPI.dll",8)   
   
dp.DISK_PERFORMANCE
     
Window_Form1=OpenWindow(0,80,80,100,100,"HDD",#PB_Window_Invisible)

CreatePopupMenu(0)
MenuItem(1, "Über")
MenuItem(2, "Beenden")

AddSysTrayIcon(1, WindowID(0),IdIcon2) ;
SysTrayIconToolTip(1, "HDD Monitor")

Repeat
  
  EventID = WaitWindowEvent(10)
  
  Result=DeviceIoControl_(hdh, #IOCTL_DISK_PERFORMANCE, 0, 0, @dp, SizeOf(DISK_PERFORMANCE), @lBytesReturned, 0);

  ; Wenn sich Dauer des Lesen verändert
  If dp\ReadTime <> OldReadTime.q; Wenn gelesen wird - LED-Anzeige-Symbol blinken lassen
    OldReadTime = dp\ReadTime
    If Not flags
      SetScrollLED(#VK_SCROLL,#True)
      ChangeSysTrayIcon(1,IdIcon2)
      flags = #True
    EndIf
  Else
    If flags
      SetScrollLED(#VK_SCROLL,#False)
      ChangeSysTrayIcon(1,IdIcon1)
      flags = #Null
    EndIf
  EndIf
  
  ; Wenn sich Dauer des Screiben verändert
  If dp\WriteTime<>OldWriteTime.q ;Wenn geschrieben wird - LED-Anzeige-Symbol blinken lassen
    OldWriteTime= dp\WriteTime
    If Not flags
      SetScrollLED(#VK_SCROLL,#True)
      ChangeSysTrayIcon(1,IdIcon2)
      flags = #True
    EndIf
  Else
    If flags
      SetScrollLED(#VK_SCROLL,#False)   
      ChangeSysTrayIcon(1,IdIcon1)
      flags = #Null
    EndIf
  EndIf
  Delay (100)
  
  If ElapsedMilliseconds() > TimeOut
    If TimeOut
      SysTrayIconToolTip(1, "HDD Monitor R:" + Str((dp\ReadCount - Count_Read)*12) + " (" + StrU(dp\BytesRead/$100000, #pb_quad) + "MB) | W:" + Str((dp\WriteCount - Count_Write)*12) + " (" + StrU(dp\BytesWritten/$100000, #pb_quad) + "MB) [Req/min]")
    EndIf
    Count_Read = dp\ReadCount
    Count_Write = dp\WriteCount
    TimeOut = ElapsedMilliseconds() + 5000
  EndIf
  
  If EventID = #PB_Event_SysTray
    Select EventType()
      Case #PB_EventType_RightClick ;Die Verarbeitung der rechten Maustaste
        DisplayPopupMenu(0, WindowID(0)) ;zeige Popup-Menü
    EndSelect
  EndIf
  
  If EventID = #PB_Event_Menu
    Select EventMenu()
      Case 2
        Quit = 1
      Case 1
        MessageRequester("HDD", "HDD Activity LED", #PB_MessageRequester_Ok)
    EndSelect
  EndIf
  If EventID = #PB_Event_CloseWindow  ; Beenden Sie das Programm
    Quit = 1
  EndIf
  
Until Quit = 1
SetScrollLED(#VK_SCROLL,#False) 

Re: Software hard disk activity monitor (like hardware LED)

Posted: Sat Jan 26, 2013 3:06 pm
by viiartz
I appreciate the help but is there an English example, or at least English comments? :?

Update:
Found this in English for those of you playing at home! http://www.purebasic.fr/english/viewtop ... 12&t=42675

Re: Software hard disk activity monitor (like hardware LED)

Posted: Sat Jan 26, 2013 3:18 pm
by SFSxOI
see the posts from dige and NicknameFJ above, and also http://translate.google.com/# if you need to translate a web page or words, for example > http://translate.google.com/translate?s ... start%3D20 or http://translate.google.com/translate?s ... start%3D20

Re: Software hard disk activity monitor (like hardware LED)

Posted: Sat Jan 26, 2013 3:33 pm
by viiartz
SFSxOI wrote:see the posts from dige and NicknameFJ above, and also http://translate.google.com/# if you need to translate a web page or words, for example > http://translate.google.com/translate?s ... start%3D20 or http://translate.google.com/translate?s ... start%3D20
Thanks SFSxOI