Subversion Repositories Kolibri OS

Rev

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

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