Subversion Repositories Kolibri OS

Rev

Rev 346 | Rev 363 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 346 Rev 357
1
DRV_ENTRY    equ  1
1
DRV_ENTRY    equ  1
2
DRV_EXIT     equ -1
2
DRV_EXIT     equ -1
3
DRV_COMPAT   equ  3  ;minimal required drivers version
3
DRV_COMPAT   equ  3  ;minimal required drivers version
4
DRV_CURRENT  equ  3  ;current drivers model version
4
DRV_CURRENT  equ  3  ;current drivers model version
5
 
5
 
6
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
6
DRV_VERSION equ (DRV_COMPAT shl 16) or DRV_CURRENT
7
 
7
 
8
align 4
8
align 4
9
proc attach_int_handler stdcall, irq:dword, handler:dword
9
proc attach_int_handler stdcall, irq:dword, handler:dword
10
 
10
 
11
	 mov ebx, [irq]        ;irq num
11
	 mov ebx, [irq]        ;irq num
12
	 test ebx, ebx
12
	 test ebx, ebx
13
	 jz .err
13
	 jz .err
14
	 mov eax, [handler]
14
	 mov eax, [handler]
15
	 test eax, eax
15
	 test eax, eax
16
	 jz .err
16
	 jz .err
17
	 mov [irq_tab+ebx*4], eax
17
	 mov [irq_tab+ebx*4], eax
18
         stdcall enable_irq, [irq]
18
         stdcall enable_irq, [irq]
19
	 ret
19
	 ret
20
.err:
20
.err:
21
	 xor eax, eax
21
	 xor eax, eax
22
	 ret
22
	 ret
23
endp
23
endp
24
 
24
 
25
align 4
25
align 4
26
proc  detach_int_handler
26
proc  detach_int_handler
27
 
27
 
28
	   ret
28
	   ret
29
endp
29
endp
30
 
30
 
31
align 4
31
align 4
32
proc enable_irq stdcall, irq_line:dword
32
proc enable_irq stdcall, irq_line:dword
33
           mov ebx, [irq_line]
33
           mov ebx, [irq_line]
34
           mov edx, 0x21
34
           mov edx, 0x21
35
           cmp ebx, 8
35
           cmp ebx, 8
36
           jb @F
36
           jb @F
37
           mov edx, 0xA1
37
           mov edx, 0xA1
38
           sub ebx,8
38
           sub ebx,8
39
@@:
39
@@:
40
           in al,dx
40
           in al,dx
41
           btr eax, ebx
41
           btr eax, ebx
42
           out dx, al
42
           out dx, al
43
           ret
43
           ret
44
endp
44
endp
45
 
45
 
46
align 16
46
align 16
47
;; proc irq_serv
47
;; proc irq_serv
48
 
48
 
49
irq_serv:
49
irq_serv:
50
 
50
 
51
.irq_1:
51
.irq_1:
52
	   push eax
52
	   push eax
53
	   mov eax, 1
53
	   mov eax, 1
54
	   jmp .main
54
	   jmp .main
55
align 4
55
align 4
56
.irq_2:
56
.irq_2:
57
	   push eax
57
	   push eax
58
	   mov eax, 2
58
	   mov eax, 2
59
	   jmp .main
59
	   jmp .main
60
align 4
60
align 4
61
.irq_3:
61
.irq_3:
62
	   push eax
62
	   push eax
63
	   mov eax, 3
63
	   mov eax, 3
64
	   jmp .main
64
	   jmp .main
65
align 4
65
align 4
66
.irq_4:
66
.irq_4:
67
	   push eax
67
	   push eax
68
	   mov eax, 4
68
	   mov eax, 4
69
	   jmp .main
69
	   jmp .main
70
align 4
70
align 4
71
.irq_5:
71
.irq_5:
72
	   push eax
72
	   push eax
73
	   mov eax, 5
73
	   mov eax, 5
74
	   jmp .main
74
	   jmp .main
75
align 4
75
align 4
76
.irq_6:
76
.irq_6:
77
	   push eax
77
	   push eax
78
	   mov eax, 6
78
	   mov eax, 6
79
	   jmp .main
79
	   jmp .main
80
align 4
80
align 4
81
.irq_7:
81
.irq_7:
82
	   push eax
82
	   push eax
83
	   mov eax, 7
83
	   mov eax, 7
84
	   jmp .main
84
	   jmp .main
85
align 4
85
align 4
86
.irq_8:
86
.irq_8:
87
	   push eax
87
	   push eax
88
	   mov eax, 8
88
	   mov eax, 8
89
	   jmp .main
89
	   jmp .main
90
align 4
90
align 4
91
.irq_9:
91
.irq_9:
92
	   push eax
92
	   push eax
93
	   mov eax, 9
93
	   mov eax, 9
94
	   jmp .main
94
	   jmp .main
95
align 4
95
align 4
96
.irq_10:
96
.irq_10:
97
	   push eax
97
	   push eax
98
	   mov eax, 10
98
	   mov eax, 10
99
	   jmp .main
99
	   jmp .main
100
align 4
100
align 4
101
.irq_11:
101
.irq_11:
102
	   push eax
102
	   push eax
103
	   mov eax, 11
103
	   mov eax, 11
104
	   jmp .main
104
	   jmp .main
105
align 4
105
align 4
106
.irq_12:
106
.irq_12:
107
	   push eax
107
	   push eax
108
	   mov eax, 12
108
	   mov eax, 12
109
	   jmp .main
109
	   jmp .main
110
align 4
110
align 4
111
.irq_13:
111
.irq_13:
112
	   push eax
112
	   push eax
113
	   mov eax, 13
113
	   mov eax, 13
114
	   jmp .main
114
	   jmp .main
115
align 4
115
align 4
116
.irq_14:
116
.irq_14:
117
	   push eax
117
	   push eax
118
	   mov eax, 14
118
	   mov eax, 14
119
	   jmp .main
119
	   jmp .main
120
align 4
120
align 4
121
.irq_15:
121
.irq_15:
122
	   push eax
122
	   push eax
123
	   mov eax, 15
123
	   mov eax, 15
124
	   jmp .main
124
	   jmp .main
125
 
125
 
126
align 16
126
align 16
127
.main:
127
.main:
128
	   save_ring3_context
128
	   save_ring3_context
129
	   mov	 bx, os_data
129
	   mov	 bx, os_data
130
	   mov	 ds, bx
130
	   mov	 ds, bx
131
	   mov	 es, bx
131
	   mov	 es, bx
132
 
132
 
133
	   mov ebx, [irq_tab+eax*4]
133
	   mov ebx, [irq_tab+eax*4]
134
	   test ebx, ebx
134
	   test ebx, ebx
135
	   jz .exit
135
	   jz .exit
136
 
136
 
137
           call ebx
137
           call ebx
138
 
138
 
139
.exit:
139
.exit:
140
	   restore_ring3_context
140
	   restore_ring3_context
141
 
141
 
142
           cmp eax, 8
142
           cmp eax, 8
143
	   mov al, 0x20
143
	   mov al, 0x20
144
           jb @f
144
           jb @f
145
	   out 0xa0, al
145
	   out 0xa0, al
146
@@:
146
@@:
147
           out 0x20, al
147
           out 0x20, al
148
 
148
 
149
           pop eax
149
           pop eax
150
	   iret
150
	   iret
151
 
151
 
152
align 4
152
align 4
153
proc get_notify stdcall, p_ev:dword
153
proc get_notify stdcall, p_ev:dword
154
 
154
 
155
.wait:
155
.wait:
156
           mov ebx,[CURRENT_TASK]
156
           mov ebx,[CURRENT_TASK]
157
           shl ebx,8
157
           shl ebx,8
158
           test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
158
           test dword [ebx+PROC_BASE+0xA8],EVENT_NOTIFY
159
	   jz @f
159
	   jz @f
160
           and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY
160
           and dword [ebx+PROC_BASE+0xA8], not EVENT_NOTIFY
161
	   mov edi, [p_ev]
161
	   mov edi, [p_ev]
162
	   mov dword [edi], EV_INTR
162
	   mov dword [edi], EV_INTR
163
           mov eax, [ebx+PROC_BASE+APPDATA.event]
163
           mov eax, [ebx+PROC_BASE+APPDATA.event]
164
	   mov dword [edi+4], eax
164
	   mov dword [edi+4], eax
165
	   ret
165
	   ret
166
@@:
166
@@:
167
	   call change_task
167
	   call change_task
168
	   jmp .wait
168
	   jmp .wait
169
endp
169
endp
170
 
170
 
171
align 4
171
align 4
172
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
172
proc pci_read32 stdcall, bus:dword, devfn:dword, reg:dword
173
	   xor eax, eax
173
	   xor eax, eax
174
	   xor ebx, ebx
174
	   xor ebx, ebx
175
	   mov ah, byte [bus]
175
	   mov ah, byte [bus]
176
           mov al, 6
176
           mov al, 6
177
	   mov bh, byte [devfn]
177
	   mov bh, byte [devfn]
178
	   mov bl, byte [reg]
178
	   mov bl, byte [reg]
179
	   call pci_read_reg
179
	   call pci_read_reg
180
	   ret
180
	   ret
181
endp
181
endp
182
 
182
 
183
align 4
183
align 4
184
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
184
proc pci_read8 stdcall, bus:dword, devfn:dword, reg:dword
185
	   xor eax, eax
185
	   xor eax, eax
186
	   xor ebx, ebx
186
	   xor ebx, ebx
187
	   mov ah, byte [bus]
187
	   mov ah, byte [bus]
188
           mov al, 4
188
           mov al, 4
189
	   mov bh, byte [devfn]
189
	   mov bh, byte [devfn]
190
	   mov bl, byte [reg]
190
	   mov bl, byte [reg]
191
	   call pci_read_reg
191
	   call pci_read_reg
192
	   ret
192
	   ret
193
endp
193
endp
194
 
194
 
195
align 4
195
align 4
196
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
196
proc pci_write8 stdcall, bus:dword, devfn:dword, reg:dword, val:dword
197
	   xor eax, eax
197
	   xor eax, eax
198
	   xor ebx, ebx
198
	   xor ebx, ebx
199
	   mov ah, byte [bus]
199
	   mov ah, byte [bus]
200
           mov al, 8
200
           mov al, 8
201
	   mov bh, byte [devfn]
201
	   mov bh, byte [devfn]
202
	   mov bl, byte [reg]
202
	   mov bl, byte [reg]
203
           mov ecx, [val]
203
           mov ecx, [val]
204
           call pci_write_reg
204
           call pci_write_reg
205
	   ret
205
	   ret
206
endp
206
endp
207
 
207
 
208
handle     equ  IOCTL.handle
208
handle     equ  IOCTL.handle
209
io_code    equ  IOCTL.io_code
209
io_code    equ  IOCTL.io_code
210
input      equ  IOCTL.input
210
input      equ  IOCTL.input
211
inp_size   equ  IOCTL.inp_size
211
inp_size   equ  IOCTL.inp_size
212
output     equ  IOCTL.output
212
output     equ  IOCTL.output
213
out_size   equ  IOCTL.out_size
213
out_size   equ  IOCTL.out_size
214
 
214
 
215
 
215
 
216
align 4
216
align 4
217
proc srv_handler stdcall, ioctl:dword
217
proc srv_handler stdcall, ioctl:dword
218
           mov esi, [ioctl]
218
           mov esi, [ioctl]
219
           test esi, esi
219
           test esi, esi
220
           jz .err
220
           jz .err
221
 
221
 
222
           mov edi, [esi+handle]
222
           mov edi, [esi+handle]
223
           cmp [edi+SRV.magic], ' SRV'
223
           cmp [edi+SRV.magic], ' SRV'
224
	   jne .fail
224
	   jne .fail
225
 
225
 
226
           cmp [edi+SRV.size], SRV_SIZE
226
           cmp [edi+SRV.size], SRV_SIZE
227
	   jne .fail
227
	   jne .fail
228
 
228
 
229
           stdcall [edi+SRV.srv_proc], esi
229
           stdcall [edi+SRV.srv_proc], esi
230
           ret
230
           ret
231
.fail:
231
.fail:
232
           xor eax, eax
232
           xor eax, eax
233
           not eax
233
           not eax
234
           mov [esi+output], eax
234
           mov [esi+output], eax
235
           mov [esi+out_size], 4
235
           mov [esi+out_size], 4
236
           ret
236
           ret
237
.err:
237
.err:
238
           xor eax, eax
238
           xor eax, eax
239
           not eax
239
           not eax
240
           ret
240
           ret
241
endp
241
endp
242
 
242
 
243
align 4
243
align 4
244
proc srv_handlerEx stdcall, ioctl:dword
244
proc srv_handlerEx stdcall, ioctl:dword
245
           mov esi, [ioctl]
245
           mov esi, [ioctl]
246
           test esi, esi
246
           test esi, esi
247
           jz .err
247
           jz .err
248
           add esi, new_app_base
248
           add esi, new_app_base
249
 
249
 
250
           mov edi, [esi+handle]
250
           mov edi, [esi+handle]
251
           cmp [edi+SRV.magic], ' SRV'
251
           cmp [edi+SRV.magic], ' SRV'
252
	   jne .fail
252
	   jne .fail
253
 
253
 
254
           cmp [edi+SRV.size], SRV_SIZE
254
           cmp [edi+SRV.size], SRV_SIZE
255
	   jne .fail
255
	   jne .fail
256
 
256
 
257
           add [esi+input], new_app_base
257
           add [esi+input], new_app_base
258
           add [esi+output], new_app_base
258
           add [esi+output], new_app_base
259
 
259
 
260
           stdcall [edi+SRV.srv_proc], esi
260
           stdcall [edi+SRV.srv_proc], esi
261
           ret
261
           ret
262
.fail:
262
.fail:
263
           xor eax, eax
263
           xor eax, eax
264
           not eax
264
           not eax
265
           mov [esi+output], eax
265
           mov [esi+output], eax
266
           mov [esi+out_size], 4
266
           mov [esi+out_size], 4
267
           ret
267
           ret
268
.err:
268
.err:
269
           xor eax, eax
269
           xor eax, eax
270
           not eax
270
           not eax
271
           ret
271
           ret
272
endp
272
endp
273
 
273
 
274
restore  handle
274
restore  handle
275
restore  io_code
275
restore  io_code
276
restore  input
276
restore  input
277
restore  inp_size
277
restore  inp_size
278
restore  output
278
restore  output
279
restore  out_size
279
restore  out_size
280
 
280
 
281
align 4
281
align 4
282
proc get_service stdcall, sz_name:dword
282
proc get_service stdcall, sz_name:dword
283
           mov eax, [sz_name]
283
           mov eax, [sz_name]
284
           test eax, eax
284
           test eax, eax
285
           jnz @F
285
           jnz @F
286
           ret
286
           ret
287
@@:
287
@@:
288
           mov edx, [srv.fd]
288
           mov edx, [srv.fd]
289
@@:
289
@@:
290
           cmp edx, srv.fd-SRV_FD_OFFSET
290
           cmp edx, srv.fd-SRV_FD_OFFSET
291
           je .not_load
291
           je .not_load
292
 
292
 
293
           stdcall strncmp, edx, [sz_name], 16
293
           stdcall strncmp, edx, [sz_name], 16
294
           test eax, eax
294
           test eax, eax
295
           je .ok
295
           je .ok
296
 
296
 
297
           mov edx, [edx+SRV.fd]
297
           mov edx, [edx+SRV.fd]
298
           jmp @B
298
           jmp @B
299
.not_load:
299
.not_load:
300
           pop ebp
300
           pop ebp
301
           jmp load_driver
301
           jmp load_driver
302
.ok:
302
.ok:
303
           mov eax, edx
303
           mov eax, edx
304
           ret
304
           ret
305
endp
305
endp
306
 
306
 
307
align 4
307
align 4
308
reg_service:
308
reg_service:
309
.sz_name equ esp+4
309
.sz_name equ esp+4
310
.handler equ esp+8
310
.handler equ esp+8
311
           mov eax, [.sz_name]
311
           mov eax, [.sz_name]
312
	   test eax, eax
312
	   test eax, eax
313
	   jz .fail
313
	   jz .fail
314
 
314
 
315
           mov ebx, [.handler]
315
           mov ebx, [.handler]
316
	   test ebx, ebx
316
	   test ebx, ebx
317
	   jz .fail
317
	   jz .fail
318
 
318
 
319
           mov eax, SRV_SIZE
319
           mov eax, SRV_SIZE
320
           call malloc           ;call alloc_service
320
           call malloc           ;call alloc_service
321
	   test eax, eax
321
	   test eax, eax
322
	   jz .fail
322
	   jz .fail
323
 
323
 
324
	   mov edi, eax
324
	   mov edi, eax
325
           mov esi, [.sz_name]
325
           mov esi, [.sz_name]
326
           mov ecx, 16/4
326
           mov ecx, 16/4
327
           rep movsd
327
           rep movsd
328
 
328
 
329
           mov [eax+SRV.magic], ' SRV'
329
           mov [eax+SRV.magic], ' SRV'
330
           mov [eax+SRV.size], SRV_SIZE
330
           mov [eax+SRV.size], SRV_SIZE
331
 
331
 
332
           mov ebx, srv.fd-SRV_FD_OFFSET
332
           mov ebx, srv.fd-SRV_FD_OFFSET
333
           mov edx, [ebx+SRV.fd]
333
           mov edx, [ebx+SRV.fd]
334
           mov [eax+SRV.fd], edx
334
           mov [eax+SRV.fd], edx
335
           mov [eax+SRV.bk], ebx
335
           mov [eax+SRV.bk], ebx
336
           mov [ebx+SRV.fd], eax
336
           mov [ebx+SRV.fd], eax
337
           mov [edx+SRV.bk], eax
337
           mov [edx+SRV.bk], eax
338
 
338
 
339
           mov ecx, [.handler]
339
           mov ecx, [.handler]
340
           mov [eax+SRV.srv_proc], ecx
340
           mov [eax+SRV.srv_proc], ecx
341
           ret 8
341
           ret 8
342
.fail:
342
.fail:
343
	   xor eax, eax
343
	   xor eax, eax
344
           ret 8
344
           ret 8
345
 
345
 
346
align 4
346
align 4
347
proc get_proc stdcall, exp:dword, sz_name:dword
347
proc get_proc stdcall, exp:dword, sz_name:dword
348
 
348
 
349
           mov edx, [exp]
349
           mov edx, [exp]
350
.next:
350
.next:
351
           mov eax, [edx]
351
           mov eax, [edx]
352
           test eax, eax
352
           test eax, eax
353
           jz .end
353
           jz .end
354
 
354
 
355
           push edx
355
           push edx
356
           stdcall strncmp, eax, [sz_name], 16
356
           stdcall strncmp, eax, [sz_name], 16
357
           pop edx
357
           pop edx
358
           test eax, eax
358
           test eax, eax
359
           jz .ok
359
           jz .ok
360
 
360
 
361
           add edx,8
361
           add edx,8
362
           jmp .next
362
           jmp .next
363
.ok:
363
.ok:
364
           mov eax, [edx+4]
364
           mov eax, [edx+4]
365
.end:
365
.end:
366
           ret
366
           ret
367
endp
367
endp
368
 
368
 
369
align 4
369
align 4
370
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
370
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
371
 
371
 
372
@@:
372
@@:
373
	   stdcall strncmp, [pSym], [sz_sym], 8
373
	   stdcall strncmp, [pSym], [sz_sym], 8
374
	   test eax,eax
374
	   test eax,eax
375
	   jz .ok
375
	   jz .ok
376
	   add [pSym], 18
376
	   add [pSym], 18
377
	   dec [count]
377
	   dec [count]
378
	   jnz @b
378
	   jnz @b
379
	   xor eax, eax
379
	   xor eax, eax
380
	   ret
380
	   ret
381
.ok:
381
.ok:
382
	   mov ebx, [pSym]
382
	   mov ebx, [pSym]
383
	   mov eax, [ebx+8]
383
	   mov eax, [ebx+8]
384
	   ret
384
	   ret
385
endp
385
endp
386
 
386
 
387
align 4
387
align 4
388
proc get_curr_task
388
proc get_curr_task
389
           mov eax,[CURRENT_TASK]
389
           mov eax,[CURRENT_TASK]
390
           shl eax, 8
390
           shl eax, 8
391
           ret
391
           ret
392
endp
392
endp
393
 
393
 
394
align 4
394
align 4
395
proc get_fileinfo stdcall, file_name:dword, info:dword
395
proc get_fileinfo stdcall, file_name:dword, info:dword
396
           locals
396
           locals
397
             cmd     dd ?
397
             cmd     dd ?
398
             offset  dd ?
398
             offset  dd ?
399
                     dd ?
399
                     dd ?
400
             count   dd ?
400
             count   dd ?
401
             buff    dd ?
401
             buff    dd ?
402
                     db ?
402
                     db ?
403
             name    dd ?
403
             name    dd ?
404
           endl
404
           endl
405
 
405
 
406
           xor eax, eax
406
           xor eax, eax
407
           mov ebx, [file_name]
407
           mov ebx, [file_name]
408
           sub ebx, new_app_base
408
           sub ebx, new_app_base
409
           mov ecx, [info]
409
           mov ecx, [info]
410
           sub ecx, new_app_base
410
           sub ecx, new_app_base
411
 
411
 
412
           mov [cmd], 5
412
           mov [cmd], 5
413
           mov [offset], eax
413
           mov [offset], eax
414
           mov [offset+4], eax
414
           mov [offset+4], eax
415
           mov [count], eax
415
           mov [count], eax
416
           mov [buff], ecx
416
           mov [buff], ecx
417
           mov byte [buff+4], al
417
           mov byte [buff+4], al
418
           mov [name], ebx
418
           mov [name], ebx
419
 
419
 
420
           mov eax, 70
420
           mov eax, 70
421
           lea ebx, [cmd]
421
           lea ebx, [cmd]
422
           sub ebx, new_app_base
422
           sub ebx, new_app_base
423
           int 0x40
423
           int 0x40
424
           ret
424
           ret
425
endp
425
endp
426
 
426
 
427
align 4
427
align 4
428
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
428
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
429
                                     bytes:dword
429
                                     bytes:dword
430
           locals
430
           locals
431
             cmd     dd ?
431
             cmd     dd ?
432
             offset  dd ?
432
             offset  dd ?
433
                     dd ?
433
                     dd ?
434
             count   dd ?
434
             count   dd ?
435
             buff    dd ?
435
             buff    dd ?
436
                     db ?
436
                     db ?
437
             name    dd ?
437
             name    dd ?
438
           endl
438
           endl
439
 
439
 
440
           xor eax, eax
440
           xor eax, eax
441
           mov ebx, [file_name]
441
           mov ebx, [file_name]
442
           mov ecx, [off]
442
           mov ecx, [off]
443
           mov edx, [bytes]
443
           mov edx, [bytes]
444
           mov esi, [buffer]
444
           mov esi, [buffer]
445
           sub ebx, new_app_base
445
           sub ebx, new_app_base
446
           sub esi, new_app_base
446
           sub esi, new_app_base
447
 
447
 
448
           mov [cmd], eax
448
           mov [cmd], eax
449
           mov [offset], ecx
449
           mov [offset], ecx
450
           mov [offset+4], eax
450
           mov [offset+4], eax
451
           mov [count], edx
451
           mov [count], edx
452
           mov [buff], esi
452
           mov [buff], esi
453
           mov byte [buff+4], al
453
           mov byte [buff+4], al
454
           mov [name], ebx
454
           mov [name], ebx
455
 
455
 
456
           mov eax, 70
456
           mov eax, 70
457
           lea ebx, [cmd]
457
           lea ebx, [cmd]
458
           sub ebx, new_app_base
458
           sub ebx, new_app_base
459
           int 0x40
459
           int 0x40
460
           ret
460
           ret
461
endp
461
endp
462
 
462
 
463
align 4
463
align 4
464
proc load_file stdcall, file_name:dword
464
proc load_file stdcall, file_name:dword
465
           locals
465
           locals
466
             attr       dd ?
466
             attr       dd ?
467
             flags      dd ?
467
             flags      dd ?
468
             cr_time    dd ?
468
             cr_time    dd ?
469
             cr_date    dd ?
469
             cr_date    dd ?
470
             acc_time   dd ?
470
             acc_time   dd ?
471
             acc_date   dd ?
471
             acc_date   dd ?
472
             mod_time   dd ?
472
             mod_time   dd ?
473
             mod_date   dd ?
473
             mod_date   dd ?
474
             file_size  dd ?
474
             file_size  dd ?
475
 
475
 
476
             file       dd ?
476
             file       dd ?
477
             file2      dd ?
477
             file2      dd ?
478
           endl
478
           endl
479
 
479
 
480
           lea eax, [attr]
480
           lea eax, [attr]
481
           stdcall get_fileinfo, [file_name], eax
481
           stdcall get_fileinfo, [file_name], eax
482
           test eax, eax
482
           test eax, eax
483
           jnz .fail
483
           jnz .fail
484
 
484
 
485
           mov eax, [file_size]
485
           mov eax, [file_size]
486
           cmp eax, 1024*1024*16
486
           cmp eax, 1024*1024*16
487
           ja .fail
487
           ja .fail
488
 
488
 
489
           stdcall kernel_alloc, [file_size]
489
           stdcall kernel_alloc, [file_size]
490
           mov [file], eax
490
           mov [file], eax
491
 
491
 
492
           stdcall read_file, [file_name], eax, dword 0, [file_size]
492
           stdcall read_file, [file_name], eax, dword 0, [file_size]
493
           cmp ebx, [file_size]
493
           cmp ebx, [file_size]
494
           jne .cleanup
494
           jne .cleanup
495
 
495
 
496
           mov eax, [file]
496
           mov eax, [file]
497
           cmp dword [eax], 0x4B43504B
497
           cmp dword [eax], 0x4B43504B
498
           jne .exit
498
           jne .exit
499
           mov ebx, [eax+4]
499
           mov ebx, [eax+4]
500
           mov [file_size], ebx
500
           mov [file_size], ebx
501
           stdcall kernel_alloc, ebx
501
           stdcall kernel_alloc, ebx
502
 
502
 
503
           test eax, eax
503
           test eax, eax
504
           jz .cleanup
504
           jz .cleanup
505
 
505
 
506
           mov [file2], eax
506
           mov [file2], eax
507
           stdcall unpack, [file], eax
507
           stdcall unpack, [file], eax
508
           stdcall kernel_free, [file]
508
           stdcall kernel_free, [file]
509
           mov eax, [file2]
509
           mov eax, [file2]
510
           mov ebx, [file_size]
510
           mov ebx, [file_size]
511
.exit:
511
.exit:
512
           push eax
512
           push eax
513
           lea edi, [eax+ebx]     ;cleanup remain space
513
           lea edi, [eax+ebx]     ;cleanup remain space
514
           mov ecx, ebx          ;from file end
514
           mov ecx, 4096          ;from file end
515
           add ecx, 4095
515
           and ebx, 4095
516
           and ecx, not 4095
516
           sub ecx, ebx
517
           sub ecx, ebx
-
 
518
           xor eax, eax
517
           xor eax, eax
519
           cld
518
           cld
520
           rep stosb
519
           rep stosb
521
           pop eax
520
           mov ebx, [file_size]
-
 
521
           pop eax
522
           ret
522
           ret
523
.cleanup:
523
.cleanup:
524
           stdcall kernel_free, [file]
524
           stdcall kernel_free, [file]
525
.fail:
525
.fail:
526
           xor eax, eax
526
           xor eax, eax
527
           xor ebx, ebx
527
           xor ebx, ebx
528
           ret
528
           ret
529
endp
529
endp
530
 
530
 
531
align 4
531
align 4
532
proc get_proc_ex stdcall, proc_name:dword, imports:dword
532
proc get_proc_ex stdcall, proc_name:dword, imports:dword
533
 
533
 
534
.look_up:
534
.look_up:
535
           mov edx, [imports]
535
           mov edx, [imports]
536
           test edx, edx
536
           test edx, edx
537
           jz .end
537
           jz .end
538
           mov edx, [edx]
538
           mov edx, [edx]
539
           test edx, edx
539
           test edx, edx
540
           jz .end
540
           jz .end
541
.next:
541
.next:
542
           mov eax, [edx]
542
           mov eax, [edx]
543
           test eax, eax
543
           test eax, eax
544
           jz .next_table
544
           jz .next_table
545
 
545
 
546
           push edx
546
           push edx
547
           stdcall strncmp, eax, [proc_name], 16
547
           stdcall strncmp, eax, [proc_name], 16
548
           pop edx
548
           pop edx
549
           test eax, eax
549
           test eax, eax
550
           jz .ok
550
           jz .ok
551
 
551
 
552
           add edx,8
552
           add edx,8
553
           jmp .next
553
           jmp .next
554
.next_table:
554
.next_table:
555
           add [imports], 4
555
           add [imports], 4
556
           jmp .look_up
556
           jmp .look_up
557
.ok:
557
.ok:
558
           mov eax, [edx+4]
558
           mov eax, [edx+4]
559
           ret
559
           ret
560
.end:
560
.end:
561
           xor eax, eax
561
           xor eax, eax
562
           ret
562
           ret
563
endp
563
endp
564
 
564
 
565
align 4
565
align 4
566
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
566
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
567
                      sym_count:dword, strings:dword, imports:dword
567
                      sym_count:dword, strings:dword, imports:dword
568
           locals
568
           locals
569
             retval dd ?
569
             retval dd ?
570
           endl
570
           endl
571
 
571
 
572
           mov edi, [symbols]
572
           mov edi, [symbols]
573
           mov [retval], 1
573
           mov [retval], 1
574
.fix:
574
.fix:
575
           movzx ebx, [edi+CSYM.SectionNumber]
575
           movzx ebx, [edi+CSYM.SectionNumber]
576
           test ebx, ebx
576
           test ebx, ebx
577
           jnz .internal
577
           jnz .internal
578
           mov eax, dword [edi+CSYM.Name]
578
           mov eax, dword [edi+CSYM.Name]
579
           test eax, eax
579
           test eax, eax
580
           jnz @F
580
           jnz @F
581
 
581
 
582
           mov edi, [edi+4]
582
           mov edi, [edi+4]
583
           add edi, [strings]
583
           add edi, [strings]
584
@@:
584
@@:
585
           push edi
585
           push edi
586
           stdcall get_proc_ex, edi,[imports]
586
           stdcall get_proc_ex, edi,[imports]
587
           pop edi
587
           pop edi
588
 
588
 
589
           xor ebx, ebx
589
           xor ebx, ebx
590
           test eax, eax
590
           test eax, eax
591
           jnz @F
591
           jnz @F
592
 
592
 
593
           mov esi, msg_unresolved
593
           mov esi, msg_unresolved
594
           call sys_msg_board_str
594
           call sys_msg_board_str
595
           mov esi, edi
595
           mov esi, edi
596
           call sys_msg_board_str
596
           call sys_msg_board_str
597
           mov esi, msg_CR
597
           mov esi, msg_CR
598
           call sys_msg_board_str
598
           call sys_msg_board_str
599
 
599
 
600
           mov [retval],0
600
           mov [retval],0
601
@@:
601
@@:
602
           mov edi, [symbols]
602
           mov edi, [symbols]
603
           mov [edi+CSYM.Value], eax
603
           mov [edi+CSYM.Value], eax
604
           jmp .next
604
           jmp .next
605
.internal:
605
.internal:
606
           dec ebx
606
           dec ebx
607
           shl ebx, 3
607
           shl ebx, 3
608
           lea ebx, [ebx+ebx*4]
608
           lea ebx, [ebx+ebx*4]
609
           add ebx, [sec]
609
           add ebx, [sec]
610
 
610
 
611
           mov eax, [ebx+CFS.VirtualAddress]
611
           mov eax, [ebx+CFS.VirtualAddress]
612
           add [edi+CSYM.Value], eax
612
           add [edi+CSYM.Value], eax
613
.next:
613
.next:
614
           add edi, CSYM_SIZE
614
           add edi, CSYM_SIZE
615
           mov [symbols], edi
615
           mov [symbols], edi
616
           dec [sym_count]
616
           dec [sym_count]
617
           jnz .fix
617
           jnz .fix
618
           mov eax, [retval]
618
           mov eax, [retval]
619
           ret
619
           ret
620
endp
620
endp
621
 
621
 
622
align 4
622
align 4
623
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
623
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
624
	   locals
624
	   locals
625
             n_sec     dd ?
625
             n_sec     dd ?
626
	   endl
626
	   endl
627
 
627
 
628
           mov eax, [coff]
628
           mov eax, [coff]
629
           movzx ebx, [eax+CFH.nSections]
629
           movzx ebx, [eax+CFH.nSections]
630
           mov [n_sec], ebx
630
           mov [n_sec], ebx
631
.fix_sec:
631
.fix_sec:
632
           mov esi, [sec]
632
           mov esi, [sec]
633
	   mov edi, [esi+CFS.PtrReloc]
633
	   mov edi, [esi+CFS.PtrReloc]
634
           add edi, [coff]
634
           add edi, [coff]
635
 
635
 
636
           movzx ecx, [esi+CFS.NumReloc]
636
           movzx ecx, [esi+CFS.NumReloc]
637
           test ecx, ecx
637
           test ecx, ecx
638
           jz .next
638
           jz .next
639
.next_reloc:
639
.next_reloc:
640
	   mov ebx, [edi+CRELOC.SymIndex]
640
	   mov ebx, [edi+CRELOC.SymIndex]
641
	   add ebx,ebx
641
	   add ebx,ebx
642
	   lea ebx,[ebx+ebx*8]
642
	   lea ebx,[ebx+ebx*8]
643
           add ebx, [sym]
643
           add ebx, [sym]
644
 
644
 
645
           mov edx, [ebx+CSYM.Value]
645
           mov edx, [ebx+CSYM.Value]
646
 
646
 
647
           cmp [edi+CRELOC.Type], 6
647
           cmp [edi+CRELOC.Type], 6
648
           je .dir_32
648
           je .dir_32
649
 
649
 
650
           cmp [edi+CRELOC.Type], 20
650
           cmp [edi+CRELOC.Type], 20
651
           jne .next_reloc
651
           jne .next_reloc
652
.rel_32:
652
.rel_32:
653
	   mov eax, [edi+CRELOC.VirtualAddress]
653
	   mov eax, [edi+CRELOC.VirtualAddress]
654
           add eax, [esi+CFS.VirtualAddress]
654
           add eax, [esi+CFS.VirtualAddress]
655
           sub edx, eax
655
           sub edx, eax
656
           sub edx, 4
656
           sub edx, 4
657
           jmp .fix
657
           jmp .fix
658
.dir_32:
658
.dir_32:
659
	   mov eax, [edi+CRELOC.VirtualAddress]
659
	   mov eax, [edi+CRELOC.VirtualAddress]
660
           add eax, [esi+CFS.VirtualAddress]
660
           add eax, [esi+CFS.VirtualAddress]
661
.fix:
661
.fix:
662
           add [eax], edx
662
           add [eax], edx
663
           add edi, 10
663
           add edi, 10
664
           dec ecx
664
           dec ecx
665
           jnz .next_reloc
665
           jnz .next_reloc
666
.next:
666
.next:
667
           add [sec], COFF_SECTION_SIZE
667
           add [sec], COFF_SECTION_SIZE
668
           dec [n_sec]
668
           dec [n_sec]
669
           jnz .fix_sec
669
           jnz .fix_sec
670
.exit:
670
.exit:
671
	   ret
671
	   ret
672
endp
672
endp
673
 
673
 
674
align 4
674
align 4
675
proc load_driver stdcall, driver_name:dword
675
proc load_driver stdcall, driver_name:dword
676
           locals
676
           locals
677
             coff      dd ?
677
             coff      dd ?
678
             sym       dd ?
678
             sym       dd ?
679
             strings   dd ?
679
             strings   dd ?
680
             img_size  dd ?
680
             img_size  dd ?
681
             img_base  dd ?
681
             img_base  dd ?
682
             start     dd ?
682
             start     dd ?
683
 
683
 
684
             exports   dd ?   ;fake exports table
684
             exports   dd ?   ;fake exports table
685
                       dd ?
685
                       dd ?
686
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
686
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
687
           endl
687
           endl
688
 
688
 
689
        lea     edx, [file_name]
689
        lea     edx, [file_name]
690
        mov     dword [edx], '/rd/'
690
        mov     dword [edx], '/rd/'
691
        mov     dword [edx+4], '1/dr'
691
        mov     dword [edx+4], '1/dr'
692
        mov     dword [edx+8], 'iver'
692
        mov     dword [edx+8], 'iver'
693
        mov     word [edx+12], 's/'
693
        mov     word [edx+12], 's/'
694
        mov     esi, [driver_name]
694
        mov     esi, [driver_name]
695
        lea     edi, [edx+14]
695
        lea     edi, [edx+14]
696
        mov     ecx, 16
696
        mov     ecx, 16
697
@@:
697
@@:
698
        lodsb
698
        lodsb
699
        test    al, al
699
        test    al, al
700
        jz      @f
700
        jz      @f
701
        stosb
701
        stosb
702
        loop    @b
702
        loop    @b
703
@@:
703
@@:
704
        mov     dword [edi], '.obj'
704
        mov     dword [edi], '.obj'
705
        mov     byte [edi+4], 0
705
        mov     byte [edi+4], 0
706
           stdcall load_file, edx
706
           stdcall load_file, edx
707
 
707
 
708
           test eax, eax
708
           test eax, eax
709
           jz .exit
709
           jz .exit
710
 
710
 
711
           mov [coff], eax
711
           mov [coff], eax
712
 
712
 
713
           movzx ecx, [eax+CFH.nSections]
713
           movzx ecx, [eax+CFH.nSections]
714
           xor ebx, ebx
714
           xor ebx, ebx
715
 
715
 
716
           lea edx, [eax+20]
716
           lea edx, [eax+20]
717
@@:
717
@@:
718
           add ebx, [edx+CFS.SizeOfRawData]
718
           add ebx, [edx+CFS.SizeOfRawData]
719
           add ebx, 15
719
           add ebx, 15
720
           and ebx, not 15
720
           and ebx, not 15
721
           add edx, COFF_SECTION_SIZE
721
           add edx, COFF_SECTION_SIZE
722
           dec ecx
722
           dec ecx
723
           jnz @B
723
           jnz @B
724
           mov [img_size], ebx
724
           mov [img_size], ebx
725
 
725
 
726
           stdcall kernel_alloc, ebx
726
           stdcall kernel_alloc, ebx
727
           test eax, eax
727
           test eax, eax
728
           jz .fail
728
           jz .fail
729
           mov [img_base], eax
729
           mov [img_base], eax
730
 
730
 
731
           mov edi, eax
731
           mov edi, eax
732
           xor eax, eax
732
           xor eax, eax
733
           mov ecx, [img_size]
733
           mov ecx, [img_size]
734
           add ecx, 4095
734
           add ecx, 4095
735
           and ecx, not 4095
735
           and ecx, not 4095
736
           shr ecx, 2
736
           shr ecx, 2
737
           cld
737
           cld
738
           rep stosd
738
           rep stosd
739
 
739
 
740
           mov edx, [coff]
740
           mov edx, [coff]
741
           movzx ebx, [edx+CFH.nSections]
741
           movzx ebx, [edx+CFH.nSections]
742
           mov edi, [img_base]
742
           mov edi, [img_base]
743
           lea eax, [edx+20]
743
           lea eax, [edx+20]
744
@@:
744
@@:
745
           mov [eax+CFS.VirtualAddress], edi
745
           mov [eax+CFS.VirtualAddress], edi
746
           mov esi, [eax+CFS.PtrRawData]
746
           mov esi, [eax+CFS.PtrRawData]
747
           test esi, esi
747
           test esi, esi
748
           jnz .copy
748
           jnz .copy
749
           add edi, [eax+CFS.SizeOfRawData]
749
           add edi, [eax+CFS.SizeOfRawData]
750
           jmp .next
750
           jmp .next
751
.copy:
751
.copy:
752
           add esi, edx
752
           add esi, edx
753
           mov ecx, [eax+CFS.SizeOfRawData]
753
           mov ecx, [eax+CFS.SizeOfRawData]
754
           cld
754
           cld
755
           rep movsb
755
           rep movsb
756
.next:
756
.next:
757
           add edi, 15
757
           add edi, 15
758
           and edi, not 15
758
           and edi, not 15
759
           add eax, COFF_SECTION_SIZE
759
           add eax, COFF_SECTION_SIZE
760
           dec ebx
760
           dec ebx
761
           jnz @B
761
           jnz @B
762
 
762
 
763
           mov ebx, [edx+CFH.pSymTable]
763
           mov ebx, [edx+CFH.pSymTable]
764
           add ebx, edx
764
           add ebx, edx
765
           mov [sym], ebx
765
           mov [sym], ebx
766
           mov ecx, [edx+CFH.nSymbols]
766
           mov ecx, [edx+CFH.nSymbols]
767
           add ecx,ecx
767
           add ecx,ecx
768
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
768
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
769
           add ecx, [sym]
769
           add ecx, [sym]
770
           mov [strings], ecx
770
           mov [strings], ecx
771
 
771
 
772
           lea ebx, [exports]
772
           lea ebx, [exports]
773
           mov dword [ebx], kernel_export
773
           mov dword [ebx], kernel_export
774
           mov dword [ebx+4], 0
774
           mov dword [ebx+4], 0
775
           lea eax, [edx+20]
775
           lea eax, [edx+20]
776
 
776
 
777
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
777
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
778
                                     [strings], ebx
778
                                     [strings], ebx
779
           test eax, eax
779
           test eax, eax
780
           jz .link_fail
780
           jz .link_fail
781
 
781
 
782
           mov ebx, [coff]
782
           mov ebx, [coff]
783
           add ebx, 20
783
           add ebx, 20
784
           stdcall fix_coff_relocs, [coff], ebx, [sym]
784
           stdcall fix_coff_relocs, [coff], ebx, [sym]
785
 
785
 
786
           mov ebx, [coff]
786
           mov ebx, [coff]
787
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
787
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
788
           test eax, eax
788
           test eax, eax
789
           jz .link_fail
789
           jz .link_fail
790
 
790
 
791
           mov eax, [eax]
791
           mov eax, [eax]
792
           shr eax, 16
792
           shr eax, 16
793
           cmp eax, DRV_COMPAT
793
           cmp eax, DRV_COMPAT
794
           jb .ver_fail
794
           jb .ver_fail
795
 
795
 
796
           cmp eax, DRV_CURRENT
796
           cmp eax, DRV_CURRENT
797
           ja .ver_fail
797
           ja .ver_fail
798
 
798
 
799
           mov ebx, [coff]
799
           mov ebx, [coff]
800
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
800
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
801
           mov [start], eax
801
           mov [start], eax
802
 
802
 
803
           stdcall kernel_free, [coff]
803
           stdcall kernel_free, [coff]
804
 
804
 
805
           mov ebx, [start]
805
           mov ebx, [start]
806
           stdcall ebx, DRV_ENTRY
806
           stdcall ebx, DRV_ENTRY
807
           test eax, eax
807
           test eax, eax
808
           jnz .ok
808
           jnz .ok
809
 
809
 
810
           stdcall kernel_free, [img_base]
810
           stdcall kernel_free, [img_base]
811
           xor eax, eax
811
           xor eax, eax
812
           ret
812
           ret
813
.ok:
813
.ok:
814
           mov ebx, [img_base]
814
           mov ebx, [img_base]
815
           mov [eax+SRV.base], ebx
815
           mov [eax+SRV.base], ebx
816
           mov ecx, [start]
816
           mov ecx, [start]
817
           mov [eax+SRV.entry], ecx
817
           mov [eax+SRV.entry], ecx
818
           ret
818
           ret
819
 
819
 
820
.ver_fail:
820
.ver_fail:
821
           mov esi, msg_CR
821
           mov esi, msg_CR
822
           call sys_msg_board_str
822
           call sys_msg_board_str
823
           mov esi, [driver_name]
823
           mov esi, [driver_name]
824
           call sys_msg_board_str
824
           call sys_msg_board_str
825
           mov esi, msg_CR
825
           mov esi, msg_CR
826
           call sys_msg_board_str
826
           call sys_msg_board_str
827
           mov esi, msg_version
827
           mov esi, msg_version
828
           call sys_msg_board_str
828
           call sys_msg_board_str
829
           mov esi, msg_www
829
           mov esi, msg_www
830
           call sys_msg_board_str
830
           call sys_msg_board_str
831
           jmp .cleanup
831
           jmp .cleanup
832
 
832
 
833
.link_fail:
833
.link_fail:
834
           mov esi, msg_module
834
           mov esi, msg_module
835
           call sys_msg_board_str
835
           call sys_msg_board_str
836
           mov esi, [driver_name]
836
           mov esi, [driver_name]
837
           call sys_msg_board_str
837
           call sys_msg_board_str
838
           mov esi, msg_CR
838
           mov esi, msg_CR
839
           call sys_msg_board_str
839
           call sys_msg_board_str
840
.cleanup:
840
.cleanup:
841
           stdcall kernel_free,[img_base]
841
           stdcall kernel_free,[img_base]
842
.fail:
842
.fail:
843
           stdcall kernel_free, [coff]
843
           stdcall kernel_free, [coff]
844
.exit:
844
.exit:
845
           xor eax, eax
845
           xor eax, eax
846
           ret
846
           ret
847
endp
847
endp
848
 
848
 
849
align 4
849
align 4
850
proc load_library stdcall, file_name:dword
850
proc load_library stdcall, file_name:dword
851
           locals
851
           locals
852
             coff      dd ?
852
             coff      dd ?
853
             sym       dd ?
853
             sym       dd ?
854
             strings   dd ?
854
             strings   dd ?
855
             img_size  dd ?
855
             img_size  dd ?
856
             img_base  dd ?
856
             img_base  dd ?
857
             exports   dd ?
857
             exports   dd ?
858
           endl
858
           endl
859
 
859
 
860
           cli
860
           cli
861
 
861
 
862
           stdcall load_file, [file_name]
862
           stdcall load_file, [file_name]
863
           test eax, eax
863
           test eax, eax
864
           jz .fail
864
           jz .fail
865
 
865
 
866
           mov [coff], eax
866
           mov [coff], eax
867
           movzx ecx, [eax+CFH.nSections]
867
           movzx ecx, [eax+CFH.nSections]
868
           xor ebx, ebx
868
           xor ebx, ebx
869
 
869
 
870
           lea edx, [eax+20]
870
           lea edx, [eax+20]
871
@@:
871
@@:
872
           add ebx, [edx+CFS.SizeOfRawData]
872
           add ebx, [edx+CFS.SizeOfRawData]
873
           add ebx, 15
873
           add ebx, 15
874
           and ebx, not 15
874
           and ebx, not 15
875
           add edx, COFF_SECTION_SIZE
875
           add edx, COFF_SECTION_SIZE
876
           dec ecx
876
           dec ecx
877
           jnz @B
877
           jnz @B
878
           mov [img_size], ebx
878
           mov [img_size], ebx
879
 
879
 
880
           call init_heap
880
           call init_heap
881
           stdcall user_alloc, [img_size]
881
           stdcall user_alloc, [img_size]
882
 
882
 
883
           test eax, eax
883
           test eax, eax
884
           jz .fail
884
           jz .fail
885
           mov [img_base], eax
885
           mov [img_base], eax
886
 
886
 
887
           mov edx, [coff]
887
           mov edx, [coff]
888
           movzx ebx, [edx+CFH.nSections]
888
           movzx ebx, [edx+CFH.nSections]
889
           mov edi, [img_base]
889
           mov edi, [img_base]
890
           lea eax, [edx+20]
890
           lea eax, [edx+20]
891
@@:
891
@@:
892
           mov [eax+CFS.VirtualAddress], edi
892
           mov [eax+CFS.VirtualAddress], edi
893
           mov esi, [eax+CFS.PtrRawData]
893
           mov esi, [eax+CFS.PtrRawData]
894
           test esi, esi
894
           test esi, esi
895
           jnz .copy
895
           jnz .copy
896
           add edi, [eax+CFS.SizeOfRawData]
896
           add edi, [eax+CFS.SizeOfRawData]
897
           jmp .next
897
           jmp .next
898
.copy:
898
.copy:
899
           add esi, edx
899
           add esi, edx
900
           add edi, new_app_base
900
           add edi, new_app_base
901
           mov ecx, [eax+CFS.SizeOfRawData]
901
           mov ecx, [eax+CFS.SizeOfRawData]
902
           cld
902
           cld
903
           rep movsb
903
           rep movsb
904
.next:
904
.next:
905
           add edi, 15-new_app_base
905
           add edi, 15-new_app_base
906
           and edi, not 15
906
           and edi, not 15
907
           add eax, COFF_SECTION_SIZE
907
           add eax, COFF_SECTION_SIZE
908
           dec ebx
908
           dec ebx
909
           jnz @B
909
           jnz @B
910
 
910
 
911
           mov ebx, [edx+CFH.pSymTable]
911
           mov ebx, [edx+CFH.pSymTable]
912
           add ebx, edx
912
           add ebx, edx
913
           mov [sym], ebx
913
           mov [sym], ebx
914
           mov ecx, [edx+CFH.nSymbols]
914
           mov ecx, [edx+CFH.nSymbols]
915
           add ecx,ecx
915
           add ecx,ecx
916
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
916
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
917
           add ecx, [sym]
917
           add ecx, [sym]
918
           mov [strings], ecx
918
           mov [strings], ecx
919
 
919
 
920
           lea eax, [edx+20]
920
           lea eax, [edx+20]
921
 
921
 
922
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
922
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
923
                                     [strings], dword 0
923
                                     [strings], dword 0
924
           test eax, eax
924
           test eax, eax
925
           jnz @F
925
           jnz @F
926
 
926
 
927
@@:
927
@@:
928
           mov edx, [coff]
928
           mov edx, [coff]
929
           movzx ebx, [edx+CFH.nSections]
929
           movzx ebx, [edx+CFH.nSections]
930
           mov edi, new_app_base
930
           mov edi, new_app_base
931
           lea eax, [edx+20]
931
           lea eax, [edx+20]
932
@@:
932
@@:
933
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
933
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
934
           add eax, COFF_SECTION_SIZE
934
           add eax, COFF_SECTION_SIZE
935
           dec ebx
935
           dec ebx
936
           jnz @B
936
           jnz @B
937
 
937
 
938
           add edx, 20
938
           add edx, 20
939
           stdcall fix_coff_relocs, [coff], edx, [sym]
939
           stdcall fix_coff_relocs, [coff], edx, [sym]
940
 
940
 
941
           mov ebx, [coff]
941
           mov ebx, [coff]
942
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
942
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
943
           mov [exports], eax
943
           mov [exports], eax
944
 
944
 
945
           stdcall kernel_free, [coff]
945
           stdcall kernel_free, [coff]
946
           mov eax, [exports]
946
           mov eax, [exports]
947
           ret
947
           ret
948
.fail:
948
.fail:
949
           xor eax, eax
949
           xor eax, eax
950
           ret
950
           ret
951
endp
951
endp
952
 
952
 
953
align 4
953
align 4
954
proc stop_all_services
954
proc stop_all_services
955
 
955
 
956
           mov edx, [srv.fd]
956
           mov edx, [srv.fd]
957
.next:
957
.next:
958
           cmp edx,  srv.fd-SRV_FD_OFFSET
958
           cmp edx,  srv.fd-SRV_FD_OFFSET
959
           je .done
959
           je .done
960
           cmp [edx+SRV.magic], ' SRV'
960
           cmp [edx+SRV.magic], ' SRV'
961
           jne .next
961
           jne .next
962
           cmp [edx+SRV.size], SRV_SIZE
962
           cmp [edx+SRV.size], SRV_SIZE
963
           jne .next
963
           jne .next
964
           mov ebx, [edx+SRV.entry]
964
           mov ebx, [edx+SRV.entry]
965
           mov edx, [edx+SRV.fd]
965
           mov edx, [edx+SRV.fd]
966
           push edx
966
           push edx
967
           stdcall ebx, dword -1
967
           stdcall ebx, dword -1
968
           pop edx
968
           pop edx
969
           jmp .next
969
           jmp .next
970
.done:
970
.done:
971
           ret
971
           ret
972
endp
972
endp
973
 
973
 
974
; param
974
; param
975
;  eax= size
975
;  eax= size
976
;  ebx= pid
976
;  ebx= pid
977
 
977
 
978
align 4
978
align 4
979
create_kernel_object:
979
create_kernel_object:
980
 
980
 
981
           push ebx
981
           push ebx
982
           call malloc
982
           call malloc
983
           pop ebx
983
           pop ebx
984
           test eax, eax
984
           test eax, eax
985
           jz .fail
985
           jz .fail
986
 
986
 
987
           mov ecx,[CURRENT_TASK]
987
           mov ecx,[CURRENT_TASK]
988
           shl ecx,8
988
           shl ecx,8
989
           add ecx, PROC_BASE+APP_OBJ_OFFSET
989
           add ecx, PROC_BASE+APP_OBJ_OFFSET
990
 
990
 
991
           pushfd
991
           pushfd
992
           cli
992
           cli
993
           mov edx, [ecx+APPOBJ.fd]
993
           mov edx, [ecx+APPOBJ.fd]
994
           mov [eax+APPOBJ.fd], edx
994
           mov [eax+APPOBJ.fd], edx
995
           mov [eax+APPOBJ.bk], ecx
995
           mov [eax+APPOBJ.bk], ecx
996
           mov [eax+APPOBJ.pid], ebx
996
           mov [eax+APPOBJ.pid], ebx
997
 
997
 
998
           mov [ecx+APPOBJ.fd], eax
998
           mov [ecx+APPOBJ.fd], eax
999
           mov [edx+APPOBJ.bk], eax
999
           mov [edx+APPOBJ.bk], eax
1000
           popfd
1000
           popfd
1001
.fail:
1001
.fail:
1002
           ret
1002
           ret
1003
 
1003
 
1004
; param
1004
; param
1005
;  eax= object
1005
;  eax= object
1006
 
1006
 
1007
align 4
1007
align 4
1008
destroy_kernel_object:
1008
destroy_kernel_object:
1009
 
1009
 
1010
           pushfd
1010
           pushfd
1011
           cli
1011
           cli
1012
           mov ebx, [eax+APPOBJ.fd]
1012
           mov ebx, [eax+APPOBJ.fd]
1013
           mov ecx, [eax+APPOBJ.bk]
1013
           mov ecx, [eax+APPOBJ.bk]
1014
           mov [ebx+APPOBJ.bk], ecx
1014
           mov [ebx+APPOBJ.bk], ecx
1015
           mov [ecx+APPOBJ.fd], ebx
1015
           mov [ecx+APPOBJ.fd], ebx
1016
           popfd
1016
           popfd
1017
 
1017
 
1018
           xor edx, edx        ;clear common header
1018
           xor edx, edx        ;clear common header
1019
           mov [eax], edx
1019
           mov [eax], edx
1020
           mov [eax+4], edx
1020
           mov [eax+4], edx
1021
           mov [eax+8], edx
1021
           mov [eax+8], edx
1022
           mov [eax+12], edx
1022
           mov [eax+12], edx
1023
           mov [eax+16], edx
1023
           mov [eax+16], edx
1024
 
1024
 
1025
           call free           ;release object memory
1025
           call free           ;release object memory
1026
           ret
1026
           ret
1027
 
1027
 
1028
 
1028
 
1029
;szSound        db 'SOUND',0
1029
;szSound        db 'SOUND',0
1030
;szInfinity     db 'INFINITY',0
1030
;szInfinity     db 'INFINITY',0
1031
szHwMouse      db 'ATI2D',0
1031
szHwMouse      db 'ATI2D',0
1032
 
1032
 
1033
szSTART        db 'START',0
1033
szSTART        db 'START',0
1034
szEXPORTS      db 'EXPORTS',0
1034
szEXPORTS      db 'EXPORTS',0
1035
szIMPORTS      db 'IMPORTS',0
1035
szIMPORTS      db 'IMPORTS',0
1036
 
1036
 
1037
msg_unresolved db 'unresolved ',0
1037
msg_unresolved db 'unresolved ',0
1038
msg_module     db 'in module ',0
1038
msg_module     db 'in module ',0
1039
msg_version    db 'incompatible driver version',13,10,0
1039
msg_version    db 'incompatible driver version',13,10,0
1040
msg_www        db 'please visit www.kolibrios.org',13,10,0
1040
msg_www        db 'please visit www.kolibrios.org',13,10,0
1041
msg_CR         db  13,10,0
1041
msg_CR         db  13,10,0
1042
 
1042
 
1043
align 4
1043
align 4
1044
create_cursor    dd 0
1044
create_cursor    dd 0
1045
set_hw_cursor    dd 0
1045
set_hw_cursor    dd 0
1046
hw_restore       dd 0
1046
hw_restore       dd 0