how i can get the hard disk serial number in windows vista?
-
Thursday, January 03, 2008 9:07 PM
Hi !!
I am using the famous dll diskserial.dll to get the hard disk serial numer. It works perfectly in windows xp, but not works in windows vista.
how i can read the disk serial number for windows vista?. If it is posible, I prefer the solution using foxpro?
Answers
-
Friday, January 04, 2008 7:56 PM
This works perfectly under XP and VISTA
Code BlockDECLARE INTEGER CloseHandle IN kernel32 ;
INTEGER hObject
DECLARE INTEGER CreateFile IN kernel32 ;
STRING lpFileName,;
INTEGER dwDesiredAccess,;
INTEGER dwShareMode,;
INTEGER lpSecurityAttributes,;
INTEGER dwCreationDisposition,;
INTEGER dwFlagsAndAttributes,;
INTEGER hTemplateFile
DECLARE INTEGER DeviceIoControl IN kernel32 ;
INTEGER hDevice,;
INTEGER dwIoControlCode,;
STRING @lpInBuffer,;
LONG nInBufferSize,;
STRING @lpOutBuffer,;
LONG nOutBufferSize,;
INTEGER @lpBytesReturned,;
INTEGER lpOverlapped
DECLARE INTEGER GetLogicalDriveStrings IN Win32API ;
INTEGER buflen,;
STRING @buf
DECLARE INTEGER GetDriveType IN Win32API STRING cpath
DECLARE INTEGER GetVolumeInformation IN Win32API ;
STRING lpRootPathName,;
STRING @lpVolumeNameBuffer,;
INTEGER nVolumeNameSize,;
LONG @lpVolumeSerialNumber,;
INTEGER @lpMaximumComponentLength,;
INTEGER @lpFileSystemFlags,;
STRING @lpFileSystemNameBuffer,;
INTEGER nFileSystemNameSize
LOCAL m.buflen, m.buf
m.buflen = 104
m.buf = REPLICATE(CHR(0), m.buflen)
GetLogicalDriveStrings(m.buflen, @m.buf)
m.buf = CHRTRAN(m.buf, CHR(0) + "\:","")
m.str1 = ""
FOR m.i=1 TO LEN(m.buf)
m.drvtype = GetDriveType(SUBSTR(m.buf, m.i, 1) + ":\")
IF m.drvtype = 3
m.str1 = m.str1 + SUBSTR(m.buf, m.i, 1)
ENDIF
NEXT
FOR m.i = 1 TO LEN(m.str1)
m.vnb = REPLICATE(CHR(0),64)
m.vnbs = 64
m.vsn = 0
m.mcl = 0
m.fsf = 0
m.fsnb = REPLICATE(CHR(0),10)
m.fsnbs = 10
GetVolumeInformation(SUBSTR(m.str1,m.i,1) + ":\", @m.vnb, m.vnbs,@m.vsn, @m.mcl, @m.fsf, @m.fsnb, m.fsnbs)
IF m.vsn < 0
m.vsn = m.vsn + 168
ENDIF
m.vsn = PADL(ALLTRIM(SUBSTR(TRANSFORM(m.vsn,"@0"), 3)), 8, "0")
m.drivenumber = ASC(SUBSTR(m.str1, m.i, 1)) - ASC("C")
handle = CreateFile("\\.\" + CHR(ASC("c") + m.drivenumber) + ":",0xC0000000, 3, 0, 3, 0, 0)
m.sn = ""
m.mod = ""
m.rev = ""
IF handle <> -1
m.sci =""
m.sci = m.sci + CHR(0) + CHR(2) + CHR(0) + CHR(0)
m.sci = m.sci + CHR(0)
m.sci = m.sci + CHR(1)
m.sci = m.sci + CHR(1)
m.sci = m.sci + CHR(0)
m.sci = m.sci + CHR(0)
m.sci = m.sci + CHR(0xA0)
m.sci = m.sci + CHR(0xEC)
m.sci = m.sci + CHR(0)
m.sci = m.sci + CHR(0)
m.sci = m.sci + REPLICATE(CHR(0), 499)
m.sco = REPLICATE(CHR(0), 2048)
m.ret_buffersize = 0
m.otv=DeviceIoControl( handle, 0x7C088,@m.sci,LEN(sci), @m.sco,LEN(sco),@m.ret_buffersize, 0)
CloseHandle(handle)
IF m.otv <> 0
m.sn = CHRTRAN( ALLTRIM( conv21( SUBSTR(m.sco, 37, 20) ) ),CHR(0), "")
m.rev = CHRTRAN( ALLTRIM( conv21( SUBSTR(m.sco, 63, 8) ) ),CHR(0), "")
m.mod = CHRTRAN( ALLTRIM( conv21( SUBSTR(m.sco, 71, 40) ) ),CHR(0), "")
ENDIF
ENDIF
IF EMPTY(m.sn)
handle = CreateFile("\\.\" + CHR(ASC("c") + m.drivenumber) +":", 0x00000000, 3,0, 3, 0, 0)
IF handle <> -1
m.sn = ""
m.mod = ""
m.rev = ""
m.sci = REPLICATE(CHR(0),1024)
m.sco = REPLICATE(CHR(0),1024)
m.ret_buffersize = 0
m.otv = DeviceIoControl( handle, 0x2D1400, @m.sci,LEN(sci), @m.sco,LEN(sco),@m.ret_buffersize, 0 )
CloseHandle(handle)
IF m.otv <> 0
m.pos0 = ASC(SUBSTR(m.sco,13,1))
m.pos1 = ASC(SUBSTR(m.sco,17,1))
IF m.pos0 > 0
m.pos1 = m.pos0
ENDIF
m.pos2 = ASC(SUBSTR(m.sco, 21, 1))
m.pos3 = ASC(SUBSTR(m.sco, 25, 1))
m.mod = SUBSTR(m.sco, m.pos1+1, m.pos2 - m.pos1)
m.pos4 = AT(CHR(0), m.mod)
IF m.pos4 > 0
m.mod = ALLTRIM(CHRTRAN(m.mod, CHR(0), ""))
ENDIF
IF m.pos3 > m.pos2
m.rev = SUBSTR(m.sco, m.pos2+1, m.pos3 - m.pos2)
ELSE
m.rev = SUBSTR(m.sco, m.pos2+1)
ENDIF
m.pos4 = AT(CHR(0), m.rev)
IF m.pos4 > 0
m.rev = ALLTRIM(LEFT(m.rev, m.pos4 - 1))
ENDIF
IF m.pos3 > 0
m.pos3 = m.pos3 + 1
m.sco1 = SUBSTR(m.sco, m.pos3, 40)
m.sco1 = ALLTRIM(m.sco1)
m.sn = ""
m.pos3 = 1
FOR m.j = 1 TO 20
m.ch1 = CHR(EVALUATE("0x" +ALLTRIM(SUBSTR(m.sco1, m.pos3, 2))))
m.pos3 = m.pos3 + 2
m.ch2 = CHR(EVALUATE("0x" +ALLTRIM(SUBSTR(m.sco1, m.pos3, 2))))
m.pos3 = m.pos3 + 2
m.sn = m.sn + m.ch2 + m.ch1
ENDFOR
m.sn = ALLTRIM(CHRTRAN(m.sn, CHR(0), ""))
ELSE
m.sn = ""
ENDIF
ENDIF
ENDIF
ENDIF
?SUBSTR(m.str1, m.i, 1) + ":\ VolSN: " + m.vsn + " " +CHRTRAN(m.fsnb, CHR(0), "") + "Model: " + m.mod + " Revision: " + m.rev+ " Serial: " + m.sn
ENDFOR
*/===============================================
FUNCTION conv21
*/===============================================
LPARAMETERS m.str
IF LEN(m.str)%2 = 1
m.str = m.str + " "
ENDIF
LOCAL m.i, m.str2
m.str2 = ""
FOR m.i=1 TO LEN(m.str)
m.str2 = m.str2 + SUBSTR(m.str, m.i + IIF(m.i%2=0, -1, 1), 1)
ENDFOR
RETURN m.str2
All Replies
-
Friday, January 04, 2008 9:51 AM
I'm not sure if this would really help:
Code BlockCreate Cursor myDisks (DriveLetter c(1),SerialNumber c(50),Model c(50),DeviceID c(50),VolumeName c(50),VolumeSerialNumber c(20))
wmiServices = Getobject("winmgmts:{impersonationLevel=Impersonate}!//.")
wmiDiskDrives = wmiServices.ExecQuery("SELECT Model,DeviceID FROM Win32_DiskDrive")For Each wmiDiskDrive In wmiDiskDrives
lcDeviceID = Trim(Strtran(wmiDiskDrive.DeviceID,'\','\\'))
wmiDiskPartitions = wmiServices.ExecQuery(;
'ASSOCIATORS OF {Win32_DiskDrive.DeviceID="' +;
m.lcDeviceID + '"} WHERE '+ ;
'AssocClass = Win32_DiskDriveToDiskPartition')For Each wmiDiskPartition In wmiDiskPartitions
wmiLogicalDisks = wmiServices.ExecQuery( ;
'ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+;
wmiDiskPartition.DeviceID + '"} WHERE '+;
'AssocClass = Win32_LogicalDiskToPartition')For Each wmiLogicalDisk In wmiLogicalDisks
wmiDiskVolumes = wmiServices.ExecQuery(;
"Select deviceID,VolumeName,VolumeSerialNumber from Win32_LogicalDisk"+;
" where deviceID = '" + wmiLogicalDisk.deviceID + "'" )
For Each oVolume In wmiDiskVolumes
lcVolumeName = oVolume.VolumeName
lcVolumeSerialNumber = oVolume.VolumeSerialNumber
Exit
EndforwmiDisks = wmiServices.ExecQuery(;
'SELECT * FROM Win32_PhysicalMedia where Tag="'+m.lcDeviceID+'"')
For Each wmiDisk In wmiDisks
Insert Into myDisks ;
(DriveLetter,SerialNumber,Model,DeviceID,VolumeName,VolumeSerialNumber) ;
values ;
(wmiLogicalDisk.DeviceID,;
wmiDisk.SerialNumber,;
wmiDiskDrive.Model,;
wmiDiskDrive.DeviceID,;
m.lcVolumeName,;
m.lcVolumeSerialNumber)
Endfor
Endfor
Endfor
Endfor
Browse -
Friday, January 04, 2008 7:56 PM
This works perfectly under XP and VISTA
Code BlockDECLARE INTEGER CloseHandle IN kernel32 ;
INTEGER hObject
DECLARE INTEGER CreateFile IN kernel32 ;
STRING lpFileName,;
INTEGER dwDesiredAccess,;
INTEGER dwShareMode,;
INTEGER lpSecurityAttributes,;
INTEGER dwCreationDisposition,;
INTEGER dwFlagsAndAttributes,;
INTEGER hTemplateFile
DECLARE INTEGER DeviceIoControl IN kernel32 ;
INTEGER hDevice,;
INTEGER dwIoControlCode,;
STRING @lpInBuffer,;
LONG nInBufferSize,;
STRING @lpOutBuffer,;
LONG nOutBufferSize,;
INTEGER @lpBytesReturned,;
INTEGER lpOverlapped
DECLARE INTEGER GetLogicalDriveStrings IN Win32API ;
INTEGER buflen,;
STRING @buf
DECLARE INTEGER GetDriveType IN Win32API STRING cpath
DECLARE INTEGER GetVolumeInformation IN Win32API ;
STRING lpRootPathName,;
STRING @lpVolumeNameBuffer,;
INTEGER nVolumeNameSize,;
LONG @lpVolumeSerialNumber,;
INTEGER @lpMaximumComponentLength,;
INTEGER @lpFileSystemFlags,;
STRING @lpFileSystemNameBuffer,;
INTEGER nFileSystemNameSize
LOCAL m.buflen, m.buf
m.buflen = 104
m.buf = REPLICATE(CHR(0), m.buflen)
GetLogicalDriveStrings(m.buflen, @m.buf)
m.buf = CHRTRAN(m.buf, CHR(0) + "\:","")
m.str1 = ""
FOR m.i=1 TO LEN(m.buf)
m.drvtype = GetDriveType(SUBSTR(m.buf, m.i, 1) + ":\")
IF m.drvtype = 3
m.str1 = m.str1 + SUBSTR(m.buf, m.i, 1)
ENDIF
NEXT
FOR m.i = 1 TO LEN(m.str1)
m.vnb = REPLICATE(CHR(0),64)
m.vnbs = 64
m.vsn = 0
m.mcl = 0
m.fsf = 0
m.fsnb = REPLICATE(CHR(0),10)
m.fsnbs = 10
GetVolumeInformation(SUBSTR(m.str1,m.i,1) + ":\", @m.vnb, m.vnbs,@m.vsn, @m.mcl, @m.fsf, @m.fsnb, m.fsnbs)
IF m.vsn < 0
m.vsn = m.vsn + 168
ENDIF
m.vsn = PADL(ALLTRIM(SUBSTR(TRANSFORM(m.vsn,"@0"), 3)), 8, "0")
m.drivenumber = ASC(SUBSTR(m.str1, m.i, 1)) - ASC("C")
handle = CreateFile("\\.\" + CHR(ASC("c") + m.drivenumber) + ":",0xC0000000, 3, 0, 3, 0, 0)
m.sn = ""
m.mod = ""
m.rev = ""
IF handle <> -1
m.sci =""
m.sci = m.sci + CHR(0) + CHR(2) + CHR(0) + CHR(0)
m.sci = m.sci + CHR(0)
m.sci = m.sci + CHR(1)
m.sci = m.sci + CHR(1)
m.sci = m.sci + CHR(0)
m.sci = m.sci + CHR(0)
m.sci = m.sci + CHR(0xA0)
m.sci = m.sci + CHR(0xEC)
m.sci = m.sci + CHR(0)
m.sci = m.sci + CHR(0)
m.sci = m.sci + REPLICATE(CHR(0), 499)
m.sco = REPLICATE(CHR(0), 2048)
m.ret_buffersize = 0
m.otv=DeviceIoControl( handle, 0x7C088,@m.sci,LEN(sci), @m.sco,LEN(sco),@m.ret_buffersize, 0)
CloseHandle(handle)
IF m.otv <> 0
m.sn = CHRTRAN( ALLTRIM( conv21( SUBSTR(m.sco, 37, 20) ) ),CHR(0), "")
m.rev = CHRTRAN( ALLTRIM( conv21( SUBSTR(m.sco, 63, 8) ) ),CHR(0), "")
m.mod = CHRTRAN( ALLTRIM( conv21( SUBSTR(m.sco, 71, 40) ) ),CHR(0), "")
ENDIF
ENDIF
IF EMPTY(m.sn)
handle = CreateFile("\\.\" + CHR(ASC("c") + m.drivenumber) +":", 0x00000000, 3,0, 3, 0, 0)
IF handle <> -1
m.sn = ""
m.mod = ""
m.rev = ""
m.sci = REPLICATE(CHR(0),1024)
m.sco = REPLICATE(CHR(0),1024)
m.ret_buffersize = 0
m.otv = DeviceIoControl( handle, 0x2D1400, @m.sci,LEN(sci), @m.sco,LEN(sco),@m.ret_buffersize, 0 )
CloseHandle(handle)
IF m.otv <> 0
m.pos0 = ASC(SUBSTR(m.sco,13,1))
m.pos1 = ASC(SUBSTR(m.sco,17,1))
IF m.pos0 > 0
m.pos1 = m.pos0
ENDIF
m.pos2 = ASC(SUBSTR(m.sco, 21, 1))
m.pos3 = ASC(SUBSTR(m.sco, 25, 1))
m.mod = SUBSTR(m.sco, m.pos1+1, m.pos2 - m.pos1)
m.pos4 = AT(CHR(0), m.mod)
IF m.pos4 > 0
m.mod = ALLTRIM(CHRTRAN(m.mod, CHR(0), ""))
ENDIF
IF m.pos3 > m.pos2
m.rev = SUBSTR(m.sco, m.pos2+1, m.pos3 - m.pos2)
ELSE
m.rev = SUBSTR(m.sco, m.pos2+1)
ENDIF
m.pos4 = AT(CHR(0), m.rev)
IF m.pos4 > 0
m.rev = ALLTRIM(LEFT(m.rev, m.pos4 - 1))
ENDIF
IF m.pos3 > 0
m.pos3 = m.pos3 + 1
m.sco1 = SUBSTR(m.sco, m.pos3, 40)
m.sco1 = ALLTRIM(m.sco1)
m.sn = ""
m.pos3 = 1
FOR m.j = 1 TO 20
m.ch1 = CHR(EVALUATE("0x" +ALLTRIM(SUBSTR(m.sco1, m.pos3, 2))))
m.pos3 = m.pos3 + 2
m.ch2 = CHR(EVALUATE("0x" +ALLTRIM(SUBSTR(m.sco1, m.pos3, 2))))
m.pos3 = m.pos3 + 2
m.sn = m.sn + m.ch2 + m.ch1
ENDFOR
m.sn = ALLTRIM(CHRTRAN(m.sn, CHR(0), ""))
ELSE
m.sn = ""
ENDIF
ENDIF
ENDIF
ENDIF
?SUBSTR(m.str1, m.i, 1) + ":\ VolSN: " + m.vsn + " " +CHRTRAN(m.fsnb, CHR(0), "") + "Model: " + m.mod + " Revision: " + m.rev+ " Serial: " + m.sn
ENDFOR
*/===============================================
FUNCTION conv21
*/===============================================
LPARAMETERS m.str
IF LEN(m.str)%2 = 1
m.str = m.str + " "
ENDIF
LOCAL m.i, m.str2
m.str2 = ""
FOR m.i=1 TO LEN(m.str)
m.str2 = m.str2 + SUBSTR(m.str, m.i + IIF(m.i%2=0, -1, 1), 1)
ENDFOR
RETURN m.str2 -
Friday, January 04, 2008 9:52 PMAt the risk of sounding totally ridiculus:
! dir > junkfile.txt
cDirOut = filetostr("junkfile.txt")
cSerial = substr(cDirOut,at("r is",cSerial)+5,10)
Alen. -
Friday, January 04, 2008 10:10 PM
Aleniko,
What he meant is manufacturer's serial number not the one that format writes to partition

-
Friday, January 04, 2008 10:38 PMOoops. I guess it was indeed ridiculus... :-)
Alen. -
Saturday, January 05, 2008 2:40 AM
hi Vladimir Zografski
I tested your program and works perfectly under xp, all variables (m.vsn, m.mod, m.rev and m.sn ) return values, but under vista the varible m.sn, THE MOST DESIRED :-) return a empty value :-(
How I can resolve this prblem?
-
Saturday, January 05, 2008 2:45 AM
ahhh !!!
I am using a sata disk

