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.
(11 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Utilizzando la funzione esterna | + | 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., relative a un hard-disk SATA. |
− | |||
− | |||
+ | Sarà necessario richiamare nel progetto Gambas la libreria condivisa: "''libc.so.6'' ". | ||
Mostriamo di seguito un esempio pratico, avendo cura di <SPAN Style="text-decoration:underline">eliminare la protezione</span> al file-device "''/dev/sda''": | Mostriamo di seguito un esempio pratico, avendo cura di <SPAN Style="text-decoration:underline">eliminare la protezione</span> al file-device "''/dev/sda''": | ||
Riga 11: | Riga 10: | ||
<FONT Color=gray>' ''int ioctl (int __fd, unsigned long int __request, ...)'' | <FONT Color=gray>' ''int ioctl (int __fd, unsigned long int __request, ...)'' | ||
' ''Perform the I/O control operation specified by REQUEST on FD.''</font> | ' ''Perform the I/O control operation specified by REQUEST on FD.''</font> | ||
− | Private Extern ioctl(__fd As Integer, __request As Long, | + | Private Extern ioctl(__fd As Integer, __request As Long, hd_drived As Pointer) As Integer |
− | + | Public Sub Main() | |
− | + | ||
+ | Dim fl As File | ||
Dim hd As Pointer | Dim hd As Pointer | ||
− | |||
Dim err As Integer | Dim err As Integer | ||
− | + | ||
+ | <FONT Color=gray>' ''Elimina la protezione del file-device "/dev/sda".''</font> | ||
+ | <FONT Color=#006400>' '''''Si dovrà inserire la propria password di sistema.'''''</font> | ||
+ | Shell "echo <FONT Color=darkorange>MIA_PASSWORD</font> | sudo -S chmod 444 /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) <FONT Color=gray>'</font> <SUP>[[[#Note|'''nota 1''']]]</sup> |
− | If err < 0 Then Error.Raise("Errore alla funzione 'ioctl()' !") | + | If err < 0 Then |
− | + | Chiusura(hd, fl) | |
− | Print " | + | Error.Raise("Errore alla funzione 'ioctl()' !") |
+ | Endif | ||
+ | |||
+ | Print "\n\nCilindri: "; 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 33: | Riga 39: | ||
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( | + | Chiusura(hd, fl) |
− | + | ||
− | + | End | |
− | + | ||
+ | |||
+ | Private Procedure Chiusura(p As Pointer, fi As File) | ||
+ | |||
+ | Free(p) | ||
+ | fi.Close | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Tenere presente che funziona solo per le unità IDE/SATA, mentre le unità SCSI non sono supportate. | ||
+ | |||
+ | |||
+ | |||
+ | =Riferimenti= | ||
+ | * https://www.kernel.org/doc/Documentation/ioctl/hdio.txt |
Versione attuale delle 08:44, 19 ott 2024
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., relative a un hard-disk SATA.
Sarà necessario richiamare nel progetto Gambas la libreria 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, hd_drived As Pointer) As Integer Public Sub Main() Dim fl As File Dim hd As Pointer 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 444 /dev/sda" Wait fl = Open "/dev/sda" For Read hd = Alloc(SizeOf(gb.Byte), 512) err = ioctl(fl.Handle, HDIO_GET_IDENTITY, hd) ' [nota 1] If err < 0 Then Chiusura(hd, fl) Error.Raise("Errore alla funzione 'ioctl()' !") Endif Print "\n\nCilindri: "; 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) Chiusura(hd, fl) End Private Procedure Chiusura(p As Pointer, fi As File) Free(p) fi.Close End
Note
[1] Tenere presente che funziona solo per le unità IDE/SATA, mentre le unità SCSI non sono supportate.