Newsgroup: it.comp.lang.visual-basic
Titolo: Numero seriale CPU e Hard Disk

Ciao a tutti,
Qualcuno mi sa dire come posso "leggere" da VB il numero di serie dell'Hard
Disk e della CPU
Grazie

 ha scritto nel messaggio
news:8ccfqt$fie$1...@lacerta.tiscalinet.it...


 Disk e della CPU
Per quanto riguarda il numero di serie di un HD, usi la funzione:
Public Declare Function GetVolumeInformation Lib "kernel32" _
        Alias "GetVolumeInformationA" ( _
        ByVal lpRootPathName As String, _
        ByVal lpVolumeNameBuffer As String, _
        ByVal nVolumeNameSize As Long, _
        lpVolumeSerialNumber As Long, _
        lpMaximumComponentLength As Long, _
        lpFileSystemFlags As Long, _
        ByVal lpFileSystemNameBuffer As String, _
        ByVal nFileSystemNameSize As Long) As Long
alla quale passi la root dell'HD ("c:\") in lpRootPathName
Ti ritorna l'informazione in lpVolumeSerialNumber.
Per quanto riguarda il numero (di serie ?) della CPU, si
devono usare gli interrupt. Quindi non è possibile farlo
in VB. Mi pare che la libreria Time2Win (shareware)
abbia questa funzione. Non sono sicuro.

devono usare gli interrupt. Quindi non è possibile farlo
   ma no, mai cosa simile!
 É impedito dal SO!
 ma così
 Public Const PROCESSOR_INTEL_386 = 386
 Public Const PROCESSOR_INTEL_486 = 486
 Public Const PROCESSOR_INTEL_PENTIUM = 586
 Public Const PROCESSOR_MIPS_R4000 = 4000
 Public Const PROCESSOR_ALPHA_21064 = 21064
  Dim sysinfo As SYSTEM_INFO
  GetSystemInfo sysinfo
  Select Case sysinfo.dwProcessorType
    Case PROCESSOR_INTEL_386
     Processore = "Intel 386"
    Case PROCESSOR_INTEL_486
     Processore = "Intel 486"
    Case PROCESSOR_INTEL_PENTIUM
     Processore = "Intel Pentium"
    Case PROCESSOR_MIPS_R4000
     Processore = "MIPS R4000"
    Case PROCESSOR_ALPHA_21064
     Processore = "DEC Alpha 21064"
    Case Else
     Processore = "(sconosciuto)"
  End Select
ciao


  ma così
[...]
Sta cercando il numero di serie, non il tipo di CPU

Te ci hai mai provato?
ciao


 ciao
Evidentemente si.
Questa che segue, ad esempio, č una chiamata per
effettuare un lettura a basso livello del disco.
struct
{
  unsigned int  info;
  long          serial_number;
  char          vol[11];
  char          fat_type[8];
} disk_info;
struct REGPACK reg;
reg.r_ax = 0x6900;
reg.r_bx = drive;
reg.r_ds = FP_SEG(&disk_info);
reg.r_dx = FP_OFF(&disk_info);
intr(0x21, &reg);  /* interrupt 0x21, funzione 0x69 */
Si potrebbe in alternativa usare DOS3Call()
o DPMI (300h). Letture e scritture assolute tramite
Int 25 e 26.

Questa che segue, ad esempio, è una chiamata per


 following table.
Notato l'uso del verbo "should be replaced", in riferimento alle chiamate
INT 21 ? Non "must be replaced" o, come diceva prima, "will not run".
Ossia, come avevo detto, MS sollecita i programmatori ad utilizzare
metodi compatibili. Indicazione che da molto spesso.
Alcune volte però non è possibile seguire alla lettera l'indicazione se si
vogliono svolgere certi compiti in un certo modo e con una certa velocità.
Si sceglie quindi un compromesso che a volte sacrifica la compatibilità e
la portabilità a vantaggio del risultato.
La libreria che avevo indicato nel primo reply, contiene funzioni
scritte in assembly (ed infatti sotto NT molte funzioni non fanno altro
che invocare il caro vecchio Dr. Watson).
Comunque la discussione mi interessa. Se vuoi passare in "matrix"
ci sto.

 scritte in assembly (ed infatti sotto NT molte funzioni non fanno altro
Dove tutto è rigorosamente e costantemente sott'occhio, right?


 Questa che segue, ad esempio, č una chiamata per


> Cerchiamo di essere utili al sig che ha scritto prima.
Senti.
 Dato che sembra che tu sappia come fare, scrivi
al ns amico la routine con l'nterfaccia di supporto
e chiudiamo qui.
ciao
Noseda


 usare una disk utility di DOS 6.2, e poco ci mancava che mi fucilassero
Un programma scritto per DOS "ignora" troppe cose.
Non conosce la nuova struttura della FAT32, non conosce
i nomi lunghi, non conosce la definizione corrente del MBR ecc.
C'è anche da considerare che Windows mantiene una black list
dei programmi DOS che svolgono operazioni su disco e li inibisce
se li identifica. Inoltre, un programma DOS gira in una virtual
machine dove le operazioni si svolgono sotto un certo controllo.
Altro conto è un programma che gira sotto Windows e sa quando
è il caso tentare un'operazione e quando no.
In molti casi, dei metodi non sono applicabili ad un particolare
sistema operativo. Nel caso, si usano determinati accorgimenti.
L'esempio che avevo fatto, ad esempio, non funziona in Win3xx
per il floppy, mentre funziona per l'hard disk. Altrove non funziona
e basta, occorre usare Int 25 per la lettura a basso livello, con i
rischi che comporta. L'impostante è sapere quello che si fa.

 e chiudiamo qui.
Vabbe'. Chiaramente non si può fare tutto direttamente da VB,
però come informazione, forse può servire.
I processori Intel della serie Pentium - comprese le prime versioni
e la CPU PentiumPro, dispongono di una istruzione CPUID che
rende informazioni sulla tipologia del processore, ottenibile tramite
parametri specificati nei registri general purpose. Lo schema delle
proprietà, in Assembly, è il seguente:
Case EAX=0;
{
    EAX                     = massimo indice supportato
    EBX:EDX:ECX    = GenuineIntel
}
Case EAX = 1;
{
    EAX                    = famigia:modello:stepping
    EBX:ECX            = riservato
    EDX                    = feature flags (bit 18 per il nuovo
                                   processor feature number [ps#])
}
Case EAX = 2;
{
    EAX:EBX:ECX:EDX    = cache e parametri TLB
}
Case EAX = 3;
{
    EAX:EBX        = riservato
    ECX:EDX        = numero di serie del processore
}
Per ottenere l'informazione, si utilizza l'istruzione CPUID
pre-impostando EAX = 1. Si testa il bit 18 di EDX e se il
carrier è settato, significa che è possibile ottenere un numero
di serie dal processore. Si imposta quindi EAX = 3; richiamando
l'istruzione CPUID, ECX:EDX conteranno il numero di serie
(unico) della CPU. Il valore è chiaramente un unsigned long.
Per semplificare un po' le cose - dato che da VB fare questo
è abbastanza improbabile, per ora almeno - esiste una DLL
(ufficiale) a 16 e 32 bit che esporta, tra le altre, le funzioni:
wincpufeatures(), wincpuid(), wincpuidext(), wincpuidsupport().
E' in C, non ci sono le dichiarazioni per VB, ma se a
qualcuno interessa, posso inviarla.
Inoltre, una referenza:
Pentium® Pro Family Developer's Manual, Volume 2:
Programmers Reference Manual, Order Number 000900-001,
Intel Literature Sales, Mt. Prospect, IL, 1996, pp. 11-73 to 11-79.