Subversion Repositories Kolibri OS

Rev

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

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