4. Исходный текст (1071513), страница 2
Текст из файла (страница 2)
276 0289 4C 43 41 53 45 44 52+ UnloadFailedMessage DB "LCASEDRV: Программа не может быть +
277 56 3A 20 CF F0 EE E3+ выгружена",10,13,"$"
278 F0 E0 EC EC E0 20 ED+
279 E5 20 EC EE E6 E5 F2+
280 20 E1 FB F2 FC 20 E2+
281 FB E3 F0 F3 E6 E5 ED+
282 E0 0A 0D 24
283
284
285
Turbo Assembler Version 4.1 15/12/06 06:17:45 Page 6
LCASEDRV.ASM
286 ;-----------------------------------------------------------------------------------
287 ; Конец резидентной части,начало процедуры инициализации
288 ;-----------------------------------------------------------------------------------
289 02B7 initialize proc near
290
291 ; проверить, не запущена ли программа с +
292 параметром /?
293 02B7 BE 0080 MOV SI,80h
294 02BA AC LODSB
295 02BB 3C 00 CMP AL,0
296 02BD 74 2B 90 90 JE init_nohelp
297 02C1 33 C9 XOR CX,CX
298 02C3 8A C8 MOV CL,AL
299 ; ищем символ "/" в строке параметров
300 02C5 init_do:
301 02C5 AC LODSB
302 02C6 3C 2F CMP AL,'/'
303 02C8 74 07 90 90 JE init_m1
304 02CC init_loop:
305 02CC E2 F7 LOOP init_do
306 02CE EB 1A 90 JMP init_nohelp
307 02D1 init_m1:
308 02D1 AC LODSB
309 02D2 3C 3F CMP AL,'?'
310 02D4 74 07 90 90 JE init_help
311 02D8 E2 F2 LOOP init_loop
312 02DA EB 0E 90 JMP init_nohelp
313 ; выводим справку и завершаем программу
314 02DD init_help:
315 02DD 0E PUSH CS
316 02DE 1F POP DS
317 02DF BE 0476r LEA SI,HelpMessage
318 02E2 E8 FF21 CALL PUTS
319 02E5 B8 4C00 MOV AX,4C00h
320 02E8 CD 21 INT 21h
321
322 02EA init_nohelp:
323 02EA 0E PUSH CS
324 02EB 1F POP DS
325 02EC BE 0368r MOV SI,offset StartMessage ; вывести информацию о программе
326 02EF E8 FF14 CALL PUTS
327 ; проверить, не +
328 установлена ли уже наша программа
329 02F2 B4 FF MOV AH,-1 ; сканирование номеров от +
330 FFh до 01h
331
332 02F4 more_mux:
333 02F4 B0 00 MOV AL,00h ; Функция 00h - проверка +
334 наличия программы
335 02F6 CD 2D INT 2Dh ; мультиплексорное +
336 прерывание AMIS,
337 02F8 3C 00 CMP AL,00h ; если идентификатор +
338 свободен,
339 02FA 75 08 90 90 JNE not_free
340 02FE 88 26 0181r MOV byte ptr mux_id,AH ; записать его номер прямо в код
341 ; обработчика+
342 INT 2Dh,
Turbo Assembler Version 4.1 15/12/06 06:17:45 Page 7
LCASEDRV.ASM
343 0302 EB 0C JMP short next_mux
344
345 0304 not_free:
346 0304 8E C2 MOV ES,DX ; иначе - ES:DI = адрес их +
347 сигнатуры
348 0306 BE 021Er MOV SI,offset amis_sign ; DS:SI = адрес нашей сигнатуры
349 0309 B9 0010 MOV CX,16 ; сравнить первые 16 байт,
350 030C F3> A6 REPE cmpsb
351 030E E3 4A JCXZ already_loaded ; если они не совпадают,
352
353 0310 next_mux:
354 0310 FE CC DEC AH ; перейти к +
355 следующему идентификатору,
356 0312 75 E0 JNZ more_mux ; пока это не 0
357
358 0314 free_mux_found:
359 0314 80 3E 0181r 00 CMP byte ptr mux_id,0 ; если мы ничего не +
360 записали,
361 0319 74 46 90 90 JE no_more_mux ; +
362 идентификаторы кончились
363 031D B8 352D MOV AX,352Dh
364 0320 CD 21 INT 21h ; получить +
365 адрес обработчика INT 2Dh
366 0322 89 1E 016Fr MOV word ptr old_int2Dh,BX ; и поместить его в old_int2Dh
367 0326 8C 06 0171r MOV word ptr old_int2Dh+2,ES
368 032A B8 3509 MOV AX,3509h
369 032D CD 21 INT 21h ; получить +
370 адрес обработчика INT 09h
371 032F 89 1E 0106r MOV word ptr old_int09h,BX ; и поместить его в old_int09h
372 0333 8C 06 0108r MOV word ptr old_int09h+2,ES
373 0337 B8 252D MOV AX,252Dh
374 033A BA 016Dr MOV DX,offset int2Dh_handler ; DS:DX - адрес нашего
375 033D CD 21 INT 21h ; +
376 обработчика 2Dh
377 033F B8 2509 MOV AX,2509h
378 0342 BA 0104r MOV DX,offset int09h_handler ; DS:DX - адрес нашего
379 0345 CD 21 INT 21h ; +
380 обработчика 09h
381 0347 B4 49 MOV AH,49h
382 0349 8E 06 002Cr MOV ES,word ptr envseg ; ES = сегментный адрес +
383 среды DOS
384 034D CD 21 INT 21h ; +
385 освободить память
386 034F BE 0451r MOV SI,offset SuccessMessage ; вывод строки об успешной
387 0352 E8 FEB1 CALL PUTS ; инсталляции
388 0355 BA 02B7r MOV DX,offset initialize ; DX - адрес первого байта за
389 ; концом резидентной части
390 0358 CD 27 INT 27h ; завершить+
391 выполнение, оставшись резидентом
392
393 ; сюда передается управление, если наша программа +
394 обнаружена в памяти
395 035A already_loaded:
396 035A BE 03CAr MOV SI,offset AlreadyLoadedMessage ; вывести сообщение об ошибке
397 035D E8 FEA6 CALL PUTS ; и завершиться +
398 нормально
399 0360 C3 RET
Turbo Assembler Version 4.1 15/12/06 06:17:45 Page 8
LCASEDRV.ASM
400 ; сюда передается управление, если все 255 функций +
401 мультиплексора заняты
402 ; резидентными программами
403 0361 no_more_mux:
404 0361 BE 03EAr MOV SI,offset NoMoreMuxMessage ; вывести сообщение об +
405 ошибке
406 0364 E8 FE9F CALL PUTS
407 0367 C3 RET
408
409
410
411 ;-----------------------------------------------------------------------------------
412 ;Данные инициализирующей части
413 ;-----------------------------------------------------------------------------------
414 ; текст, который выдает программа при +
415 запуске:
416 0368 C4 F0 E0 E9 E2 E5 F0+ StartMessage DB "Драйвер преобразования к нижнему регистру +
417 20 EF F0 E5 EE E1 F0+ v1.0",10,13
418 E0 E7 EE E2 E0 ED E8+
419 FF 20 EA 20 ED E8 E6+
420 ED E5 EC F3 20 F0 E5+
421 E3 E8 F1 F2 F0 F3 20+
422 76 31 2E 30 0A 0D
423 0398 C4 EB FF 20 E2 FB E3+ DB "Для выгрузки программы из +
424 F0 F3 E7 EA E8 20 EF+ памяти нажмите Ctrl+U",10,13,"$"
425 F0 EE E3 F0 E0 EC EC+
426 FB 20 E8 E7 20 EF E0+
427 EC FF F2 E8 20 ED E0+
428 E6 EC E8 F2 E5 20 43+
429 74 72 6C 2B 55 0A 0D+
430 24
431 ; текст, который выдает программа, если она+
432 уже загружена:
433 03CA CE F8 E8 E1 EA E0 3A+ AlreadyLoadedMessage DB "Ошибка: программа уже загружена$"
434 20 EF F0 EE E3 F0 E0+
435 EC EC E0 20 F3 E6 E5+
436 20 E7 E0 E3 F0 F3 E6+
437 E5 ED E0 24
438 ; текст, который выдает программа, если все+
439 функции мультиплексора заняты:
440 03EA CE F8 E8 E1 EA E0 3A+ NoMoreMuxMessage DB "Ошибка: слишком много резидентных программ+
441 20 F1 EB E8 F8 EA EE+ в памяти.",10,13
442 EC 20 EC ED EE E3 EE+
443 20 F0 E5 E7 E8 E4 E5+
444 ED F2 ED FB F5 20 EF+
445 F0 EE E3 F0 E0 EC EC+
446 20 E2 20 EF E0 EC FF+
447 F2 E8 2E 0A 0D
448 0420 C2 FB E3 F0 F3 E7 E8+ DB "Выгрузите ненужные +
449 F2 E5 20 ED E5 ED F3+ программы и повторите попытку$"
450 E6 ED FB E5 20 EF F0+
451 EE E3 F0 E0 EC EC FB+
452 20 E8 20 EF EE E2 F2+
453 EE F0 E8 F2 E5 20 EF+
454 EE EF FB F2 EA F3 24
455 ; текст, который выдает программа при +
456 успешной установке:
Turbo Assembler Version 4.1 15/12/06 06:17:45 Page 9
LCASEDRV.ASM
457 0451 CF F0 EE E3 F0 E0 EC+ SuccessMessage DB "Программа успешно загружена в память$"
458 EC E0 20 F3 F1 EF E5+
459 F8 ED EE 20 E7 E0 E3+
460 F0 F3 E6 E5 ED E0 20+
461 E2 20 EF E0 EC FF F2+
462 FC 24
463 0476 4C 43 41 53 45 44 52+ HelpMessage DB "LCASEDRV [/?]",10,13
464 56 20 5B 2F 3F 5D 0A+
465 0D
466 0485 20 20 20 2F 3F 20 20+ DB " /? Показать справку+
467 20 20 20 CF EE EA E0+ по работе с программой",10,13
468 E7 E0 F2 FC 20 F1 EF+
469 F0 E0 E2 EA F3 20 EF+
470 EE 20 F0 E0 E1 EE F2+
471 E5 20 F1 20 EF F0 EE+
472 E3 F0 E0 EC EC EE E9+
473 0A 0D
474 04B8 20 20 20 C4 E0 ED ED+ DB " Данная программа +
475 E0 FF 20 EF F0 EE E3+ предназначена для запрета ввода с клавиатуры заглавных",10,13
476 F0 E0 EC EC E0 20 EF+
477 F0 E5 E4 ED E0 E7 ED+
478 E0 F7 E5 ED E0 20 E4+
479 EB FF 20 E7 E0 EF F0+
480 E5 F2 E0 20 E2 E2 EE+
481 E4 E0 20 F1 20 EA EB+
482 E0 E2 E8 E0 F2 F3 F0+
483 FB 20 E7 E0 E3 EB E0+
484 E2 ED FB F5 0A 0D
485 0504 EB E0 F2 E8 ED F1 EA+ DB "латинских букв.",10,13
486 E8 F5 20 E1 F3 EA E2+
487 2E 0A 0D
488 0515 20 20 20 CF EE F1 EB+ DB " После запуска программа+
489 E5 20 E7 E0 EF F3 F1+ обрабатывает нажатия клавиш, и если пользователь",10,13
490 EA E0 20 EF F0 EE E3+
491 F0 E0 EC EC E0 20 EE+
492 E1 F0 E0 E1 E0 F2 FB+
493 E2 E0 E5 F2 20 ED E0+
494 E6 E0 F2 E8 FF 20 EA+
495 EB E0 E2 E8 F8 2C 20+
496 E8 20 E5 F1 EB E8 20+
497 EF EE EB FC E7 EE E2+
498 E0 F2 E5 EB FC 0A 0D
499 0562 EF EE EF FB F2 E0 E5+ DB "попытается ввести любую +
500 F2 F1 FF 20 E2 E2 E5+ заглавную латинскую букву, программа заменит ее",10,13
501 F1 F2 E8 20 EB FE E1+
502 F3 FE 20 E7 E0 E3 EB+
503 E0 E2 ED F3 FE 20 EB+
504 E0 F2 E8 ED F1 EA F3+
505 FE 20 E1 F3 EA E2 F3+
506 2C 20 EF F0 EE E3 F0+
507 E0 EC EC E0 20 E7 E0+
508 EC E5 ED E8 F2 20 E5+
509 E5 0A 0D
510 05AB ED E0 20 F2 E0 EA F3+ DB "на такую же, но +
511 FE 20 E6 E5 2C 20 ED+ строчную.",10,13
512 EE 20 F1 F2 F0 EE F7+
513 ED F3 FE 2E 0A 0D
Turbo Assembler Version 4.1 15/12/06 06:17:45 Page 10
LCASEDRV.ASM
514 05C6 CF F0 EE E3 F0 E0 EC+ DB "Программа выгружается из +
515 EC E0 20 E2 FB E3 F0+ оперативной памяти нажатием комбинации клавиш Ctrl+u/U",10,13,"$"
516 F3 E6 E0 E5 F2 F1 FF+
517 20 E8 E7 20 EE EF E5+
518 F0 E0 F2 E8 E2 ED EE+
519 E9 20 EF E0 EC FF F2+
520 E8 20 ED E0 E6 E0 F2+
521 E8 E5 EC 20 EA EE EC+
522 E1 E8 ED E0 F6 E8 E8+
523 20 EA EB E0 E2 E8 F8+
524 20 43 74 72 6C 2B 75+
525 2F 55 0A 0D 24
526 0618 initialize endp
527
528 end start
Turbo Assembler Version 4.1 15/12/06 06:17:45 Page 11
Symbol Table
Symbol Name Type Value Cref (defined at #)
??DATE Text "15/12/06"
??FILENAME Text "source "
??TIME Text "06:17:45"
??VERSION Number 040A
@32BIT Text 0 #9
@CODE Text DGROUP #9
@CODESIZE Text 0 #9
@CPU Text 0F0FH #11
@CURSEG Text _TEXT #10
@DATA Text DGROUP #9
@DATASIZE Text 0 #9
@FILENAME Text SOURCE
@INTERFACE Text 000H #9
@MODEL Text 1 #9
@STACK Text DGROUP #9
@WORDSIZE Text 4 #10 #11
ACTUAL_INT09H_HANDLER Near DGROUP:0116 22 #33
ACTUAL_INT2DH_HANDLER Near DGROUP:017F 94 #107
ALREADYLOADEDMESSAGE Byte DGROUP:03CA 396 #433
ALREADY_LOADED Near DGROUP:035A 351 #395
AMIS_HOOKLIST Byte DGROUP:0249 194 #245
AMIS_HOTKEYS Byte DGROUP:024F 199 #251
AMIS_SIGN Byte DGROUP:021E 148 #235 348
DONE Near DGROUP:0219 217 #221
ENVSEG Word DGROUP:002C #13 382
EXIT_09H_HANDLER Near DGROUP:0159 51 65 67 #72 79 83
FREE_MUX_FOUND Near DGROUP:0314 #358
HELPMESSAGE Byte DGROUP:0476 317 #463
HW_RESET2D Near DGROUP:016C #87 102
HW_RESET9 Near DGROUP:0103 #17 29
INITIALIZE Near DGROUP:02B7 16 #289 388
INIT_DO Near DGROUP:02C5 #300 305
INIT_HELP Near DGROUP:02DD 310 #314
INIT_LOOP Near DGROUP:02CC #304 311
INIT_M1 Near DGROUP:02D1 303 #307
INIT_NOHELP Near DGROUP:02EA 296 306 312 #322
INT09H_HANDLER Far DGROUP:0104 #21 246 378
INT2DH_HANDLER Far DGROUP:016D #93 248 374
INT2D_00 Near DGROUP:01B0 127 #143
INT2D_02 Near DGROUP:01BE 129 #153
INT2D_03 Near DGROUP:01F5 130 #187
INT2D_04 Near DGROUP:01F8 131 #192
INT2D_05 Near DGROUP:01FE 132 #196
INT2D_NO Near DGROUP:01BB 117 128 #150
ITS_US Near DGROUP:018B 111 #115
JUMPTABLE Word DGROUP:019B 124 #127
MORE_MUX Near DGROUP:02F4 #332 356
MUX_ID Byte DGROUP:0181 80 #110 340 359
NEXT_MUX Near DGROUP:0310 343 #353
NEXT_SYM Near DGROUP:020A #213 220
NOMOREMUXMESSAGE Byte DGROUP:03EA 404 #440
NOT_FREE Near DGROUP:0304 339 #345
NO_EXIT Near DGROUP:0147 56 58 #62
NO_MORE_MUX Near DGROUP:0361 361 #403
Turbo Assembler Version 4.1 15/12/06 06:17:45 Page 12
Symbol Table
OLD_INT09H Dword DGROUP:0106 #23 40 169 371 372
OLD_INT2DH Dword DGROUP:016F #96 113 172 366 367
PUTS Near DGROUP:0206 139 178 #208 318 326 387 397 406
QUITMESSAGE Byte DGROUP:0257 177 #268
START Near DGROUP:0100 #15 528
STARTMESSAGE Byte DGROUP:0368 325 #416
SUCCESSMESSAGE Byte DGROUP:0451 386 #457
UNLOAD Near DGROUP:015C 60 #77
UNLOADFAILEDMESSAGE Byte DGROUP:0289 138 #276
UNLOAD_FAILED Near DGROUP:01A7 #134 163 165
Groups & Segments Bit Size Align Combine Class Cref (defined at #)
DGROUP Group #9 9
_DATA 16 0000 Word Public DATA #9
_TEXT 16 0618 Word Public CODE #9 #10
13