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 20: Riga 20:
 
   
 
   
 
  <FONT Color=gray>' ''Elimina la protezione del file-device "/dev/sda".''
 
  <FONT Color=gray>' ''Elimina la protezione del file-device "/dev/sda".''
  ' ''Si dovrà inserire la propria password di sistema.''</font>
+
  ' '''''Si dovrà inserire la propria password di sistema.'''''</font>
   Shell "echo <FONT Color=gray>mia_password</font> | sudo -S chmod 444 /dev/sda" Wait
+
   Shell "echo <FONT Color=darkgreen>MIA_PASSWORD</font> | sudo -S chmod 444 /dev/sda" Wait
 
   
 
   
 
   fl = Open "/dev/sda" For Read
 
   fl = Open "/dev/sda" For Read

Versione delle 16:41, 5 lug 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, 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)
 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