Seite 1 von 1

HD in den Sleep-Modus schalten

Verfasst: 13.10.2006 09:18
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

Verfasst: 13.10.2006 09:36
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

Verfasst: 13.10.2006 09:55
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.

Verfasst: 13.10.2006 10:00
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]

Verfasst: 13.10.2006 10:23
von legion
Alles Klar ! Danke !