HD in den Sleep-Modus schalten

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

HD in den Sleep-Modus schalten

Beitrag von legion »

Hallo,
habe wieder versucht eines meiner Delphi-Source nach PB zu übertragen.
Funktioniert, aber ich glaube das könnte man sicher schöner lösen. Besonders der Part mit dem Buffer gefällt mir nicht!

Code: Alles auswählen

   ;******************************************
   ;* Festplatte in den Sleep-Modus schalten *
   ;* Windows NT/2000/XP ab ATA4             *
   ;* Info to: fremdenlegion [at] gmail.com  * 
   ;****************************************** 
   
    #BufferSize = 12
    #IOCTL_IDE_PASS_THROUGH = $4D028 ;ATA - Kommando an die Festplatte
    Device.s = "\\.\PhysicalDrive0"  ;Die erste physikalische HD
    
    hDevice = CreateFile_(@Device,#GENERIC_READ|#GENERIC_WRITE ,#FILE_SHARE_READ|#FILE_SHARE_WRITE,#Null,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,0)
    If hDevice = INVALID_HANDLE_VALUE
     MessageRequester("Info","Laufwerk konnte nicht angesprochen werden",#PB_MessageRequester_Ok)
     Goto Exit
    EndIf    

    Dim Buffer.b(#BufferSize)
     Buffer(0)= 0
     Buffer(1)= 0
     Buffer(2)= 0
     Buffer(3)= 0
     Buffer(4)= 0
     Buffer(5)= $A0
     Buffer(6)= $E6 ;--> laut ATA-Definition der Sleep-Befehl
     Buffer(7)= 0
     Buffer(8)= 0
     Buffer(9)= 0
     Buffer(10)= 0
     Buffer(11)= 0
    
    ReturnValue = DeviceIoControl_(hDevice,#IOCTL_IDE_PASS_THROUGH,@Buffer(),#BufferSize,@Buffer(),#BufferSize,@cbBytesReturned,#Null)
    If ReturnValue <> 0
     MessageRequester("Info","HD erfolgreich im Sleep-Modus",#PB_MessageRequester_Ok)    
    Else
     MessageRequester("Info","Sleep-Modus fehlgeschlagen",#PB_MessageRequester_Ok)
    EndIf
    
    CloseHandle_(hDevice)
    Exit:
    End
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich habe das Problem mit dem Buffer jetzt über eine DataSection gelöst. Und
funktionieren tut der Code auch hier an dem Firmenlaptop.

Code: Alles auswählen

;******************************************
;* Festplatte in den Sleep-Modus schalten *
;* Windows NT/2000/XP ab ATA4             *
;* Info to: fremdenlegion [at] gmail.com  *
;******************************************

#BufferSize = 12
#IOCTL_IDE_PASS_THROUGH = $4D028 ;ATA - Kommando an die Festplatte
Device.s = "\\.\PhysicalDrive0"  ;Die erste physikalische HD

hDevice = CreateFile_(@Device, #GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ | #FILE_SHARE_WRITE, #Null, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0)
If hDevice = INVALID_HANDLE_VALUE
  MessageRequester("Info", "Laufwerk konnte nicht angesprochen werden")
  End
EndIf   

ReturnValue = DeviceIoControl_(hDevice, #IOCTL_IDE_PASS_THROUGH, ?ATA_Sleep, #BufferSize, ?ATA_Sleep, #BufferSize, @cbBytesReturned, #Null)
If ReturnValue
  MessageRequester("Info", "HD erfolgreich im Sleep-Modus")
Else
  MessageRequester("Info", "Sleep-Modus fehlgeschlagen")
EndIf

CloseHandle_(hDevice)
End 

DataSection
  ATA_Sleep:
  Data.b 0, 0, 0, 0, 0, $A0, $E6, 0, 0, 0, 0, 0
EndDataSection
Zuletzt geändert von NicTheQuick am 13.10.2006 09:59, insgesamt 1-mal geändert.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

Gute Idee, gefällt mir !
Wollte das Buffer-Array mit einen Rutsch über einen Pointer beschreiben, hab ich aber nicht geschafft. Muß mich erst mit den Pointer in PB vertraut machen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

[OT]
Ich habe mal deine eMail-Adresse in den Codes abgeändert, damit nicht
irgendwelche Bots sie finden. Ist nur nett gemeint.
[/OT]
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

Alles Klar ! Danke !
Antworten