Gui, Add, Text, x4 h20, Диск (D:) в работе
Gui, Add, Text, yp x+8 w50 h20 vTimeText, 00:00:00
Gui, Add, Button, x4 w80 h20 vStartStop gStartStop, Стоп
Gui, Show, Restore w450 h300
Gui, Add, Picture, x0 y0 h350 w450, D:\disk.ico
FileName = D:\DRIVE_AWAKE
FileSize := 4096 ; Должен быть кратен 4096.
Timeout = 5000
hFile := pBuf := Running := 0
StartStop:
If (Running = 1) {
SetTimer, ReadTimer, Off
SetTimer, ClockTimer, Off
Gosub, Cleanup
Return
}
pBuf := DllCall("VirtualAlloc", "ptr", 0
, "ptr", FileSize
, "uint", 0x3000 ; MEM_RESERVE | MEM_COMMIT
, "uint", 4 ; PAGE_READWRITE
, "ptr")
If (pBuf = 0) {
Gosub, Cleanup
MsgBox, Ошибка VirtualAlloc.
Return
}
hFile := DllCall("CreateFile", "str", FileName
, "uint", 0xC0000000 ; GENERIC_READ | GENERIC_WRITE
, "uint", 0
, "ptr", 0
, "uint", 2 ; CREATE_ALWAYS
, "uint", 0x20000000 ; FILE_FLAG_NO_BUFFERING
, "ptr", 0
, "ptr")
If (hFile = -1) { ; INVALID_HANDLE_VALUE
Gosub, Cleanup
MsgBox, Ошибка CreateFile.
Return
}
If !DllCall("WriteFile", "ptr", hFile
, "ptr", pBuf
, "uint", FileSize
, "uint *", BytesWritten
, "ptr", 0)
{
Gosub, Cleanup
MsgBox, Ошибка WriteFile.
Return
}
Running := 1
SetTimer, ReadTimer, %Timeout%
GuiControl,, StartStop, Стоп
TickCount0 := A_TickCount
SetTimer, ClockTimer, 1000
ReadTimer:
DllCall("SetFilePointer", "ptr", hFile
, "int", 0
, "ptr", 0
, "uint", 0) ; FILE_BEGIN
If !DllCall("ReadFile", "ptr", hFile
, "ptr", pBuf
, "uint", FileSize
, "uint *", BytesRead
, "ptr", 0)
{
SetTimer, ReadTimer, Off
Gosub, Cleanup
MsgBox, Ошибка ReadFile.
}
Return
Cleanup:
If (hFile > 0) {
DllCall("CloseHandle", "ptr", hFile)
}
If (pBuf != 0) {
DllCall("VirtualFree", "ptr", pBuf, "ptr", 0, "uint", 0x8000) ; MEM_RELEASE
}
hFile := pBuf := Running := 0
GuiControl,, StartStop, Старт
GuiControl,, TimeText, 00:00:00
Return
ClockTimer:
Time := (A_TickCount - TickCount0) // 1000
Time := Format("{1:02i}:{2:02i}:{3:02i}"
, Time // 3600
, Mod(Time, 3600) // 60
, Mod(Time, 60) )
GuiControl,, TimeText, %Time%
Return
GuiClose:
ExitApp