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.
 
(13 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
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.
+
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 dinamica condivisa: "''libc.so.6''"
 
  
 +
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, drived As Pointer) As Integer 'Hd_driveid) As Integer
+
  Private Extern ioctl(__fd As Integer, __request As Long, hd_drived As Pointer) As Integer
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
    
+
 +
   Dim fl As File
 
   Dim hd As Pointer
 
   Dim hd As Pointer
  Dim fl As File
 
 
   Dim err As Integer
 
   Dim err As Integer
 
 
 
   
 
   
    fl = Open "/dev/sda" For Read
+
<FONT Color=gray>' ''Elimina la protezione del file-device "/dev/sda".''</font>
   
+
<FONT Color=#006400>' '''''Si dovrà inserire la propria password di sistema.'''''</font>
    hd = Alloc(512)
+
  Shell "echo <FONT Color=darkorange>MIA_PASSWORD</font> | sudo -S chmod 444 /dev/sda" Wait
 
+
    err = ioctl(fl.Handle, HDIO_GET_IDENTITY, hd)
+
  fl = Open "/dev/sda" For Read
    If err < 0 Then Error.Raise("Errore alla funzione 'ioctl()' !")
+
   
+
  hd = Alloc(SizeOf(gb.Byte), 512)
    Print "Cilindri:      "; Short@(hd + 2)
+
    Print "Heads:          "; Short@(hd + 6)
+
  err = ioctl(fl.Handle, HDIO_GET_IDENTITY, hd) <FONT Color=gray>'</font> <SUP>&#091;[[#Note|'''nota 1''']]&#093;</sup>
    Print "Settori:        "; Short@(hd + 12)
+
  If err < 0 Then
    Print "Numero seriale: "; String@(hd + 20)
+
    Chiusura(hd, fl)
    Print "Firmware rev.:  "; String@(hd + 46)
+
    Error.Raise("Errore alla funzione 'ioctl()' !")
    Print "Modello:        "; String@(hd + 54)
+
  Endif
   
+
    Free(hd)
+
  Print "\n\nCilindri:      "; Short@(hd + 2) & Space(16)
    fl.Close
+
  Print "Heads:          "; Short@(hd + 6)
 
+
  Print "Settori:        "; Short@(hd + 12)
  '''End'''
+
  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.
 +
 
 +
 
 +
 
 +
=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.


Riferimenti