-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathwritesn.blr
141 lines (117 loc) · 2.93 KB
/
writesn.blr
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
Menu
Write,Write,0,F4
EndMenu
Window(caption="";width=250;height=120;align=h)
{
Label(caption="%bold=1%fcolor=$0000ff%size=10%fname=Tahoma%Please disconnect all adapters!";name=0;left=24;top=10;width=0;value=0)
Digit(caption="Serial number:"; name=digit_sn; left=110; top=40; width=100; value=1)
Button(caption="Change SN"; left=25; top=80; width=200; height=25; proc=Write)
}
$HOST
// sn hash hashX
// h ^ l = 0x1234 h ^ l = 0x0831
// 1 0x69EB7BDF 0xEEA1E690
// 19 0x23b9318D 0x4A354204
// 45 0x5C464E72 0xB4CABCFB
// 777 0x79A96B9D 0x6A8162B0
string str0;
word unused;
proc decodesn(sn_hash){
// hash -> sn
// преобразовывает хеш серийника в серийник
var sn, i;
if ((sn_hash >> 16 ^ sn_hash) & 0xFFFF = 0x1234) {
sn = 0;
for (i = 0; i < 16; i++){
sn = sn << 1;
if ((sn_hash & 1) = 0) {
sn = sn ^ 0x8021;
}
sn_hash = sn_hash >> 1;
}
sn = sn & 0xFFFF;
} else {
print("\nInvalid sn_hash");
sn = 0xFFFF;
}
return(sn);
}
proc encodesn(sn){
// sn -> hash
// преобразовывает серийник в хеш серийника
var hash, i;
hash = 0;
for (i = 0; i < 16; i++){
hash = hash << 1;
if (sn & 1 != 0) {
sn = sn ^ 0x8021;
} else {
hash = hash | 0x01;
}
sn = sn >> 1;
}
hash = ((hash ^ 0x1234) << 16) | hash;
return(hash);
}
proc hash2x(hash){
// hash -> hashX
// преобразовывает хеш серийника в формат для смены через SERIAL = new_serial
var k, hashX;
k = 0x50723067; // 'Pr0g'
hashX = ((hash << 25) | (hash >> (32-25))) ^ k;
return(hashX);
}
proc ShowInfo(){
var tmp;
tmp = DEVICE_SERIAL;
print("\nCurrent SN: "+#i.tmp);
device.getSN();
tmp = device.sn;
print("\n Flash ID: 0x"+#h4.tmp);
}
proc OnCreate(){
ShowInfo();
}
proc Write(){
var tmp, sn, hash, hashX;
if (WINDOW = 0) ShowWindow;
ShowInfo();
sn = digit_sn;
if (sn > 65536){
sn = sn & 0xFFFF;
digit_sn = sn;
print("\nSerial number must be in the range 0-65535");
}
hash = encodesn(sn);
hashX = hash2x(hash);
print("\n");
print("\nDesired SN: " + #i.sn);
// print("\n hash: 0x" + #h4.hash);
// print("\n hashX: 0x" + #h4.hashX);
// tmp = decodesn(hash);
// print("\n hash->sn: " + #i.tmp);
str0 = "Confirm set serial number to " + #i.sn;
tmp = mbox(str0, 1);
if (tmp = 0){
print("\n");
print("\nAborted by user");
} else {
device.sn = hashX;
device.setSN();
// Тут iprog отвалится
print("\n");
print("\nCompleted. Disconnect iprog+ and connect again");
tmp = device.sn; // <- и тут будет ошибка
//print("\nЭтот код никогда не выполнится. new sn:" + #i.n);
}
}
$DEVICE
dword sn;
proc setSN(){
SERIAL = sn; // OUT 255, sn
// после out 255 iprog уйдёт в бесконечный цикл
sn = SERIAL; // этот код уже не работает
}
proc getSN(){
sn = SERIAL;
}