-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathCc.bas
341 lines (278 loc) · 10.8 KB
/
Cc.bas
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
Attribute VB_Name = "CopyControl"
'-----------------------------------------------------------------
'
' CCTest.BAS
' Programme test de CopyControl pour GIRATION, pouvant servir de modèle pour d'autres produits
'
' Origine : CERTU - Mars 98
' Mise à jour : CETE de l'Ouest (A.VIGNAUD) - Avril 98
'
'-----------------------------------------------------------------
Option Explicit
' Variable globale pour A_Propos
Public SerialNumber As String
' Variable globale à placer dans le module principal
'Public VersionDemo As Boolean
' A paramétrer selon l'application
Private Const BonCode = "its99GB4.0"
Private Const BonneDLL = "GIRABASE.DLL"
Private LongueurCode As Integer
Private LongueurNomDLL As Integer
Private Const MinTime = 15 ' une vérif toutes les 15mn
' Conserve l'heure et le jour de la dernière modification pour MyCCToujours()
Private MyDerModif As Integer
Private MyNewDay As Integer
' Disque porteur de la protection
Private disquePorteur As Integer
' Mémorisation du disque et du répertoire courants
Private saveDrive As String
Private saveDir As String '(utile uniqt ds l'envt de développement)
Const Long256 As Long = 256
'Déclaration de la structure
Type CCMB
B1 As String * 1
B2 As String * 1
B3 As String * 1
B4 As String * 1
Func As String * 1
Rcodelo As String * 1
Rcodehi As String * 1
' Rcode As Integer ' ADAPTATION 16bits pour faciliter Rcode = -1 (Integer = 2 octets)
Drive As String * 1
Dir As String * 4
Vers1 As String * 1
Vers2 As String * 1
SN As String * 2
' SN As Integer ' à la place de String * 2; pour faciliter la lecture (mais attention au +/-)
Pcode As String * 9
Pname As String * 13
CCSN As String * 2
Master As String * 1
DrType As String * 1
Copies1 As String * 1
Copies2 As String * 1
InitCopies As String * 2
Useslo As String * 1
Useshi As String * 1
IUseslo As String * 1
IUseshi As String * 1
ExpD As String * 1
ExpM As String * 1
ExpYlo As String * 1
ExpYhi As String * 1
NotreDecalage As String * 4 '4 octets pris sur Remainder
MsgSecurit As String * 256 '256 octets pris sur Remainder
Remainder As String * 198 '458 - 260 // taille de la structure = 512o'
End Type
'Déclaration des variables'
Private myCC As CCMB
#If Win32 Then
'Déclaration de la DLL en 32 bits d'après <exemple>
Declare Function ccdll Lib "Girabase.dll" Alias "CC32" (CC As CCMB) As Integer
#Else
'Déclaration de la DDL16
Declare Function ccdll Lib "Girabase.dll" Alias "CCDLL" (CC As CCMB) As Integer
#End If
Private Sub ClearStruct(lpCC As CCMB)
'Initialisation de la structure d'après doc
' ... et obligatoirement remettre Dir à NULL pour A: en cas de modification sur C:)
lpCC.B1 = "C"
lpCC.B2 = "C"
lpCC.B3 = "M"
lpCC.B4 = "B"
lpCC.Func = Chr$(0)
' lpCC.Rcode = 0
lpCC.Rcodelo = Chr$(255) ' l'ensemble des 2 octets (FF)
lpCC.Rcodehi = Chr$(255) ' donne -1 (utile pour la version 16 bits)
lpCC.Drive = Chr$(0)
lpCC.Dir = String$(4, 0)
lpCC.Vers1 = Chr$(0)
lpCC.Vers2 = Chr$(0)
' lpCC.SN = 0
lpCC.SN = String$(2, 0)
lpCC.Pcode = String$(9, 0)
lpCC.Pname = String$(13, 0)
lpCC.CCSN = String$(2, 0)
lpCC.Master = Chr$(0)
lpCC.DrType = Chr$(0)
lpCC.Copies1 = Chr$(0)
lpCC.Copies2 = Chr$(0)
lpCC.InitCopies = String$(2, 0)
lpCC.Useslo = Chr$(0)
lpCC.Useshi = Chr$(0)
lpCC.IUseslo = Chr$(0)
lpCC.IUseshi = Chr$(0)
lpCC.ExpD = Chr$(0)
lpCC.ExpM = Chr$(0)
lpCC.ExpYlo = Chr$(0)
lpCC.ExpYhi = Chr$(0)
lpCC.NotreDecalage = String$(4, 0)
lpCC.MsgSecurit = String$(256, 0)
lpCC.Remainder = String$(198, 0)
End Sub
'utilisation de la protection'
Public Sub ProtectCheck()
Dim comp_status As Integer
Dim comp_statusA As Integer
Dim CChaine As String
Dim NotreCode As String
Dim flag As Boolean
If gbVersionDemo Or gbVersionDéveloppeur Then Exit Sub
LongueurCode = Len(BonCode)
LongueurNomDLL = Len(BonneDLL)
'on commence par regarder sur le disque courant
ChangeRep ' on rend courant le disque de l'application
disquePorteur = 0
comp_status = appelDLL(0, disquePorteur, flag)
RetrouveRep
If flag Then Unload MDIGirabase ' DLL non trouvée
'MsgBox "1er appel " & CStr(comp_status)
disquePorteur = Asc(Left(App.Path, 1)) - 64 ' utilisé par les futurs appels de CCToujours
If (comp_status = -28) Then 'correspond au Msg : Transférez le jeton dans le répertoire courant !
'on regarde la disquette A
disquePorteur = 1
comp_statusA = appelDLL(0, disquePorteur, flag)
' MsgBox "2è appel " & CStr(comp_statusA)
Select Case comp_statusA
Case 0
comp_status = 0 'on valide
Case -57 'erreur apparaissant si protétégé en écriture
comp_status = -5700
Case -67, -26
comp_status = comp_statusA
End Select
End If
'-------- Récupération du Numéro de Série
' ... et Test du nom de la DLL original, et du Code
If (comp_status = 0) Then 'myCC est soit celle du disque courant, soit celle de la disquette
' If (myCC.SN >= 0) Then SerialNumber = Str$(myCC.SN) Else SerialNumber = Str$(65536 + myCC.SN)
SerialNumber = Str$(Asc(myCC.SN) + Long256 * Asc(Mid(myCC.SN, 2)))
' MsgBox "Num Série : " & SerialNumber
' NotreCode = Mid(myCC.MsgSecurit, 2, 10)
NotreCode = Mid(myCC.MsgSecurit, 2, LongueurCode)
' BonCode = Chr(105) + Chr(116) + Chr(115) + Chr(57) + Chr(56) + "GIR3.0" '??? pourquoi pas simplement "its98GIR3.0" (AV - 20/04/98)
'ATTENTION : à adapter au message de sécurité
' BonCode : its98GIR3.0
' Left : nombre de caractères de la partie visible et caché + 1 (pour le caractère null ~Z)
' Right : nombre de caractères de la partie caché
' If (Left$(myCC.Pname, 12) <> BonneDLL Or NotreCode <> BonCode) Then comp_status = -19000
If (Left$(myCC.Pname, LongueurNomDLL) <> BonneDLL Or NotreCode <> BonCode) Then comp_status = -19000
End If
'------- Messages d'erreur et sortie
If (comp_status <> 0) Then
Select Case comp_status
Case -19
CChaine = "Produit non installé !"
Case -26
CChaine = "Le numéro de licence ne correspond pas"
Case -28
CChaine = "Jeton introuvable"
Case -35
CChaine = "Vérification impossible : le disque est protégé en écriture !"
Case -5700
CChaine = "Vérification impossible : la disquette est protégée en écriture !"
Case -67
CChaine = "Veuillez recommencer plus tard" & Chr(13) & "Trop d'utilisateurs sont présents !"
Case Else
CChaine = "Erreur n° " & Str$(comp_status) & Chr(13) & App.Title & " n'a pas trouvé la protection"
End Select
MsgBox CChaine, vbCritical, "Gestion de la Protection"
Unload MDIGirabase
' Exit Sub
End If
MyDerModif = 60 * Hour(Now) + Minute(Now)
MyNewDay = Day(Now)
Exit Sub
End Sub
Public Function MyCCToujours() As Integer '------- Vérifie si la protection est toujours là ....
Dim comp_status As Integer '------- Valeur de retour non nulle signifie erreur
Dim NotreCode As String
Dim Maintenant As Integer
Dim flag As Boolean
'Version de demo
'ou vérification effectuée avec succès depuis moins de 15 minutes (l'accès disquette est long !!!)
MyCCToujours = 0
If gbVersionDemo Or gbVersionDéveloppeur Then Exit Function
Maintenant = 60 * Hour(Now) + Minute(Now)
If Maintenant - MyDerModif < MinTime And MyNewDay = Day(Now) Then Exit Function
'On pourrait passer à coté du controle si la fonction n'était appelée qu'une fois par mois....
'----- Vérification
'on regarde le disque qui a été vérifié au lancement
comp_status = appelDLL(2, disquePorteur, flag)
If flag Then MyCCToujours = -19500: Exit Function
'------- Test à nouveau du nom de la DLL original, et du Code
If (comp_status = 0) Then 'myCC est soit celle du disque courant, soit celle de la disquette
' NotreCode = Right$(Left$(myCC.MsgSecurit, 11), 10)
NotreCode = Mid(myCC.MsgSecurit, 2, LongueurCode)
' If (Left$(myCC.Pname, 12) <> BonneDLL Or NotreCode <> BonCode) Then comp_status = -19000
If (Left$(myCC.Pname, LongueurNomDLL) <> BonneDLL Or NotreCode <> BonCode) Then comp_status = -19000
End If
'------- en cas de succès : on note l'heure de la dernière vérification
If (comp_status = 0) Then
MyDerModif = 60 * Hour(Now) + Minute(Now)
MyNewDay = Day(Now)
End If
'------- Valeur de retour : non nulle signifie erreur
MyCCToujours = comp_status
End Function
Private Sub ChangeRep()
' Repositionnement éventuel du disque courant sur celui de l'application
' pour être sûr de trouver la protection
If Mid(CurDir, 2, 1) = ":" Then
If Left(CurDir, 1) <> Left(App.Path, 1) Then
saveDrive = Left(CurDir, 1)
ChDrive Left(App.Path, 1)
End If
End If
' Repositionnement éventuel du répertoire courant sur celui de l'application
' pour être sûr de trouver la DLL
' utile uniquement en environnement de développement
If StrComp(CurDir, App.Path, 1) <> 0 Then
' saveDir = CurDir
ChDir App.Path
End If
End Sub
Private Sub RetrouveRep()
If saveDrive <> "" Then ChDrive saveDrive
If saveDir <> "" Then ChDir saveDir
End Sub
Private Function appelDLL(ByVal fonction As Integer, ByVal disque As Integer, Absent As Boolean) As Integer
' Appel de la DLL de CopyControl pour vérification de la protection
' fonction = 0 - vérification + inscription en tant qu'utilisateur
' 2 - vérification seule
' disque = 0 - disque courant : recherche sur CC_PATH, chemin programme (où se trouve la DLL),
' Rép. de travail, Rép racine
' sinon cf myCC.Dir
' 1 - disquette A
Dim souris As Integer 'sauvegarde de la forme souris
Dim Msg As String
souris = Screen.MousePointer
Screen.MousePointer = 11 ' sablier
ClearStruct myCC ' réinitialisation de la structure
'#If Win16 Then
' myCC.Rcode = -1 '16 bits : non demandé en 32bits
'#End If
myCC.Func = Chr$(fonction)
myCC.Drive = Chr$(disque)
On Error GoTo GestErr
appelDLL = ccdll(myCC) 'appel de la DLL
Screen.MousePointer = souris
Exit Function
'----gestion de l'absence de la DLL
GestErr:
#If Win16 Then
' MsgBox "Girabase.DLL non trouvée", vbCritical, "Gestion de la protection"
If Err = 53 Then
Msg = BonneDLL & " non trouvée"
ElseIf Err = 48 Then
Msg = "Anomalie dans l'appel de " & BonneDLL
Else
Msg = "Erreur en vérification de la protection " & CStr(Err)
End If
#Else
Msg = Err.Description
#End If
MsgBox Msg, vbCritical, "Gestion de la protection"
Absent = True
Resume Next
End Function