PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → Off-topic → Modéle, Firmware et Numéro de série d'un disque dur : Qui peut me tester cette procédure ? MERCI D'AVANCE
Modéle, Firmware et Numéro de série d'un disque dur : Qui peut me tester cette procédure ? MERCI D'AVANCE
Started by Philippe Pasquali, Jul., 23 2007 10:30 AM - 6 replies
Posted on July, 23 2007 - 10:30 AM
Bonjour
Je vous livre cette fonction pour test. Sur mon pc deux disques SATA j'ai
comme résultat
disk0 ST380013AS 3.43 4MR21271
disk1 ST3160815AS 3.AAC 6RA0EH2R

Ne fonctionne pas pour les disques connectés en USB

Merci d'avance pour tous les testeurs

----------------------------------------------------
UNE COLLECTION GLOBALE : ppDRIVE
----------------------------------------------------

DECLARATION DE ppDRIVE
----------------------------------------------------
CONSTANT
_GENERIC_READ = 0x80000000
_GENERIC_WRITE = 0x40000000
//
_FILE_SHARE_READ = 0x00000001
_FILE_SHARE_WRITE = 0x00000002
//
_DFP_GET_VERSION = 0x00074080
_DFP_SEND_DRIVE_COMMAND = 0x0007C084
_DFP_RECEIVE_DRIVE_DATA = 0x0007C088
//
_OPEN_EXISTING = 3
_INVALID_HANDLE_VALUE = -1
END

_IDEREGS est une structure
bFeaturesReg est un entier sans signe sur 1 octet
bSectorCountReg est un entier sans signe sur 1 octet
bSectorNumberReg est un entier sans signe sur 1 octet
bCylLowReg est un entier sans signe sur 1 octet
bCylHighReg est un entier sans signe sur 1 octet
bDriveHeadReg est un entier sans signe sur 1 octet
bCommandReg est un entier sans signe sur 1 octet
bReserved est un entier sans signe sur 1 octet
END
_SENDCMDINPARAMS est une structure
cBufferSize est un entier sans signe sur 4 octet
irDriveRegs est une _IDEREGS
bDriveNumber est un entier sans signe sur 1 octet
bReserved est un tableau fixe de 3 entier sans signe sur 1 octet
dwReserved est un tableau fixe de 4 entier sans signe sur 4 octet
END
_DRIVERSTATUS est une structure
bDriverErrorest est un entier sans signe sur 1 octet
bIDEStatusest est un entier sans signe sur 1 octet
bReserved est un tableau fixe de 2 entier sans signe sur 1 octet
dwReserved est un tableau fixe de 2 entier sans signe sur 4 octet
END
_SENDCMDOUTPARAMS est une structure
cBufferSize est un entier sans signe sur 4 octet
DriverStatus est un _DRIVERSTATUS
bBuffer est un tableau fixe de 512 entier sans signe sur 1 octet
END
_IDSECTOR est une structure
wGenConfig est un entier sans signe sur 2 octet
wNumCyls est un entier sans signe sur 2 octet
wReserved est un entier sans signe sur 2 octet
wNumHeads est un entier sans signe sur 2 octet
wBytesPerTrack est un entier sans signe sur 2 octet
wBytesPerSector est un entier sans signe sur 2 octet
wSectorsPerTrack est un entier sans signe sur 2 octet
wVendorUnique est un tableau fixe de 3 entier sans signe sur 2 octet
sSerialNumber est un tableau fixe de 20 caractères
wBufferType est un entier sans signe sur 2 octet
wBufferSize est un entier sans signe sur 2 octet
wECCSize est un entier sans signe sur 2 octet
sFirmwareRev est un tableau fixe de 8 caractères
sModelNumber est un tableau fixe de 40 caractères
wMoreVendorUnique est un entier sans signe sur 2 octet
wDoubleWordIO est un entier sans signe sur 2 octet
wCapabilities est un entier sans signe sur 2 octet
wReserved1 est un entier sans signe sur 2 octet
wPIOTiming est un entier sans signe sur 2 octet
wDMATiming est un entier sans signe sur 2 octet
wBS est un entier sans signe sur 2 octet
wNumCurrentCyls est un entier sans signe sur 2 octet
wNumCurrentHeads est un entier sans signe sur 2 octet
wNumCurrentSectorsPerTrack est un entier sans signe sur 2 octet
ulCurrentSectorCapacity est un entier sans signe sur 4 octet
wMultSectorStuff est un entier sans signe sur 2 octet
ulTotalAddressableSectors est un entier sans signe sur 4 octet
wSingleWordDMA est un entier sans signe sur 2 octet
wMultiWordDMA est un entier sans signe sur 2 octet
bReserved est un tableau fixe de 128 entier sans signe sur 1 octet
END
_GETVERSIONOUTPARAMS est une structure
bVersion est un entier sans signe sur 1 octet
bRevision est un entier sans signe sur 1 octet
bReserved est un entier sans signe sur 1 octet
bIDEDeviceMap est un entier sans signe sur 1 octet
fCapabilities est un entier
dwReserved est un tableau fixe de 4 entier
END

----------------------------------------------------------------------------------------------------------------------------------------------------
// Renvoi une chaine contenant les informations suivantes :
// "Modéle du disque" TAB "Firmware" TAB "Numéro de série"
// pour un disque physique donné par son numéro en non pas par son nom ou
lettre.
PROCEDURE GetDiskInfos(DriveNumber)
m_bytesRead est un entier sans signe
m_hDrive est un entier
cmd_InParams est un _SENDCMDINPARAMS
cmd_OutParams est un _SENDCMDOUTPARAMS
cmd_hdInfos est un _IDSECTOR
Resultat est une chaîne = ""
PhysicalDriveName est une chaîne ASCIIZ sur 128 = "\\.\PHYSICALDRIVE" +
NumériqueVersChaîne(DriveNumber)
// Go
m_hDrive = API("kernel32.dll", "CreateFileA", PhysicalDriveName,
OUBinaire(_GENERIC_READ,_GENERIC_WRITE),OUBinaire(_FILE_SHARE_READ,_FILE_SHARE_WRITE),
Null, _OPEN_EXISTING, 0, Null)
IF m_hDrive = _INVALID_HANDLE_VALUE THEN RENVOYER ""
IF m_hDrive <> Null THEN
cmd_InParams:bDriveNumber = DriveNumber
cmd_InParams:cBufferSize = 512
IF ETBinaire(DriveNumber,1) THEN
cmd_InParams:irDriveRegs:bDriveHeadReg = 0xB0
ELSE
cmd_InParams:irDriveRegs:bDriveHeadReg = 0xA0
END
cmd_InParams:irDriveRegs:bCommandReg = 0xEC
cmd_InParams:irDriveRegs:bSectorCountReg = 1
cmd_InParams:irDriveRegs:bSectorNumberReg = 1
m_bytesRead = 0
resAPI est un booléen = False
resAPI = API( "kernel32.dll", "DeviceIoControl", m_hDrive,
_DFP_RECEIVE_DRIVE_DATA, &cmd_InParams, Dimension(cmd_InParams),...
&cmd_OutParams,Dimension(cmd_OutParams), &m_bytesRead, Null)
IF NOT resAPI THEN RENVOYER ""
IF m_bytesRead <> 0 THEN
Transfert(&cmd_hdInfos, &cmd_OutParams:bBuffer, Dimension(cmd_hdInfos))
Resultat += SwapByteOrder( cmd_hdInfos:sModelNumber) + TAB
Resultat += SwapByteOrder( cmd_hdInfos:sFirmwareRev) + TAB
Resultat += SwapByteOrder( cmd_hdInfos:sSerialNumber)
END
API( "kernel32.dll", "CloseHandle", m_hDrive)
END
RENVOYER Resultat

----------------------------------------------------------------------------------------------------------------------------------------------------
// "1234567890" donne "2143658709"
FUNCTION SwapByteOrder(pData)
i est un entier
sResult est un chaîne = ""
Ch est un caractère
FOR i=1 TO Dimension(pData) STEP 2
Ch = pData[i]
pData[i] = pData[i+1]
pData[i+1] = Ch
END
FOR i=1 TO Dimension(pData)
sResult += pData[i]
END
RENVOYER SansEspace(sResult)
Posted on July, 23 2007 - 10:40 AM
Petit oublie, on l'appel par GetDiskInfos(0) pour le premier HDD,
GetDiskInfos(1) pour le second etc...

"Philippe Pasquali" <philippe-pasquali@orange.fr> a écrit dans le message de
news: 46a44a51@news.pcsoft.fr...

Bonjour
Je vous livre cette fonction pour test. Sur mon pc deux disques SATA j'ai
comme résultat
disk0 ST380013AS 3.43 4MR21271
disk1 ST3160815AS 3.AAC 6RA0EH2R

Ne fonctionne pas pour les disques connectés en USB

Merci d'avance pour tous les testeurs

----------------------------------------------------
UNE COLLECTION GLOBALE : ppDRIVE
----------------------------------------------------

DECLARATION DE ppDRIVE
----------------------------------------------------
CONSTANT
_GENERIC_READ = 0x80000000
_GENERIC_WRITE = 0x40000000
//
_FILE_SHARE_READ = 0x00000001
_FILE_SHARE_WRITE = 0x00000002
//
_DFP_GET_VERSION = 0x00074080
_DFP_SEND_DRIVE_COMMAND = 0x0007C084
_DFP_RECEIVE_DRIVE_DATA = 0x0007C088
//
_OPEN_EXISTING = 3
_INVALID_HANDLE_VALUE = -1
END

_IDEREGS est une structure
bFeaturesReg est un entier sans signe sur 1 octet
bSectorCountReg est un entier sans signe sur 1 octet
bSectorNumberReg est un entier sans signe sur 1 octet
bCylLowReg est un entier sans signe sur 1 octet
bCylHighReg est un entier sans signe sur 1 octet
bDriveHeadReg est un entier sans signe sur 1 octet
bCommandReg est un entier sans signe sur 1 octet
bReserved est un entier sans signe sur 1 octet
END
_SENDCMDINPARAMS est une structure
cBufferSize est un entier sans signe sur 4 octet
irDriveRegs est une _IDEREGS
bDriveNumber est un entier sans signe sur 1 octet
bReserved est un tableau fixe de 3 entier sans signe sur 1 octet
dwReserved est un tableau fixe de 4 entier sans signe sur 4 octet
END
_DRIVERSTATUS est une structure
bDriverErrorest est un entier sans signe sur 1 octet
bIDEStatusest est un entier sans signe sur 1 octet
bReserved est un tableau fixe de 2 entier sans signe sur 1 octet
dwReserved est un tableau fixe de 2 entier sans signe sur 4 octet
END
_SENDCMDOUTPARAMS est une structure
cBufferSize est un entier sans signe sur 4 octet
DriverStatus est un _DRIVERSTATUS
bBuffer est un tableau fixe de 512 entier sans signe sur 1 octet
END
_IDSECTOR est une structure
wGenConfig est un entier sans signe sur 2 octet
wNumCyls est un entier sans signe sur 2 octet
wReserved est un entier sans signe sur 2 octet
wNumHeads est un entier sans signe sur 2 octet
wBytesPerTrack est un entier sans signe sur 2 octet
wBytesPerSector est un entier sans signe sur 2 octet
wSectorsPerTrack est un entier sans signe sur 2 octet
wVendorUnique est un tableau fixe de 3 entier sans signe sur 2 octet
sSerialNumber est un tableau fixe de 20 caractères
wBufferType est un entier sans signe sur 2 octet
wBufferSize est un entier sans signe sur 2 octet
wECCSize est un entier sans signe sur 2 octet
sFirmwareRev est un tableau fixe de 8 caractères
sModelNumber est un tableau fixe de 40 caractères
wMoreVendorUnique est un entier sans signe sur 2 octet
wDoubleWordIO est un entier sans signe sur 2 octet
wCapabilities est un entier sans signe sur 2 octet
wReserved1 est un entier sans signe sur 2 octet
wPIOTiming est un entier sans signe sur 2 octet
wDMATiming est un entier sans signe sur 2 octet
wBS est un entier sans signe sur 2 octet
wNumCurrentCyls est un entier sans signe sur 2 octet
wNumCurrentHeads est un entier sans signe sur 2 octet
wNumCurrentSectorsPerTrack est un entier sans signe sur 2 octet
ulCurrentSectorCapacity est un entier sans signe sur 4 octet
wMultSectorStuff est un entier sans signe sur 2 octet
ulTotalAddressableSectors est un entier sans signe sur 4 octet
wSingleWordDMA est un entier sans signe sur 2 octet
wMultiWordDMA est un entier sans signe sur 2 octet
bReserved est un tableau fixe de 128 entier sans signe sur 1 octet
END
_GETVERSIONOUTPARAMS est une structure
bVersion est un entier sans signe sur 1 octet
bRevision est un entier sans signe sur 1 octet
bReserved est un entier sans signe sur 1 octet
bIDEDeviceMap est un entier sans signe sur 1 octet
fCapabilities est un entier
dwReserved est un tableau fixe de 4 entier
END

----------------------------------------------------------------------------------------------------------------------------------------------------
// Renvoi une chaine contenant les informations suivantes :
// "Modéle du disque" TAB "Firmware" TAB "Numéro de série"
// pour un disque physique donné par son numéro en non pas par son nom ou
lettre.
PROCEDURE GetDiskInfos(DriveNumber)
m_bytesRead est un entier sans signe
m_hDrive est un entier
cmd_InParams est un _SENDCMDINPARAMS
cmd_OutParams est un _SENDCMDOUTPARAMS
cmd_hdInfos est un _IDSECTOR
Resultat est une chaîne = ""
PhysicalDriveName est une chaîne ASCIIZ sur 128 = "\\.\PHYSICALDRIVE" +
NumériqueVersChaîne(DriveNumber)
// Go
m_hDrive = API("kernel32.dll", "CreateFileA", PhysicalDriveName,
OUBinaire(_GENERIC_READ,_GENERIC_WRITE),OUBinaire(_FILE_SHARE_READ,_FILE_SHARE_WRITE),
Null, _OPEN_EXISTING, 0, Null)
IF m_hDrive = _INVALID_HANDLE_VALUE THEN RENVOYER ""
IF m_hDrive <> Null THEN
cmd_InParams:bDriveNumber = DriveNumber
cmd_InParams:cBufferSize = 512
IF ETBinaire(DriveNumber,1) THEN
cmd_InParams:irDriveRegs:bDriveHeadReg = 0xB0
ELSE
cmd_InParams:irDriveRegs:bDriveHeadReg = 0xA0
END
cmd_InParams:irDriveRegs:bCommandReg = 0xEC
cmd_InParams:irDriveRegs:bSectorCountReg = 1
cmd_InParams:irDriveRegs:bSectorNumberReg = 1
m_bytesRead = 0
resAPI est un booléen = False
resAPI = API( "kernel32.dll", "DeviceIoControl", m_hDrive,
_DFP_RECEIVE_DRIVE_DATA, &cmd_InParams, Dimension(cmd_InParams),...
&cmd_OutParams,Dimension(cmd_OutParams), &m_bytesRead, Null)
IF NOT resAPI THEN RENVOYER ""
IF m_bytesRead <> 0 THEN
Transfert(&cmd_hdInfos, &cmd_OutParams:bBuffer, Dimension(cmd_hdInfos))
Resultat += SwapByteOrder( cmd_hdInfos:sModelNumber) + TAB
Resultat += SwapByteOrder( cmd_hdInfos:sFirmwareRev) + TAB
Resultat += SwapByteOrder( cmd_hdInfos:sSerialNumber)
END
API( "kernel32.dll", "CloseHandle", m_hDrive)
END
RENVOYER Resultat

----------------------------------------------------------------------------------------------------------------------------------------------------
// "1234567890" donne "2143658709"
FUNCTION SwapByteOrder(pData)
i est un entier
sResult est un chaîne = ""
Ch est un caractère
FOR i=1 TO Dimension(pData) STEP 2
Ch = pData[i]
pData[i] = pData[i+1]
pData[i+1] = Ch
END
FOR i=1 TO Dimension(pData)
sResult += pData[i]
END
RENVOYER SansEspace(sResult)

Posted on July, 23 2007 - 11:27 AM
Philippe Pasquali a exprimé avec précision :
Bonjour
Je vous livre cette fonction pour test. Sur mon pc deux disques SATA j'ai
comme résultat
disk0 ST380013AS 3.43 4MR21271
disk1 ST3160815AS 3.AAC 6RA0EH2R

Ne fonctionne pas pour les disques connectés en USB

Merci d'avance pour tous les testeurs

Je n'ai pas de disque USB, donc je ne peux dire le résultat en USB et sous WinXP ou inférieur.

Par contre sous Vista
> m_hDrive = API("kernel32.dll", "CreateFileA", PhysicalDriveName,
renvoie -1.

J'utilise une autre méthode pour récupérer les infos du disque, mais j'ai ce problème ou Vista ne fonctionne plus du tout de la
même manière. Même les clés de registre sont tout autre.
Si quelqu'un a une solution pour récupérer les infos du disque sous Vista, merci d'avance.

--
Pascal
N0.pascal.SPAM@efpe.biz
Ne garder que le prénom pour me joindre
Posted on July, 23 2007 - 11:27 AM
Dans son message précédent, Philippe Pasquali a écrit :
Petit oublie, on l'appel par GetDiskInfos(0) pour le premier HDD,
GetDiskInfos(1) pour le second etc...

"Philippe Pasquali" <philippe-pasquali@orange.fr> a écrit dans le message de
news: 46a44a51@news.pcsoft.fr...


j'obtiens :

ST380013AS 8.12 5MR37WRK

--
Cordialement JeAn-PhI
Posted on July, 23 2007 - 1:25 PM
Merci
peut tu me donner l'OS sur lequel tu as testé ?

"JeAn-PhI" <no.spam@spam.fr> a écrit dans le message de news:
mn.ba1d7d776ddfd244.49289@spam.fr...

Dans son message précédent, Philippe Pasquali a écrit :
Petit oublie, on l'appel par GetDiskInfos(0) pour le premier HDD,
GetDiskInfos(1) pour le second etc...

"Philippe Pasquali" <philippe-pasquali@orange.fr> a écrit dans le message
de
news: 46a44a51@news.pcsoft.fr...

j'obtiens :

ST380013AS 8.12 5MR37WRK

--
Cordialement JeAn-PhI

Posted on July, 23 2007 - 1:48 PM
Encore la sécurité avec VISTA c'est un vrai kastete ! Par exemple VNC ne
doit pas être installé en mode service sinon le mot de passe de
l'authentification ne fonctionne plus. Je regarde sur le net...
Merci

"Pascal F" <N0.pascal.SPAM@efpe.biz> a écrit dans le message de news:
46a45570@news.pcsoft.fr...

Philippe Pasquali a exprimé avec précision :
Bonjour
Je vous livre cette fonction pour test. Sur mon pc deux disques SATA j'ai
comme résultat
disk0 ST380013AS 3.43 4MR21271
disk1 ST3160815AS 3.AAC 6RA0EH2R

Ne fonctionne pas pour les disques connectés en USB

Merci d'avance pour tous les testeurs

Je n'ai pas de disque USB, donc je ne peux dire le résultat en USB et sous

WinXP ou inférieur.

Par contre sous Vista
m_hDrive = API("kernel32.dll", "CreateFileA", PhysicalDriveName,
renvoie -1.


J'utilise une autre méthode pour récupérer les infos du disque, mais j'ai
ce problème ou Vista ne fonctionne plus du tout de la
même manière. Même les clés de registre sont tout autre.
Si quelqu'un a une solution pour récupérer les infos du disque sous Vista,
merci d'avance.

--
Pascal
N0.pascal.SPAM@efpe.biz
Ne garder que le prénom pour me joindre

Posted on July, 23 2007 - 4:48 PM
Philippe Pasquali a exprimé avec précision :
Merci
peut tu me donner l'OS sur lequel tu as testé ?

"JeAn-PhI" <no.spam@spam.fr> a écrit dans le message de news:
mn.ba1d7d776ddfd244.49289@spam.fr...

Dans son message précédent, Philippe Pasquali a écrit :
Petit oublie, on l'appel par GetDiskInfos(0) pour le premier HDD,
GetDiskInfos(1) pour le second etc...

"Philippe Pasquali" <philippe-pasquali@orange.fr> a écrit dans le message
de
news: 46a44a51@news.pcsoft.fr...

j'obtiens :

ST380013AS 8.12 5MR37WRK

--
Cordialement JeAn-PhI



XP Pro SP2

--
Cordialement JeAn-PhI