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 tane 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.

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

3

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
1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
* 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

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

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tane 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
1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
** 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
Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

6

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?

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

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

7

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.

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

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)