Differenze tra le versioni di "Conoscere numero seriale, modello ed altre informazioni su hard-disk SATA con la funzione esterna ioctl()"
Da Gambas-it.org - Wikipedia.
Riga 19: | Riga 19: | ||
Dim fl As File | Dim fl As File | ||
Dim err As Integer | Dim err As Integer | ||
− | + | ||
+ | <FONT Color=gray>' ''Elimina la protezione del file-device "/dev/sda".'' | ||
+ | ' ''Si dovrà inserire la propria password di sistema.''</font> | ||
+ | Shell "echo <FONT Color=gray>mia_password</font> | sudo -S chmod 666 /dev/sda" Wait | ||
+ | |||
fl = Open "/dev/sda" For Read | fl = Open "/dev/sda" For Read | ||
− | + | ||
hd = Alloc(SizeOf(gb.Byte), 512) | hd = Alloc(SizeOf(gb.Byte), 512) | ||
− | + | ||
err = ioctl(fl.Handle, HDIO_GET_IDENTITY, hd) | err = ioctl(fl.Handle, HDIO_GET_IDENTITY, hd) | ||
If err < 0 Then | If err < 0 Then | ||
Riga 29: | Riga 33: | ||
Error.Raise("Errore alla funzione 'ioctl()' !") | Error.Raise("Errore alla funzione 'ioctl()' !") | ||
Endif | Endif | ||
− | + | ||
− | Print "Cilindri: "; Short@(hd + 2) | + | Print "Cilindri: "; Short@(hd + 2) & Space(16) |
Print "Heads: "; Short@(hd + 6) | Print "Heads: "; Short@(hd + 6) | ||
Print "Settori: "; Short@(hd + 12) | Print "Settori: "; Short@(hd + 12) | ||
Riga 36: | Riga 40: | ||
Print "Firmware rev.: "; Left(String@(hd + 46), 8) | Print "Firmware rev.: "; Left(String@(hd + 46), 8) | ||
Print "Modello: "; Left(String@(hd + 54), 40) | Print "Modello: "; Left(String@(hd + 54), 40) | ||
− | + | ||
Free(hd) | Free(hd) | ||
fl.Close | fl.Close | ||
− | + | ||
'''End''' | '''End''' |
Versione delle 15:04, 27 mag 2023
Utilizzando la funzione esterna ioctl(), e facendo riferimento alla Struttura esterna hd_driveid del file header /usr/include/linux/hdreg.h, è possibile ottenere alcune informazioni, come numero seriale, modello etc., rlative a un hard-disk SATA.
Sarà necessario richiamare nel progetto Gambas la libreria dinamica condivisa: "libc.so.6"
Mostriamo di seguito un esempio pratico, avendo cura di eliminare la protezione al file-device "/dev/sda":
Library "libc:6" Private Const HDIO_GET_IDENTITY As Integer = &030D ' int ioctl (int __fd, unsigned long int __request, ...) ' Perform the I/O control operation specified by REQUEST on FD. Private Extern ioctl(__fd As Integer, __request As Long, drived As Pointer) As Integer 'Hd_driveid) As Integer Public Sub Main() Dim hd As Pointer Dim fl As File Dim err As Integer ' Elimina la protezione del file-device "/dev/sda". ' Si dovrà inserire la propria password di sistema. Shell "echo mia_password | sudo -S chmod 666 /dev/sda" Wait fl = Open "/dev/sda" For Read hd = Alloc(SizeOf(gb.Byte), 512) err = ioctl(fl.Handle, HDIO_GET_IDENTITY, hd) If err < 0 Then Free(hd) Error.Raise("Errore alla funzione 'ioctl()' !") Endif Print "Cilindri: "; Short@(hd + 2) & Space(16) Print "Heads: "; Short@(hd + 6) Print "Settori: "; Short@(hd + 12) Print "Num. seriale: "; Trim(Left(String@(hd + 20), 20)) Print "Firmware rev.: "; Left(String@(hd + 46), 8) Print "Modello: "; Left(String@(hd + 54), 40) Free(hd) fl.Close End