1

Konu: Harddisk serinol ve Windows 64bit

Merhaba

Programlamlarımı lisanslarken harddisk'in serial nosunu okuyorum. Bunun için sanırım tek-tips'de bulduğum kodları kullanıyorum:

DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
DECLARE INTEGER CreateFile IN kernel32  ....
DECLARE INTEGER DeviceIoControl IN kernel32 ....
DECLARE INTEGER GetLogicalDriveStrings IN Win32API ....
DECLARE INTEGER GetDriveType IN Win32API STRING cpath
DECLARE INTEGER GetVolumeInformation IN Win32API ....
vs.
Bu yöntem 64bit işletim sisteminde çalışmiyor.  Bilgininize.

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

2

Re: Harddisk serinol ve Windows 64bit

Calismamasi icin 64 bit olmasina gerek yok. Bir de zaten bu API ler harddisk serial no'yu vermez. Format ile olusturulan noyu verir ki onun lisanslamayla ilgisini anlamadim. Iki farkli diskte ayni no olabilir ve programla kurulabilir.

3 Son düzenleyen, Mehmet K (15.03.2010 08:53:05)

Re: Harddisk serinol ve Windows 64bit

Merhaba Çetin
Yok, yukarda belirtiğim yöntem ile harddisk 'in üretiçisi tarafından verilem seri nosunu okuyabiliyorsun.
İnanmiyorsan, buyrunuz:
(Kodu sanırım tek-tips'de bulmuşdum)
Ama dediğim gibi, 64bit ortamında çalışmiyor

Visual Fox Pro
* This.cHD_SerieNo

* This.cRevision
* This.cModel
* This.cFileSystem
* This.cVolSerieNo
*---------------------------------------------------------------
 
LPARAMETERS cDrive
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, nIdx, m.fsnb, m.fsnbs
m.buflen = 104
m.buf = REPLICATE(CHR(0), m.buflen)
 
GetLogicalDriveStrings(m.buflen, @m.buf)
m.buf = CHRTRAN(m.buf, CHR(0) + "\:","")
m.str1 = ""
 
IF OCCURS(cDrive, m.buf) == 0
  MESSAGEBOX(cDrive + " sürücü bulunamadý.", 16, "")
  RETURN FALSE
ENDIF
 
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(cDrive + ":\", @m.vnb, m.vnbs, @m.vsn, @m.mcl, @m.fsf, @m.fsnb, m.fsnbs)
THIS.cFileSystem = m.fsnb
THIS.cVolSerieNo = m.vsn
IF THIS.cVolSerieNo < 0
  THIS.cVolSerieNo = THIS.cVolSerieNo + 168
ENDIF
THIS.cVolSerieNo = PADL(ALLTRIM(SUBSTR(TRANSFORM(THIS.cVolSerieNo,"
@0"), 3)), 8, "0")
m.drivenumber = ASC(cDrive) - ASC("
C")
handle = CreateFile("
\\.\" + CHR(ASC("c") + m.drivenumber) + ":",0xC0000000, 3, 0, 3, 0, 0)
THIS.cHD_SerieNo = "
"
THIS.cModel      = "
"
THIS.cRevision   = "
"
 
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
    THIS.cHD_SerieNo = CHRTRAN( ALLTRIM( THIS.conv21( SUBSTR(m.sco, 37, 20) ) ),CHR(0), "
")
    THIS.cRevision   = CHRTRAN( ALLTRIM( THIS.conv21( SUBSTR(m.sco, 63, 8) ) ),CHR(0), "
")
    THIS.cModel      = CHRTRAN( ALLTRIM( THIS.conv21( SUBSTR(m.sco, 71, 40) ) ),CHR(0), "
")
  ENDIF
ENDIF
 
IF EMPTY(THIS.cHD_SerieNo)
  handle = CreateFile("
\\.\" + CHR(ASC("c") + m.drivenumber) +":", 0x00000000, 3,0, 3, 0, 0)
 
  IF handle <> -1
    THIS.cHD_SerieNo = "
"
    THIS.cModel = "
"
    THIS.cRevision = "
"
    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))
      THIS.cModel = SUBSTR(m.sco, m.pos1+1, m.pos2 - m.pos1)
      m.pos4 = AT(CHR(0), THIS.cModel)
 
      IF m.pos4 > 0
        THIS.cModel = ALLTRIM(CHRTRAN(THIS.cModel, CHR(0), "
"))
      ENDIF
 
      IF m.pos3 > m.pos2
        THIS.cRevision = SUBSTR(m.sco, m.pos2+1, m.pos3 - m.pos2)
      ELSE
        THIS.cRevision = SUBSTR(m.sco, m.pos2+1)
      ENDIF
 
      m.pos4 = AT(CHR(0), THIS.cRevision)
      IF m.pos4 > 0
        THIS.cRevision = ALLTRIM(LEFT(THIS.cRevision, 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)
        THIS.cHD_SerieNo = "
"
        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
          THIS.cHD_SerieNo = THIS.cHD_SerieNo + m.ch2 + m.ch1
        ENDFOR
        THIS.cHD_SerieNo = ALLTRIM(CHRTRAN(THIS.cHD_SerieNo, CHR(0), "
"))
      ELSE
        THIS.cHD_SerieNo = "
"
      ENDIF
    ENDIF
  ENDIF
ENDIF
Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

4

Re: Harddisk serinol ve Windows 64bit

Konu şurada da geçmiş :

http://social.msdn.microsoft.com/forums … a5a6928f6/

5

Re: Harddisk serinol ve Windows 64bit

Haklisin, kodun dogrusunu yazinca verir. DeviceIOControl gozumden kacti. Ama bence bu daha pratik ve gunumuzde WMI destegi olmayan ortam gittikce azaliyor (hatta kullanimda kalmamis bile olabilir - 64bitde de destekli):

Visual Fox Pro
** Author: Cetin Basoz

loWBEMLocator = Createobject("wbemScripting.SwbemLocator")
loWMIService = loWBEMLocator.ConnectServer('', '\root\cimv2')
 
If !Isnull(loWMIService)
  loLogicalDrives = loWMIService.ExecQuery('Select * from Win32_LogicalDisk')
  ? 'Logical disk'
  For Each loLogicalDrive In loLogicalDrives
    ? loLogicalDrive.Description, ;
      loLogicalDrive.DeviceID, ;
      loLogicalDrive.VolumeName, ;
      loLogicalDrive.VolumeSerialNumber
  ENDFOR
  ?
  ? 'Physical Disk'
  loPhyDrives = loWMIService.ExecQuery('Select * from Win32_PhysicalMedia')
  For Each loPhyDrive In loPhyDrives
    ? loPhyDrive.Tag,;
      loPhyDrive.SerialNumber
  Endfor
Endif

6 Son düzenleyen, Mehmet K (15.03.2010 14:30:40)

Re: Harddisk serinol ve Windows 64bit

Kod için teşekkür ederim.
WMI'i  bugüne kadar hiç kullanmadım. Biraz araştırdım. Sanki Windows 2000 dahil olmak üzere tüm yeni işletim sistemlerde faal olarak devrede. Bu doğru bir izlenimi?

Eklenti: WMI faalmi değilmi nasıl test edebilirim?

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

7 Son düzenleyen, cetinbasoz (15.03.2010 14:53:58)

Re: Harddisk serinol ve Windows 64bit

Evet, win2000 ve sonrasinda var. Windows NT 4.0 serverlar sorunluydu o acidan, ozel olarak install etmen gerekiyordu (ya da SP6 parcasi tam hatirlamiyorum). Bizzat windowsun kendisi bircok isini artik bu WMI'lar ile goruyor. Hem queryleri hem metodlari filan var. Oturdugun yerden domain ici makinelerde sorgu ve eylem yapabiliyorsun. Kendine ozgu bir SQLi, komutlari var. Oldukca detayli:

http://msdn.microsoft.com/en-us/library … S.85).aspx

Not: WMI'lar bir cesit class oldugundan windows versiyonlari onlarin yazilimlarini da gelistiriyor.