Visual FoxPro Developer Center > Visual FoxPro Forums > Visual FoxPro General > how i can get the hard disk serial number in windows vista?

Answered 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
     
     Answered
    This works perfectly under XP and VISTA

    Code Block

    DECLARE 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 Block

    Create 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
          Endfor

          wmiDisks =  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
     
     Answered
    This works perfectly under XP and VISTA

    Code Block

    DECLARE 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 PM
     
     
    At 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 partitionSmile

  • Friday, January 04, 2008 10:38 PM
     
     
    Ooops.  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