Subversion Repositories Kolibri OS

Rev

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

Rev 377 Rev 378
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  4  ;minimal required drivers version
4
DRV_CURRENT  equ  3  ;current drivers model version
4
DRV_CURRENT  equ  4  ;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
; param
243
; param
244
;  ebx= io_control
244
;  ebx= io_control
245
;
245
;
246
; retval
246
; retval
247
;  eax= error code
247
;  eax= error code
248
 
248
 
249
align 4
249
align 4
250
srv_handlerEx:
250
srv_handlerEx:
251
           test ebx, ebx
251
           test ebx, ebx
252
           jz .fail
252
           jz .fail
253
           add ebx, new_app_base
253
           add ebx, new_app_base
254
 
254
 
255
           mov eax, [ebx+handle]
255
           mov eax, [ebx+handle]
256
           cmp [eax+SRV.magic], ' SRV'
256
           cmp [eax+SRV.magic], ' SRV'
257
	   jne .fail
257
	   jne .fail
258
 
258
 
259
           cmp [eax+SRV.size], SRV_SIZE
259
           cmp [eax+SRV.size], SRV_SIZE
260
	   jne .fail
260
	   jne .fail
261
 
261
 
262
           add [ebx+input], new_app_base
262
           add [ebx+input], new_app_base
263
           add [ebx+output], new_app_base
263
           add [ebx+output], new_app_base
264
 
264
 
265
           stdcall [eax+SRV.srv_proc], ebx
265
           stdcall [eax+SRV.srv_proc], ebx
266
           ret
266
           ret
267
.fail:
267
.fail:
268
           or eax, -1
268
           or eax, -1
269
           ret
269
           ret
270
 
270
 
271
restore  handle
271
restore  handle
272
restore  io_code
272
restore  io_code
273
restore  input
273
restore  input
274
restore  inp_size
274
restore  inp_size
275
restore  output
275
restore  output
276
restore  out_size
276
restore  out_size
277
 
277
 
278
align 4
278
align 4
279
proc get_service stdcall, sz_name:dword
279
proc get_service stdcall, sz_name:dword
280
           mov eax, [sz_name]
280
           mov eax, [sz_name]
281
           test eax, eax
281
           test eax, eax
282
           jnz @F
282
           jnz @F
283
           ret
283
           ret
284
@@:
284
@@:
285
           mov edx, [srv.fd]
285
           mov edx, [srv.fd]
286
@@:
286
@@:
287
           cmp edx, srv.fd-SRV_FD_OFFSET
287
           cmp edx, srv.fd-SRV_FD_OFFSET
288
           je .not_load
288
           je .not_load
289
 
289
 
290
           stdcall strncmp, edx, [sz_name], 16
290
           stdcall strncmp, edx, [sz_name], 16
291
           test eax, eax
291
           test eax, eax
292
           je .ok
292
           je .ok
293
 
293
 
294
           mov edx, [edx+SRV.fd]
294
           mov edx, [edx+SRV.fd]
295
           jmp @B
295
           jmp @B
296
.not_load:
296
.not_load:
297
           pop ebp
297
           pop ebp
298
           jmp load_driver
298
           jmp load_driver
299
.ok:
299
.ok:
300
           mov eax, edx
300
           mov eax, edx
301
           ret
301
           ret
302
endp
302
endp
303
 
303
 
304
align 4
304
align 4
305
reg_service:
305
reg_service:
306
.sz_name equ esp+4
306
.sz_name equ esp+4
307
.handler equ esp+8
307
.handler equ esp+8
308
           mov eax, [.sz_name]
308
           mov eax, [.sz_name]
309
	   test eax, eax
309
	   test eax, eax
310
	   jz .fail
310
	   jz .fail
311
 
311
 
312
           mov ebx, [.handler]
312
           mov ebx, [.handler]
313
	   test ebx, ebx
313
	   test ebx, ebx
314
	   jz .fail
314
	   jz .fail
315
 
315
 
316
           mov eax, SRV_SIZE
316
           mov eax, SRV_SIZE
317
           call malloc           ;call alloc_service
317
           call malloc           ;call alloc_service
318
	   test eax, eax
318
	   test eax, eax
319
	   jz .fail
319
	   jz .fail
320
 
320
 
321
	   mov edi, eax
321
	   mov edi, eax
322
           mov esi, [.sz_name]
322
           mov esi, [.sz_name]
323
           mov ecx, 16/4
323
           mov ecx, 16/4
324
           rep movsd
324
           rep movsd
325
 
325
 
326
           mov [eax+SRV.magic], ' SRV'
326
           mov [eax+SRV.magic], ' SRV'
327
           mov [eax+SRV.size], SRV_SIZE
327
           mov [eax+SRV.size], SRV_SIZE
328
 
328
 
329
           mov ebx, srv.fd-SRV_FD_OFFSET
329
           mov ebx, srv.fd-SRV_FD_OFFSET
330
           mov edx, [ebx+SRV.fd]
330
           mov edx, [ebx+SRV.fd]
331
           mov [eax+SRV.fd], edx
331
           mov [eax+SRV.fd], edx
332
           mov [eax+SRV.bk], ebx
332
           mov [eax+SRV.bk], ebx
333
           mov [ebx+SRV.fd], eax
333
           mov [ebx+SRV.fd], eax
334
           mov [edx+SRV.bk], eax
334
           mov [edx+SRV.bk], eax
335
 
335
 
336
           mov ecx, [.handler]
336
           mov ecx, [.handler]
337
           mov [eax+SRV.srv_proc], ecx
337
           mov [eax+SRV.srv_proc], ecx
338
           ret 8
338
           ret 8
339
.fail:
339
.fail:
340
	   xor eax, eax
340
	   xor eax, eax
341
           ret 8
341
           ret 8
342
 
342
 
343
align 4
343
align 4
344
proc get_proc stdcall, exp:dword, sz_name:dword
344
proc get_proc stdcall, exp:dword, sz_name:dword
345
 
345
 
346
           mov edx, [exp]
346
           mov edx, [exp]
347
.next:
347
.next:
348
           mov eax, [edx]
348
           mov eax, [edx]
349
           test eax, eax
349
           test eax, eax
350
           jz .end
350
           jz .end
351
 
351
 
352
           push edx
352
           push edx
353
           stdcall strncmp, eax, [sz_name], 16
353
           stdcall strncmp, eax, [sz_name], 16
354
           pop edx
354
           pop edx
355
           test eax, eax
355
           test eax, eax
356
           jz .ok
356
           jz .ok
357
 
357
 
358
           add edx,8
358
           add edx,8
359
           jmp .next
359
           jmp .next
360
.ok:
360
.ok:
361
           mov eax, [edx+4]
361
           mov eax, [edx+4]
362
.end:
362
.end:
363
           ret
363
           ret
364
endp
364
endp
365
 
365
 
366
align 4
366
align 4
367
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
367
proc get_coff_sym stdcall, pSym:dword,count:dword, sz_sym:dword
368
 
368
 
369
@@:
369
@@:
370
	   stdcall strncmp, [pSym], [sz_sym], 8
370
	   stdcall strncmp, [pSym], [sz_sym], 8
371
	   test eax,eax
371
	   test eax,eax
372
	   jz .ok
372
	   jz .ok
373
	   add [pSym], 18
373
	   add [pSym], 18
374
	   dec [count]
374
	   dec [count]
375
	   jnz @b
375
	   jnz @b
376
	   xor eax, eax
376
	   xor eax, eax
377
	   ret
377
	   ret
378
.ok:
378
.ok:
379
	   mov ebx, [pSym]
379
	   mov ebx, [pSym]
380
	   mov eax, [ebx+8]
380
	   mov eax, [ebx+8]
381
	   ret
381
	   ret
382
endp
382
endp
383
 
383
 
384
align 4
384
align 4
385
proc get_curr_task
385
proc get_curr_task
386
           mov eax,[CURRENT_TASK]
386
           mov eax,[CURRENT_TASK]
387
           shl eax, 8
387
           shl eax, 8
388
           ret
388
           ret
389
endp
389
endp
390
 
390
 
391
align 4
391
align 4
392
proc get_fileinfo stdcall, file_name:dword, info:dword
392
proc get_fileinfo stdcall, file_name:dword, info:dword
393
           locals
393
           locals
394
             cmd     dd ?
394
             cmd     dd ?
395
             offset  dd ?
395
             offset  dd ?
396
                     dd ?
396
                     dd ?
397
             count   dd ?
397
             count   dd ?
398
             buff    dd ?
398
             buff    dd ?
399
                     db ?
399
                     db ?
400
             name    dd ?
400
             name    dd ?
401
           endl
401
           endl
402
 
402
 
403
           xor eax, eax
403
           xor eax, eax
404
           mov ebx, [file_name]
404
           mov ebx, [file_name]
405
           sub ebx, new_app_base
405
           sub ebx, new_app_base
406
           mov ecx, [info]
406
           mov ecx, [info]
407
           sub ecx, new_app_base
407
           sub ecx, new_app_base
408
 
408
 
409
           mov [cmd], 5
409
           mov [cmd], 5
410
           mov [offset], eax
410
           mov [offset], eax
411
           mov [offset+4], eax
411
           mov [offset+4], eax
412
           mov [count], eax
412
           mov [count], eax
413
           mov [buff], ecx
413
           mov [buff], ecx
414
           mov byte [buff+4], al
414
           mov byte [buff+4], al
415
           mov [name], ebx
415
           mov [name], ebx
416
 
416
 
417
           mov eax, 70
417
           mov eax, 70
418
           lea ebx, [cmd]
418
           lea ebx, [cmd]
419
           sub ebx, new_app_base
419
           sub ebx, new_app_base
420
           int 0x40
420
           int 0x40
421
           ret
421
           ret
422
endp
422
endp
423
 
423
 
424
align 4
424
align 4
425
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
425
proc read_file stdcall,file_name:dword, buffer:dword, off:dword,\
426
                                     bytes:dword
426
                                     bytes:dword
427
           locals
427
           locals
428
             cmd     dd ?
428
             cmd     dd ?
429
             offset  dd ?
429
             offset  dd ?
430
                     dd ?
430
                     dd ?
431
             count   dd ?
431
             count   dd ?
432
             buff    dd ?
432
             buff    dd ?
433
                     db ?
433
                     db ?
434
             name    dd ?
434
             name    dd ?
435
           endl
435
           endl
436
 
436
 
437
           xor eax, eax
437
           xor eax, eax
438
           mov ebx, [file_name]
438
           mov ebx, [file_name]
439
           mov ecx, [off]
439
           mov ecx, [off]
440
           mov edx, [bytes]
440
           mov edx, [bytes]
441
           mov esi, [buffer]
441
           mov esi, [buffer]
442
           sub ebx, new_app_base
442
           sub ebx, new_app_base
443
           sub esi, new_app_base
443
           sub esi, new_app_base
444
 
444
 
445
           mov [cmd], eax
445
           mov [cmd], eax
446
           mov [offset], ecx
446
           mov [offset], ecx
447
           mov [offset+4], eax
447
           mov [offset+4], eax
448
           mov [count], edx
448
           mov [count], edx
449
           mov [buff], esi
449
           mov [buff], esi
450
           mov byte [buff+4], al
450
           mov byte [buff+4], al
451
           mov [name], ebx
451
           mov [name], ebx
452
 
452
 
453
           mov eax, 70
453
           mov eax, 70
454
           lea ebx, [cmd]
454
           lea ebx, [cmd]
455
           sub ebx, new_app_base
455
           sub ebx, new_app_base
456
           int 0x40
456
           int 0x40
457
           ret
457
           ret
458
endp
458
endp
459
 
459
 
460
; description
460
; description
461
;  allocate kernel memory and loads the specified file
461
;  allocate kernel memory and loads the specified file
462
;
462
;
463
; param
463
; param
464
;  file_name= full path to file
464
;  file_name= full path to file
465
;
465
;
466
; retval
466
; retval
467
;  eax= file image in kernel memory
467
;  eax= file image in kernel memory
468
;  ebx= size of file
468
;  ebx= size of file
469
;
469
;
470
; warging
470
; warging
471
;  You mast call kernel_free() to delete each file
471
;  You mast call kernel_free() to delete each file
472
;  loaded by the load_file() function
472
;  loaded by the load_file() function
473
 
473
 
474
align 4
474
align 4
475
proc load_file stdcall, file_name:dword
475
proc load_file stdcall, file_name:dword
476
           locals
476
           locals
477
             attr       dd ?
477
             attr       dd ?
478
             flags      dd ?
478
             flags      dd ?
479
             cr_time    dd ?
479
             cr_time    dd ?
480
             cr_date    dd ?
480
             cr_date    dd ?
481
             acc_time   dd ?
481
             acc_time   dd ?
482
             acc_date   dd ?
482
             acc_date   dd ?
483
             mod_time   dd ?
483
             mod_time   dd ?
484
             mod_date   dd ?
484
             mod_date   dd ?
485
             file_size  dd ?
485
             file_size  dd ?
486
 
486
 
487
             file       dd ?
487
             file       dd ?
488
             file2      dd ?
488
             file2      dd ?
489
           endl
489
           endl
490
 
490
 
491
           lea eax, [attr]
491
           lea eax, [attr]
492
           stdcall get_fileinfo, [file_name], eax
492
           stdcall get_fileinfo, [file_name], eax
493
           test eax, eax
493
           test eax, eax
494
           jnz .fail
494
           jnz .fail
495
 
495
 
496
           mov eax, [file_size]
496
           mov eax, [file_size]
497
           cmp eax, 1024*1024*16
497
           cmp eax, 1024*1024*16
498
           ja .fail
498
           ja .fail
499
 
499
 
500
           stdcall kernel_alloc, [file_size]
500
           stdcall kernel_alloc, [file_size]
501
           mov [file], eax
501
           mov [file], eax
502
 
502
 
503
           stdcall read_file, [file_name], eax, dword 0, [file_size]
503
           stdcall read_file, [file_name], eax, dword 0, [file_size]
504
           cmp ebx, [file_size]
504
           cmp ebx, [file_size]
505
           jne .cleanup
505
           jne .cleanup
506
 
506
 
507
           mov eax, [file]
507
           mov eax, [file]
508
           cmp dword [eax], 0x4B43504B
508
           cmp dword [eax], 0x4B43504B
509
           jne .exit
509
           jne .exit
510
           mov ebx, [eax+4]
510
           mov ebx, [eax+4]
511
           mov [file_size], ebx
511
           mov [file_size], ebx
512
           stdcall kernel_alloc, ebx
512
           stdcall kernel_alloc, ebx
513
 
513
 
514
           test eax, eax
514
           test eax, eax
515
           jz .cleanup
515
           jz .cleanup
516
 
516
 
517
           mov [file2], eax
517
           mov [file2], eax
518
           stdcall unpack, [file], eax
518
           stdcall unpack, [file], eax
519
           stdcall kernel_free, [file]
519
           stdcall kernel_free, [file]
520
           mov eax, [file2]
520
           mov eax, [file2]
521
           mov ebx, [file_size]
521
           mov ebx, [file_size]
522
.exit:
522
.exit:
523
           push eax
523
           push eax
524
           lea edi, [eax+ebx]     ;cleanup remain space
524
           lea edi, [eax+ebx]     ;cleanup remain space
525
           mov ecx, 4096          ;from file end
525
           mov ecx, 4096          ;from file end
526
           and ebx, 4095
526
           and ebx, 4095
527
           sub ecx, ebx
527
           sub ecx, ebx
528
           xor eax, eax
528
           xor eax, eax
529
           cld
529
           cld
530
           rep stosb
530
           rep stosb
531
           mov ebx, [file_size]
531
           mov ebx, [file_size]
532
           pop eax
532
           pop eax
533
           ret
533
           ret
534
.cleanup:
534
.cleanup:
535
           stdcall kernel_free, [file]
535
           stdcall kernel_free, [file]
536
.fail:
536
.fail:
537
           xor eax, eax
537
           xor eax, eax
538
           xor ebx, ebx
538
           xor ebx, ebx
539
           ret
539
           ret
540
endp
540
endp
541
 
541
 
542
align 4
542
align 4
543
proc get_proc_ex stdcall, proc_name:dword, imports:dword
543
proc get_proc_ex stdcall, proc_name:dword, imports:dword
544
 
544
 
545
.look_up:
545
.look_up:
546
           mov edx, [imports]
546
           mov edx, [imports]
547
           test edx, edx
547
           test edx, edx
548
           jz .end
548
           jz .end
549
           mov edx, [edx]
549
           mov edx, [edx]
550
           test edx, edx
550
           test edx, edx
551
           jz .end
551
           jz .end
552
.next:
552
.next:
553
           mov eax, [edx]
553
           mov eax, [edx]
554
           test eax, eax
554
           test eax, eax
555
           jz .next_table
555
           jz .next_table
556
 
556
 
557
           push edx
557
           push edx
558
           stdcall strncmp, eax, [proc_name], 16
558
           stdcall strncmp, eax, [proc_name], 16
559
           pop edx
559
           pop edx
560
           test eax, eax
560
           test eax, eax
561
           jz .ok
561
           jz .ok
562
 
562
 
563
           add edx,8
563
           add edx,8
564
           jmp .next
564
           jmp .next
565
.next_table:
565
.next_table:
566
           add [imports], 4
566
           add [imports], 4
567
           jmp .look_up
567
           jmp .look_up
568
.ok:
568
.ok:
569
           mov eax, [edx+4]
569
           mov eax, [edx+4]
570
           ret
570
           ret
571
.end:
571
.end:
572
           xor eax, eax
572
           xor eax, eax
573
           ret
573
           ret
574
endp
574
endp
575
 
575
 
576
align 4
576
align 4
577
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
577
proc fix_coff_symbols stdcall, sec:dword, symbols:dword,\
578
                      sym_count:dword, strings:dword, imports:dword
578
                      sym_count:dword, strings:dword, imports:dword
579
           locals
579
           locals
580
             retval dd ?
580
             retval dd ?
581
           endl
581
           endl
582
 
582
 
583
           mov edi, [symbols]
583
           mov edi, [symbols]
584
           mov [retval], 1
584
           mov [retval], 1
585
.fix:
585
.fix:
586
           movzx ebx, [edi+CSYM.SectionNumber]
586
           movzx ebx, [edi+CSYM.SectionNumber]
587
           test ebx, ebx
587
           test ebx, ebx
588
           jnz .internal
588
           jnz .internal
589
           mov eax, dword [edi+CSYM.Name]
589
           mov eax, dword [edi+CSYM.Name]
590
           test eax, eax
590
           test eax, eax
591
           jnz @F
591
           jnz @F
592
 
592
 
593
           mov edi, [edi+4]
593
           mov edi, [edi+4]
594
           add edi, [strings]
594
           add edi, [strings]
595
@@:
595
@@:
596
           push edi
596
           push edi
597
           stdcall get_proc_ex, edi,[imports]
597
           stdcall get_proc_ex, edi,[imports]
598
           pop edi
598
           pop edi
599
 
599
 
600
           xor ebx, ebx
600
           xor ebx, ebx
601
           test eax, eax
601
           test eax, eax
602
           jnz @F
602
           jnz @F
603
 
603
 
604
           mov esi, msg_unresolved
604
           mov esi, msg_unresolved
605
           call sys_msg_board_str
605
           call sys_msg_board_str
606
           mov esi, edi
606
           mov esi, edi
607
           call sys_msg_board_str
607
           call sys_msg_board_str
608
           mov esi, msg_CR
608
           mov esi, msg_CR
609
           call sys_msg_board_str
609
           call sys_msg_board_str
610
 
610
 
611
           mov [retval],0
611
           mov [retval],0
612
@@:
612
@@:
613
           mov edi, [symbols]
613
           mov edi, [symbols]
614
           mov [edi+CSYM.Value], eax
614
           mov [edi+CSYM.Value], eax
615
           jmp .next
615
           jmp .next
616
.internal:
616
.internal:
617
           dec ebx
617
           dec ebx
618
           shl ebx, 3
618
           shl ebx, 3
619
           lea ebx, [ebx+ebx*4]
619
           lea ebx, [ebx+ebx*4]
620
           add ebx, [sec]
620
           add ebx, [sec]
621
 
621
 
622
           mov eax, [ebx+CFS.VirtualAddress]
622
           mov eax, [ebx+CFS.VirtualAddress]
623
           add [edi+CSYM.Value], eax
623
           add [edi+CSYM.Value], eax
624
.next:
624
.next:
625
           add edi, CSYM_SIZE
625
           add edi, CSYM_SIZE
626
           mov [symbols], edi
626
           mov [symbols], edi
627
           dec [sym_count]
627
           dec [sym_count]
628
           jnz .fix
628
           jnz .fix
629
           mov eax, [retval]
629
           mov eax, [retval]
630
           ret
630
           ret
631
endp
631
endp
632
 
632
 
633
align 4
633
align 4
634
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
634
proc fix_coff_relocs stdcall, coff:dword, sec:dword, sym:dword
635
	   locals
635
	   locals
636
             n_sec     dd ?
636
             n_sec     dd ?
637
	   endl
637
	   endl
638
 
638
 
639
           mov eax, [coff]
639
           mov eax, [coff]
640
           movzx ebx, [eax+CFH.nSections]
640
           movzx ebx, [eax+CFH.nSections]
641
           mov [n_sec], ebx
641
           mov [n_sec], ebx
642
.fix_sec:
642
.fix_sec:
643
           mov esi, [sec]
643
           mov esi, [sec]
644
	   mov edi, [esi+CFS.PtrReloc]
644
	   mov edi, [esi+CFS.PtrReloc]
645
           add edi, [coff]
645
           add edi, [coff]
646
 
646
 
647
           movzx ecx, [esi+CFS.NumReloc]
647
           movzx ecx, [esi+CFS.NumReloc]
648
           test ecx, ecx
648
           test ecx, ecx
649
           jz .next
649
           jz .next
650
.next_reloc:
650
.next_reloc:
651
	   mov ebx, [edi+CRELOC.SymIndex]
651
	   mov ebx, [edi+CRELOC.SymIndex]
652
	   add ebx,ebx
652
	   add ebx,ebx
653
	   lea ebx,[ebx+ebx*8]
653
	   lea ebx,[ebx+ebx*8]
654
           add ebx, [sym]
654
           add ebx, [sym]
655
 
655
 
656
           mov edx, [ebx+CSYM.Value]
656
           mov edx, [ebx+CSYM.Value]
657
 
657
 
658
           cmp [edi+CRELOC.Type], 6
658
           cmp [edi+CRELOC.Type], 6
659
           je .dir_32
659
           je .dir_32
660
 
660
 
661
           cmp [edi+CRELOC.Type], 20
661
           cmp [edi+CRELOC.Type], 20
662
           jne .next_reloc
662
           jne .next_reloc
663
.rel_32:
663
.rel_32:
664
	   mov eax, [edi+CRELOC.VirtualAddress]
664
	   mov eax, [edi+CRELOC.VirtualAddress]
665
           add eax, [esi+CFS.VirtualAddress]
665
           add eax, [esi+CFS.VirtualAddress]
666
           sub edx, eax
666
           sub edx, eax
667
           sub edx, 4
667
           sub edx, 4
668
           jmp .fix
668
           jmp .fix
669
.dir_32:
669
.dir_32:
670
	   mov eax, [edi+CRELOC.VirtualAddress]
670
	   mov eax, [edi+CRELOC.VirtualAddress]
671
           add eax, [esi+CFS.VirtualAddress]
671
           add eax, [esi+CFS.VirtualAddress]
672
.fix:
672
.fix:
673
           add [eax], edx
673
           add [eax], edx
674
           add edi, 10
674
           add edi, 10
675
           dec ecx
675
           dec ecx
676
           jnz .next_reloc
676
           jnz .next_reloc
677
.next:
677
.next:
678
           add [sec], COFF_SECTION_SIZE
678
           add [sec], COFF_SECTION_SIZE
679
           dec [n_sec]
679
           dec [n_sec]
680
           jnz .fix_sec
680
           jnz .fix_sec
681
.exit:
681
.exit:
682
	   ret
682
	   ret
683
endp
683
endp
684
 
684
 
685
align 4
685
align 4
686
proc load_driver stdcall, driver_name:dword
686
proc load_driver stdcall, driver_name:dword
687
           locals
687
           locals
688
             coff      dd ?
688
             coff      dd ?
689
             sym       dd ?
689
             sym       dd ?
690
             strings   dd ?
690
             strings   dd ?
691
             img_size  dd ?
691
             img_size  dd ?
692
             img_base  dd ?
692
             img_base  dd ?
693
             start     dd ?
693
             start     dd ?
694
 
694
 
695
             exports   dd ?   ;fake exports table
695
             exports   dd ?   ;fake exports table
696
                       dd ?
696
                       dd ?
697
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
697
             file_name rb 14+16+4+1      ; '/rd/1/drivers/.obj'
698
           endl
698
           endl
699
 
699
 
700
        lea     edx, [file_name]
700
        lea     edx, [file_name]
701
        mov     dword [edx], '/rd/'
701
        mov     dword [edx], '/rd/'
702
        mov     dword [edx+4], '1/dr'
702
        mov     dword [edx+4], '1/dr'
703
        mov     dword [edx+8], 'iver'
703
        mov     dword [edx+8], 'iver'
704
        mov     word [edx+12], 's/'
704
        mov     word [edx+12], 's/'
705
        mov     esi, [driver_name]
705
        mov     esi, [driver_name]
706
        lea     edi, [edx+14]
706
        lea     edi, [edx+14]
707
        mov     ecx, 16
707
        mov     ecx, 16
708
@@:
708
@@:
709
        lodsb
709
        lodsb
710
        test    al, al
710
        test    al, al
711
        jz      @f
711
        jz      @f
712
        stosb
712
        stosb
713
        loop    @b
713
        loop    @b
714
@@:
714
@@:
715
        mov     dword [edi], '.obj'
715
        mov     dword [edi], '.obj'
716
        mov     byte [edi+4], 0
716
        mov     byte [edi+4], 0
717
           stdcall load_file, edx
717
           stdcall load_file, edx
718
 
718
 
719
           test eax, eax
719
           test eax, eax
720
           jz .exit
720
           jz .exit
721
 
721
 
722
           mov [coff], eax
722
           mov [coff], eax
723
 
723
 
724
           movzx ecx, [eax+CFH.nSections]
724
           movzx ecx, [eax+CFH.nSections]
725
           xor ebx, ebx
725
           xor ebx, ebx
726
 
726
 
727
           lea edx, [eax+20]
727
           lea edx, [eax+20]
728
@@:
728
@@:
729
           add ebx, [edx+CFS.SizeOfRawData]
729
           add ebx, [edx+CFS.SizeOfRawData]
730
           add ebx, 15
730
           add ebx, 15
731
           and ebx, not 15
731
           and ebx, not 15
732
           add edx, COFF_SECTION_SIZE
732
           add edx, COFF_SECTION_SIZE
733
           dec ecx
733
           dec ecx
734
           jnz @B
734
           jnz @B
735
           mov [img_size], ebx
735
           mov [img_size], ebx
736
 
736
 
737
           stdcall kernel_alloc, ebx
737
           stdcall kernel_alloc, ebx
738
           test eax, eax
738
           test eax, eax
739
           jz .fail
739
           jz .fail
740
           mov [img_base], eax
740
           mov [img_base], eax
741
 
741
 
742
           mov edi, eax
742
           mov edi, eax
743
           xor eax, eax
743
           xor eax, eax
744
           mov ecx, [img_size]
744
           mov ecx, [img_size]
745
           add ecx, 4095
745
           add ecx, 4095
746
           and ecx, not 4095
746
           and ecx, not 4095
747
           shr ecx, 2
747
           shr ecx, 2
748
           cld
748
           cld
749
           rep stosd
749
           rep stosd
750
 
750
 
751
           mov edx, [coff]
751
           mov edx, [coff]
752
           movzx ebx, [edx+CFH.nSections]
752
           movzx ebx, [edx+CFH.nSections]
753
           mov edi, [img_base]
753
           mov edi, [img_base]
754
           lea eax, [edx+20]
754
           lea eax, [edx+20]
755
@@:
755
@@:
756
           mov [eax+CFS.VirtualAddress], edi
756
           mov [eax+CFS.VirtualAddress], edi
757
           mov esi, [eax+CFS.PtrRawData]
757
           mov esi, [eax+CFS.PtrRawData]
758
           test esi, esi
758
           test esi, esi
759
           jnz .copy
759
           jnz .copy
760
           add edi, [eax+CFS.SizeOfRawData]
760
           add edi, [eax+CFS.SizeOfRawData]
761
           jmp .next
761
           jmp .next
762
.copy:
762
.copy:
763
           add esi, edx
763
           add esi, edx
764
           mov ecx, [eax+CFS.SizeOfRawData]
764
           mov ecx, [eax+CFS.SizeOfRawData]
765
           cld
765
           cld
766
           rep movsb
766
           rep movsb
767
.next:
767
.next:
768
           add edi, 15
768
           add edi, 15
769
           and edi, not 15
769
           and edi, not 15
770
           add eax, COFF_SECTION_SIZE
770
           add eax, COFF_SECTION_SIZE
771
           dec ebx
771
           dec ebx
772
           jnz @B
772
           jnz @B
773
 
773
 
774
           mov ebx, [edx+CFH.pSymTable]
774
           mov ebx, [edx+CFH.pSymTable]
775
           add ebx, edx
775
           add ebx, edx
776
           mov [sym], ebx
776
           mov [sym], ebx
777
           mov ecx, [edx+CFH.nSymbols]
777
           mov ecx, [edx+CFH.nSymbols]
778
           add ecx,ecx
778
           add ecx,ecx
779
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
779
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
780
           add ecx, [sym]
780
           add ecx, [sym]
781
           mov [strings], ecx
781
           mov [strings], ecx
782
 
782
 
783
           lea ebx, [exports]
783
           lea ebx, [exports]
784
           mov dword [ebx], kernel_export
784
           mov dword [ebx], kernel_export
785
           mov dword [ebx+4], 0
785
           mov dword [ebx+4], 0
786
           lea eax, [edx+20]
786
           lea eax, [edx+20]
787
 
787
 
788
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
788
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
789
                                     [strings], ebx
789
                                     [strings], ebx
790
           test eax, eax
790
           test eax, eax
791
           jz .link_fail
791
           jz .link_fail
792
 
792
 
793
           mov ebx, [coff]
793
           mov ebx, [coff]
794
           add ebx, 20
794
           add ebx, 20
795
           stdcall fix_coff_relocs, [coff], ebx, [sym]
795
           stdcall fix_coff_relocs, [coff], ebx, [sym]
796
 
796
 
797
           mov ebx, [coff]
797
           mov ebx, [coff]
798
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
798
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szVersion
799
           test eax, eax
799
           test eax, eax
800
           jz .link_fail
800
           jz .link_fail
801
 
801
 
802
           mov eax, [eax]
802
           mov eax, [eax]
803
           shr eax, 16
803
           shr eax, 16
804
           cmp eax, DRV_COMPAT
804
           cmp eax, DRV_COMPAT
805
           jb .ver_fail
805
           jb .ver_fail
806
 
806
 
807
           cmp eax, DRV_CURRENT
807
           cmp eax, DRV_CURRENT
808
           ja .ver_fail
808
           ja .ver_fail
809
 
809
 
810
           mov ebx, [coff]
810
           mov ebx, [coff]
811
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
811
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szSTART
812
           mov [start], eax
812
           mov [start], eax
813
 
813
 
814
           stdcall kernel_free, [coff]
814
           stdcall kernel_free, [coff]
815
 
815
 
816
           mov ebx, [start]
816
           mov ebx, [start]
817
           stdcall ebx, DRV_ENTRY
817
           stdcall ebx, DRV_ENTRY
818
           test eax, eax
818
           test eax, eax
819
           jnz .ok
819
           jnz .ok
820
 
820
 
821
           stdcall kernel_free, [img_base]
821
           stdcall kernel_free, [img_base]
822
           xor eax, eax
822
           xor eax, eax
823
           ret
823
           ret
824
.ok:
824
.ok:
825
           mov ebx, [img_base]
825
           mov ebx, [img_base]
826
           mov [eax+SRV.base], ebx
826
           mov [eax+SRV.base], ebx
827
           mov ecx, [start]
827
           mov ecx, [start]
828
           mov [eax+SRV.entry], ecx
828
           mov [eax+SRV.entry], ecx
829
           ret
829
           ret
830
 
830
 
831
.ver_fail:
831
.ver_fail:
832
           mov esi, msg_CR
832
           mov esi, msg_CR
833
           call sys_msg_board_str
833
           call sys_msg_board_str
834
           mov esi, [driver_name]
834
           mov esi, [driver_name]
835
           call sys_msg_board_str
835
           call sys_msg_board_str
836
           mov esi, msg_CR
836
           mov esi, msg_CR
837
           call sys_msg_board_str
837
           call sys_msg_board_str
838
           mov esi, msg_version
838
           mov esi, msg_version
839
           call sys_msg_board_str
839
           call sys_msg_board_str
840
           mov esi, msg_www
840
           mov esi, msg_www
841
           call sys_msg_board_str
841
           call sys_msg_board_str
842
           jmp .cleanup
842
           jmp .cleanup
843
 
843
 
844
.link_fail:
844
.link_fail:
845
           mov esi, msg_module
845
           mov esi, msg_module
846
           call sys_msg_board_str
846
           call sys_msg_board_str
847
           mov esi, [driver_name]
847
           mov esi, [driver_name]
848
           call sys_msg_board_str
848
           call sys_msg_board_str
849
           mov esi, msg_CR
849
           mov esi, msg_CR
850
           call sys_msg_board_str
850
           call sys_msg_board_str
851
.cleanup:
851
.cleanup:
852
           stdcall kernel_free,[img_base]
852
           stdcall kernel_free,[img_base]
853
.fail:
853
.fail:
854
           stdcall kernel_free, [coff]
854
           stdcall kernel_free, [coff]
855
.exit:
855
.exit:
856
           xor eax, eax
856
           xor eax, eax
857
           ret
857
           ret
858
endp
858
endp
859
 
859
 
860
align 4
860
align 4
861
proc load_library stdcall, file_name:dword
861
proc load_library stdcall, file_name:dword
862
           locals
862
           locals
863
             coff      dd ?
863
             coff      dd ?
864
             sym       dd ?
864
             sym       dd ?
865
             strings   dd ?
865
             strings   dd ?
866
             img_size  dd ?
866
             img_size  dd ?
867
             img_base  dd ?
867
             img_base  dd ?
868
             exports   dd ?
868
             exports   dd ?
869
           endl
869
           endl
870
 
870
 
871
           cli
871
           cli
872
 
872
 
873
           stdcall load_file, [file_name]
873
           stdcall load_file, [file_name]
874
           test eax, eax
874
           test eax, eax
875
           jz .fail
875
           jz .fail
876
 
876
 
877
           mov [coff], eax
877
           mov [coff], eax
878
           movzx ecx, [eax+CFH.nSections]
878
           movzx ecx, [eax+CFH.nSections]
879
           xor ebx, ebx
879
           xor ebx, ebx
880
 
880
 
881
           lea edx, [eax+20]
881
           lea edx, [eax+20]
882
@@:
882
@@:
883
           add ebx, [edx+CFS.SizeOfRawData]
883
           add ebx, [edx+CFS.SizeOfRawData]
884
           add ebx, 15
884
           add ebx, 15
885
           and ebx, not 15
885
           and ebx, not 15
886
           add edx, COFF_SECTION_SIZE
886
           add edx, COFF_SECTION_SIZE
887
           dec ecx
887
           dec ecx
888
           jnz @B
888
           jnz @B
889
           mov [img_size], ebx
889
           mov [img_size], ebx
890
 
890
 
891
           call init_heap
891
           call init_heap
892
           stdcall user_alloc, [img_size]
892
           stdcall user_alloc, [img_size]
893
 
893
 
894
           test eax, eax
894
           test eax, eax
895
           jz .fail
895
           jz .fail
896
           mov [img_base], eax
896
           mov [img_base], eax
897
 
897
 
898
           mov edx, [coff]
898
           mov edx, [coff]
899
           movzx ebx, [edx+CFH.nSections]
899
           movzx ebx, [edx+CFH.nSections]
900
           mov edi, [img_base]
900
           mov edi, [img_base]
901
           lea eax, [edx+20]
901
           lea eax, [edx+20]
902
@@:
902
@@:
903
           mov [eax+CFS.VirtualAddress], edi
903
           mov [eax+CFS.VirtualAddress], edi
904
           mov esi, [eax+CFS.PtrRawData]
904
           mov esi, [eax+CFS.PtrRawData]
905
           test esi, esi
905
           test esi, esi
906
           jnz .copy
906
           jnz .copy
907
           add edi, [eax+CFS.SizeOfRawData]
907
           add edi, [eax+CFS.SizeOfRawData]
908
           jmp .next
908
           jmp .next
909
.copy:
909
.copy:
910
           add esi, edx
910
           add esi, edx
911
           add edi, new_app_base
911
           add edi, new_app_base
912
           mov ecx, [eax+CFS.SizeOfRawData]
912
           mov ecx, [eax+CFS.SizeOfRawData]
913
           cld
913
           cld
914
           rep movsb
914
           rep movsb
915
.next:
915
.next:
916
           add edi, 15-new_app_base
916
           add edi, 15-new_app_base
917
           and edi, not 15
917
           and edi, not 15
918
           add eax, COFF_SECTION_SIZE
918
           add eax, COFF_SECTION_SIZE
919
           dec ebx
919
           dec ebx
920
           jnz @B
920
           jnz @B
921
 
921
 
922
           mov ebx, [edx+CFH.pSymTable]
922
           mov ebx, [edx+CFH.pSymTable]
923
           add ebx, edx
923
           add ebx, edx
924
           mov [sym], ebx
924
           mov [sym], ebx
925
           mov ecx, [edx+CFH.nSymbols]
925
           mov ecx, [edx+CFH.nSymbols]
926
           add ecx,ecx
926
           add ecx,ecx
927
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
927
           lea ecx,[ecx+ecx*8] ;ecx*=18 = nSymbols*CSYM_SIZE
928
           add ecx, [sym]
928
           add ecx, [sym]
929
           mov [strings], ecx
929
           mov [strings], ecx
930
 
930
 
931
           lea eax, [edx+20]
931
           lea eax, [edx+20]
932
 
932
 
933
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
933
           stdcall fix_coff_symbols, eax, [sym], [edx+CFH.nSymbols],\
934
                                     [strings], dword 0
934
                                     [strings], dword 0
935
           test eax, eax
935
           test eax, eax
936
           jnz @F
936
           jnz @F
937
 
937
 
938
@@:
938
@@:
939
           mov edx, [coff]
939
           mov edx, [coff]
940
           movzx ebx, [edx+CFH.nSections]
940
           movzx ebx, [edx+CFH.nSections]
941
           mov edi, new_app_base
941
           mov edi, new_app_base
942
           lea eax, [edx+20]
942
           lea eax, [edx+20]
943
@@:
943
@@:
944
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
944
           add [eax+CFS.VirtualAddress], edi  ;patch user space offset
945
           add eax, COFF_SECTION_SIZE
945
           add eax, COFF_SECTION_SIZE
946
           dec ebx
946
           dec ebx
947
           jnz @B
947
           jnz @B
948
 
948
 
949
           add edx, 20
949
           add edx, 20
950
           stdcall fix_coff_relocs, [coff], edx, [sym]
950
           stdcall fix_coff_relocs, [coff], edx, [sym]
951
 
951
 
952
           mov ebx, [coff]
952
           mov ebx, [coff]
953
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
953
           stdcall get_coff_sym,[sym],[ebx+CFH.nSymbols],szEXPORTS
954
           mov [exports], eax
954
           mov [exports], eax
955
 
955
 
956
           stdcall kernel_free, [coff]
956
           stdcall kernel_free, [coff]
957
           mov eax, [exports]
957
           mov eax, [exports]
958
           ret
958
           ret
959
.fail:
959
.fail:
960
           xor eax, eax
960
           xor eax, eax
961
           ret
961
           ret
962
endp
962
endp
963
 
963
 
964
align 4
964
align 4
965
proc stop_all_services
965
proc stop_all_services
966
 
966
 
967
           mov edx, [srv.fd]
967
           mov edx, [srv.fd]
968
.next:
968
.next:
969
           cmp edx,  srv.fd-SRV_FD_OFFSET
969
           cmp edx,  srv.fd-SRV_FD_OFFSET
970
           je .done
970
           je .done
971
           cmp [edx+SRV.magic], ' SRV'
971
           cmp [edx+SRV.magic], ' SRV'
972
           jne .next
972
           jne .next
973
           cmp [edx+SRV.size], SRV_SIZE
973
           cmp [edx+SRV.size], SRV_SIZE
974
           jne .next
974
           jne .next
975
           mov ebx, [edx+SRV.entry]
975
           mov ebx, [edx+SRV.entry]
976
           mov edx, [edx+SRV.fd]
976
           mov edx, [edx+SRV.fd]
977
           push edx
977
           push edx
978
           stdcall ebx, dword -1
978
           stdcall ebx, dword -1
979
           pop edx
979
           pop edx
980
           jmp .next
980
           jmp .next
981
.done:
981
.done:
982
           ret
982
           ret
983
endp
983
endp
984
 
984
 
985
; param
985
; param
986
;  eax= size
986
;  eax= size
987
;  ebx= pid
987
;  ebx= pid
988
 
988
 
989
align 4
989
align 4
990
create_kernel_object:
990
create_kernel_object:
991
 
991
 
992
           push ebx
992
           push ebx
993
           call malloc
993
           call malloc
994
           pop ebx
994
           pop ebx
995
           test eax, eax
995
           test eax, eax
996
           jz .fail
996
           jz .fail
997
 
997
 
998
           mov ecx,[CURRENT_TASK]
998
           mov ecx,[CURRENT_TASK]
999
           shl ecx,8
999
           shl ecx,8
1000
           add ecx, PROC_BASE+APP_OBJ_OFFSET
1000
           add ecx, PROC_BASE+APP_OBJ_OFFSET
1001
 
1001
 
1002
           pushfd
1002
           pushfd
1003
           cli
1003
           cli
1004
           mov edx, [ecx+APPOBJ.fd]
1004
           mov edx, [ecx+APPOBJ.fd]
1005
           mov [eax+APPOBJ.fd], edx
1005
           mov [eax+APPOBJ.fd], edx
1006
           mov [eax+APPOBJ.bk], ecx
1006
           mov [eax+APPOBJ.bk], ecx
1007
           mov [eax+APPOBJ.pid], ebx
1007
           mov [eax+APPOBJ.pid], ebx
1008
 
1008
 
1009
           mov [ecx+APPOBJ.fd], eax
1009
           mov [ecx+APPOBJ.fd], eax
1010
           mov [edx+APPOBJ.bk], eax
1010
           mov [edx+APPOBJ.bk], eax
1011
           popfd
1011
           popfd
1012
.fail:
1012
.fail:
1013
           ret
1013
           ret
1014
 
1014
 
1015
; param
1015
; param
1016
;  eax= object
1016
;  eax= object
1017
 
1017
 
1018
align 4
1018
align 4
1019
destroy_kernel_object:
1019
destroy_kernel_object:
1020
 
1020
 
1021
           pushfd
1021
           pushfd
1022
           cli
1022
           cli
1023
           mov ebx, [eax+APPOBJ.fd]
1023
           mov ebx, [eax+APPOBJ.fd]
1024
           mov ecx, [eax+APPOBJ.bk]
1024
           mov ecx, [eax+APPOBJ.bk]
1025
           mov [ebx+APPOBJ.bk], ecx
1025
           mov [ebx+APPOBJ.bk], ecx
1026
           mov [ecx+APPOBJ.fd], ebx
1026
           mov [ecx+APPOBJ.fd], ebx
1027
           popfd
1027
           popfd
1028
 
1028
 
1029
           xor edx, edx        ;clear common header
1029
           xor edx, edx        ;clear common header
1030
           mov [eax], edx
1030
           mov [eax], edx
1031
           mov [eax+4], edx
1031
           mov [eax+4], edx
1032
           mov [eax+8], edx
1032
           mov [eax+8], edx
1033
           mov [eax+12], edx
1033
           mov [eax+12], edx
1034
           mov [eax+16], edx
1034
           mov [eax+16], edx
1035
 
1035
 
1036
           call free           ;release object memory
1036
           call free           ;release object memory
1037
           ret
1037
           ret
1038
 
1038
 
1039
 
1039
 
1040
;szSound        db 'SOUND',0
1040
;szSound        db 'SOUND',0
1041
;szInfinity     db 'INFINITY',0
1041
;szInfinity     db 'INFINITY',0
1042
szHwMouse      db 'ATI2D',0
1042
szHwMouse      db 'ATI2D',0
1043
 
1043
 
1044
szSTART        db 'START',0
1044
szSTART        db 'START',0
1045
szEXPORTS      db 'EXPORTS',0
1045
szEXPORTS      db 'EXPORTS',0
1046
szIMPORTS      db 'IMPORTS',0
1046
szIMPORTS      db 'IMPORTS',0
1047
 
1047
 
1048
msg_unresolved db 'unresolved ',0
1048
msg_unresolved db 'unresolved ',0
1049
msg_module     db 'in module ',0
1049
msg_module     db 'in module ',0
1050
msg_version    db 'incompatible driver version',13,10,0
1050
msg_version    db 'incompatible driver version',13,10,0
1051
msg_www        db 'please visit www.kolibrios.org',13,10,0
1051
msg_www        db 'please visit www.kolibrios.org',13,10,0
1052
msg_CR         db  13,10,0
1052
msg_CR         db  13,10,0
1053
 
1053
 
1054
align 4
1054
align 4
1055
create_cursor    dd 0
1055
create_cursor    dd 0
1056
set_hw_cursor    dd 0
1056
set_hw_cursor    dd 0
1057
hw_restore       dd 0
1057
hw_restore       dd 0