Page 1 sur 1

Lib InfoHD retourne des informations physique du disque dur

Publié : dim. 16/oct./2005 9:00
par julien
Voici ma nouvelle lib : InfoHD()


Cette librairie permet d'avoir des informations sur le disque dur :

- Numero de serie physique (pas du volume)
- Nom d'usine du disque dur
- Version du Firmware

Le lien :
http://purebasic.free.fr/Purebasic/userlib/infoHd.zip

Je l'ai testé sous Windows 2000 et XP avec des disque dur recent. Si vous pouviez la tester sous Win98 et avec vos disque dur ! :wink:
Dîtes moi ce que vous en pensez :)


Voici un exemple d'utilisation

Code : Tout sélectionner

; Exemple
MessageRequester("Model",InfoHD(0,#HD_Model),0)
MessageRequester("Numero de série physique",InfoHD(0,#HD_Serie),0)
MessageRequester("Version du Firmware",InfoHD(0,#HD_Firmware),0)
MessageRequester("Toutes les informations",InfoHD(0,#HD_tout),0)

Publié : dim. 16/oct./2005 9:04
par bernard13
tu es bon pour crée les lib toi
Bravo felicitation
j'aime beaucoup tes libs

Publié : dim. 16/oct./2005 9:59
par Remy Vincent
Mon dieu, j'ai quatres messages vides, est-ce normal ... ?
par contre les titres sont exactement les mêmes que dans le code!
Je suis trop frustré.., mais je peux pas tester plus sur mon Windows 98 ( sans les sources de "InfoHD" ).

Bon courage


PS: VersionLibHD() affiche "1.00", je n'ai peut-être pas téléchargé la bonne version??

Publié : dim. 16/oct./2005 11:19
par gansta93
Malgré son message plus qu'idiot parce que provocateur, il a raison... marche pas sous Win 98.

Publié : dim. 16/oct./2005 11:22
par julien
C'est quoi le model de votre disque dur, je pense que ça ne fonctionne pas sur les disque ne supportant pas la tech. smart
Edit : Normalement si ça echoue la fonction retourne "-1"

Publié : dim. 16/oct./2005 23:01
par KarLKoX
Pas mal, lib en opensource ? :idea:
J'aimerais bien y jeter un oeil (simple curiosité) :roll:

Publié : lun. 17/oct./2005 8:08
par gnozal
Exemple pour le numéro de série du disque dur (d'après un code de Rings).
Fonctionne aussi sous Win9x.

Code : Tout sélectionner

Procedure.s ChangeHighLowByte(Instring.s) ;Change Big-Little Endian
  Protected sdummy.s, l.l, I.l
  l = Len(Instring)
  For I = 1 To l Step 2
    If (I + 1) <= l
      sdummy = sdummy + Mid(Instring, I + 1, 1) + Mid(Instring, I, 1)
    EndIf
  Next I
  ProcedureReturn sdummy
EndProcedure
Structure IDEREGS
  bFeaturesReg.b
  bSectorCountReg.b
  bSectorNumberReg.b
  bCylLowReg.b
  bCylHighReg.b
  bDriveHeadReg.b
  bCommandReg.b
  bReserved.b
EndStructure
Structure DRIVERSTATUS
  bDriveError.b
  bIDEStatus.b
  bReserved.b[2]
  dwReserved.l[2]
EndStructure
Structure SENDCMDINPARAMS
  cBufferSize.l
  irDriveRegs.IDEREGS
  bDriveNumber.b
  bReserved.b[3]
  dwReserved.l[4]
EndStructure
Structure SENDCMDOUTPARAMS
  cBufferSize.l
  DStatus.DRIVERSTATUS
  bBuffer.b[512]
EndStructure
#DFP_RECEIVE_DRIVE_DATA = $7C088
ProcedureDLL.s GetDriveSerial(PhysicalDrive.l) ; Retrieves physical drive serial [empty string if failed]
  Protected  mvarCurrentDrive.l, VersionInfo.OSVERSIONINFO, Platform.l, hdh.l, br.l, Result.l
  Protected bin.SENDCMDINPARAMS, bout.SENDCMDOUTPARAMS, Serial.s
  If PhysicalDrive >= 0 And PhysicalDrive <= 255
    VersionInfo\dwOSVersionInfoSize = SizeOf(OSVERSIONINFO)
    Platform = GetVersionEx_(VersionInfo)
    If Platform
      If VersionInfo\dwPlatformId = #VER_PLATFORM_WIN32_WINDOWS ; Win9x/Me
        hdh = CreateFile_("\\.\SMARTVSD", #GENERIC_READ, #FILE_SHARE_READ, 0, #OPEN_EXISTING, 0, 0)
      Else ; NT kernel
        hdh = CreateFile_("\\.\PhysicalDrive" + Str(PhysicalDrive), #GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
      EndIf
    EndIf
    If hdh <> #INVALID_HANDLE_VALUE
      bin\bDriveNumber = PhysicalDrive
      bin\cBufferSize = 512
      If PhysicalDrive & 1
        bin\irDriveRegs\bDriveHeadReg = $B0
      Else
        bin\irDriveRegs\bDriveHeadReg = $A0
      EndIf
      bin\irDriveRegs\bCommandReg = $EC
      bin\irDriveRegs\bSectorCountReg = 1
      bin\irDriveRegs\bSectorNumberReg = 1
      Result = DeviceIoControl_(hdh, #DFP_RECEIVE_DRIVE_DATA, bin, SizeOf(SENDCMDINPARAMS), bout, SizeOf(SENDCMDOUTPARAMS), @br, 0)
      If br > 0
        Serial = Trim(ChangeHighLowByte(PeekS(@bout\bBuffer[0] + 20, 20)))
      EndIf
    EndIf
  EndIf
  ProcedureReturn Serial
EndProcedure
Debug GetDriveSerial(0)

Publié : lun. 17/oct./2005 9:17
par KarLKoX
Ok, c'est juste que j'avais codé et posté un truc similaire et je voulais voire comment Rings s'y étais pris pour le support win98 :)

Publié : lun. 17/oct./2005 10:52
par gnozal
En fait, le code original de Rings ne le supporte pas !
La solution vient plus tard dans le thread : http://forums.purebasic.com/english/vie ... php?t=6599

Publié : lun. 17/oct./2005 11:06
par KarLKoX
oui oui, j'avais vu ça ;) (j'avais rien trouvé sur la MSDN).