Zarzadzanie zasilaniem komputera.

Jesli zastanawialiscie sie kiedys, jak wylaczac dyski twarde lub resetowac
 komputer uzywajac tylko oprogramowania (tj. nie naciskajac zadnych
 przyciskow), to w tym artykule powinniscie znalezc odpowiedz na wszystkie
 wasze pytania.



Dyski twarde.

Oczywiscie, jak na porzadny system przystalo, nie mozemy "dobrac sie"
 bezposrednio do dysku twardego. Ale umozliwi na to sam system, poprzez
 funkcje systemowa sys_ioctl. Ponizej przedstawiam dzialajacy (choc, aby
 otworzyc plik urzadzenia dysku twardego, musialem miec uprawnienia root'a)
 kod zatrzymujacy dysk twardy. Kod ten napisalem dzieki analizie kodu
 zrodlowego programu hdparm (i tam, oraz do man ioctl, ioctl_list, odsylam
 po szczegoly). Dla tych, ktorzy nie korzystaja z mojej biblioteki, podaje
 liczbowe odpowiedniki stalych.

Oto program (skladnia NASM):
=============================================
%include "bibl/incl/nasm/n_system.inc"		; stale systemowe

section .text

global _start

_start:
	mov	eax, sys_open			; =5. otwieramy plik....
	mov	ebx, dysk			; ....twardego dysku
	mov	ecx, O_RDONLY|O_NONBLOCK	; 04000 osemkowo
	int	80h

	cmp	eax, 0
	jle	koniec				; jesli wystapil blad,
						; wychodzimy od razu

	mov	ebx, eax			; zachowujemy deskryptor pliku

	mov	eax, sys_ioctl			; =54
	; EBX = deskryptor pliku
	mov	ecx, 0x031f			; komenda specjalna dysku
	mov	edx, args1			; pierwsze argumenty
	int	80h

	mov	eax, sys_ioctl
	; EBX = deskryptor pliku
	mov	ecx, 0x031f			; komenda specjalna dysku
	mov	edx, args2			; drugie argumenty
	int	80h

	mov	eax, sys_close			; =6
	; EBX = deskryptor pliku
	int	80h				; zamykamy otwarty plik

koniec:
	mov	eax, sys_exit			; =1
	xor	ebx, ebx
	int	80h				; wychodzimy z programu

section .data
args1	db	0e6h, 0, 0, 0			; skopiowane z hdparm.c
args2	db	99h, 0, 0, 0			; jw.
dysk	db	"/dev/hda",0			; pierwszy dysk,hdb = drugi ...
=============================================


UWAGA: nalezy odczekac chwile, az program sie zakonczy. Przez czas dzialania
programu komputer moze przestac reagowac.
Po zatrzymaniu twardego dysku mozna go uruchomic wykonujac dowolna operacje
na systemie plikow (na przyklad wyswietlic zawartosc biezacego katalogu).




Resetowanie komputera lub wylaczanie go.

Do zresetowania komputera posluzy nam funkcja systemowa sys_reboot, ktorej
podamy odpowiednie parametry. Oto program natychmiast resetujacy komputer:

=============================================
%include "bibl/incl/nasm/n_system.inc"

section .text

global _start

_start:
	mov	eax, sys_reboot			; =88
	mov	ebx, 0fee1deadh			; wymagana stala
	mov	ecx, 672274793			; wymagana stala
				; EDX = tryb restartu. U nas: zwykly reset.
	mov	edx, LINUX_REBOOT_CMD_RESTART	; =0x01234567
	int	80h

	; to, co jest ponizej nigdy nie zostanie wykonane.
	mov	eax, sys_exit			; =1
	xor	ebx, ebx
	int	80h
=============================================

A oto program natychmiast wylaczajacy komputer:

=============================================
%include "bibl/incl/nasm/n_system.inc"

section .text

global _start

_start:
	mov	eax, sys_reboot			; =88
	mov	ebx, 0fee1deadh			; wymagana stala
	mov	ecx, 672274793			; wymagana stala
				; EDX = tryb restartu. U nas: wylaczenie pradu.
	mov	edx, LINUX_REBOOT_CMD_POWER_OFF	; =0x4321FEDC
	int	80h

	; to, co jest ponizej nigdy nie zostanie wykonane.
	mov	eax, sys_exit			; =1
	xor	ebx, ebx
	int	80h
=============================================

UWAGA: ze wzgledu na to, ze podane programy wylaczaja/resetuja komputer
 natychmiast po uruchomieniu, NIE zalecam ich stosowania, gdyz moze to byc
 niezdrowe dla systemu plikow.
