резидентный скрин-сейвер

Тема в разделе "WASM.ASSEMBLER", создана пользователем Avoidik, 18 фев 2007.

  1. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    привет, нужна ваша помощь или подсказка, пишу для одного человека скрин-сейвер под дос, резидент, все сделал, но никак не могу доделать одну часть:

    при выходе из скрин-сейвера (при нажатии любой клавиши) мы должны ввести пароль, если пароль правильный, то скрин завершается, если неправильный, то не завершается (резидент остается в памяти в любом случае)

    вопрос в следующем: каким образом вывести надпись о вводе пароля (что-то вроде 'enter password:', 21h нельзя в обработчике юзать), считать пароль в буфер и проверить на правильность? help!

    Код (Text):
    1. ; -----------------------------------------------------------------
    2. ;
    3. ; resident screen-saver
    4. ;
    5. ; -----------------------------------------------------------------
    6.  
    7. org 100h
    8. use16
    9.  
    10.  
    11.   _start:
    12.     jmp _init
    13.  
    14.   ; constants
    15.  
    16.     shft_cnt    equ 37  ; ticks between screen shifts  37 = 2 sec
    17.     id      db "SCRSAVER_SIGN"
    18.     maxcount    dw 5465 ; timer ticks for delay 2186 = 2 min
    19.     old9_ofs    dw ?    ; old int 9 address
    20.     old9_seg    dw ?
    21.     old1C_ofs   dw ?    ; old int 1C address
    22.     old1C_seg   dw ?
    23.     old_tail    dw ?    ; keyboard buffer tail
    24.     off_flg     db 0    ; 1 = disable blanking  0 = normal operation
    25.     scr_offst   dw 0    ; offset for shifting screen
    26.     blank       db 0    ; 1 = 'blank' screen  0 = normal screen
    27.     turn_on     db 0    ; 1 = unblank screen  0 = nothing
    28.     count       dw 0    ; tick counter for blanking
    29.  
    30.   ; code
    31.  
    32.     ; keyboard hook
    33.  
    34.   _new9:
    35.     push    es ds ax cs
    36.     pop ds
    37.  
    38.     mov ax,40h
    39.     mov es,ax
    40.     mov ax,[es:1Ch]
    41.     mov [old_tail],ax
    42.     pushf
    43.     call    dword [old9_ofs]
    44.  
    45.     cmp [blank],0   ; check for blank screen
    46.     jnz _rest_scrn
    47.     mov [count],0   ; reset tick counter
    48.     jmp _exit_9
    49.  
    50.   _rest_scrn:           ; set flag to unblank screen
    51.     mov [turn_on],1
    52.     mov ax,[old_tail]   ; restore tail pointer to remove key from buffer
    53.     mov [es:1Ch],ax
    54.  
    55.   _exit_9:
    56.     pop ax ds es
    57.     iret
    58.  
    59.     ; timer hook
    60.  
    61.   _new1C:
    62.     sti         ; enable interrupts
    63.  
    64.     push    es ds dx ax cs
    65.     pop ds
    66.     mov ax,40h
    67.     mov es,ax
    68.     cmp [turn_on],0 ; check if flag set to restore screen
    69.     je  _if_blank   ; jump to check for blank screen if flag not set
    70.  
    71.   _no_key:
    72.     mov [turn_on],0 ; restore original video buffer start
    73.     mov [blank],0
    74.     mov ax,[es:4Eh] ; get bios video buffer start (bytes)
    75.     shr ax,1        ; convert to words
    76.     push    ax
    77.     jmp _do_crt     ; set crt controller
    78.  
    79.   _if_blank:
    80.     cmp [off_flg],0 ; exit if disabled
    81.     jne _exit_1C
    82.     cmp [blank],0   ; check if screen already blank
    83.     jne _chk_shift  ; if blank then jump to check if ready to shift
    84.  
    85.     inc [count]     ; screen not blank - check if time to blank
    86.     mov ax,[maxcount]
    87.     cmp [count],ax
    88.     jne _exit_1C    ; exit if not time to blank
    89.  
    90.     mov [blank],1   ; set blank screen flag
    91.     jmp _do_shift   ; shift screen
    92.  
    93.   _chk_shift:           ; if screen blank - shift every shft_cnt ticks
    94.     inc [count]
    95.     cmp [count],shft_cnt
    96.     jne _exit_1C    ; exit if not time to shift
    97.  
    98.   _do_shift:
    99.     mov ax,[scr_offst]  ; get our video buffer offset (words)
    100.     add ax,1003     ; shift 1003 words
    101.     and ax,7FFh     ; limit to first 4K of video buffer
    102.     mov [scr_offst],ax  ; save our new video buffer offset
    103.     mov dx,[es:4Eh] ; get bios video buffer start (bytes)
    104.     shr dx,1        ; convert to words
    105.     add ax,dx       ; add our offset
    106.     push    ax
    107.  
    108.   _do_crt:          ; set crt controller
    109.     mov dx,[es:63h] ; crt controller base address
    110.     mov al,12       ; access register 12
    111.     out dx,al
    112.     inc dx
    113.     pop ax      ; pop starting address
    114.     xchg    ah,al
    115.     out dx,al       ; write hi (start address) to register 12
    116.     dec dx
    117.     push    ax      ; push starting address
    118.     mov al,13       ; access register 13
    119.     out dx,al
    120.     inc dx
    121.     pop ax      ; pop starting address
    122.     xchg    ah,al
    123.     out dx,al       ; write lo (start address) to register 13
    124.     mov [count],0   ; reset tick counter
    125.  
    126.   _exit_1C:
    127.     pop ax dx ds es
    128.     jmp dword [cs:old1C_ofs]
    129.  
    130.     ; messages inside segment
    131.  
    132.   _init_junk:
    133.     szUsage     db "~ Resident screen-saver ~",13,10,13,10
    134.             db "Usage: screensaver.com [delay]",13,10
    135.             db " 0 disables screen-saver",13,10
    136.             db " 1-9 re-enables",13,10,13,10
    137.             db "Default delay is two minutes",13,10,24h
    138.     szDisableMsg    db "Resident screen-saver disabled",13,10,24h
    139.     szEnableMsg db "Resident screen-saver enabled",13,10,24h
    140.     szError1    db "Invalid command line parameter",13,10,24h
    141.     szError2    db "Screen-saver not in resident mode",13,10,24h
    142.  
    143.     ; initialization
    144.  
    145.   _init:
    146.     mov si,81h
    147.     mov dx,szError1 ; invalid command
    148.  
    149.   _parse_loop:          ; check for number on command line
    150.     lodsb
    151.     cmp al," "
    152.     je  _parse_loop ; skip spaces
    153.     cmp al,13
    154.     je  _end_parse  ; jump if no parameter
    155.  
    156.     cmp al,"9"
    157.     jg  _out_err    ; invalid parameter
    158.     cmp al,"0"
    159.     jl  _out_err    ; invalid parameter
    160.  
    161.     cmp al,"0"
    162.     jne _set_time
    163.     mov [off_flg],1 ; set disable flag
    164.  
    165.   _set_time:
    166.     mov ah,0
    167.     sub al,"0"
    168.     mov bx,1093
    169.     mul bx
    170.     mov [maxcount],ax
    171.  
    172.   _end_parse:
    173.     cld         ; search for a previous copy
    174.     mov word [_start],0 ; fingerprint
    175.     xor bx,bx       ; bx = start segment
    176.     mov ax,cs       ; ax = current segment
    177.     cmp ax,0A000h   ; assume first load if running in high memory
    178.     jae _no_copies
    179.  
    180.   _chk_prev:
    181.     inc bx      ; increment segment
    182.     cmp ax,bx       ; check if equals current segment
    183.     jne _next
    184.     mov bx,0A000h   ; if yes, move search to high memory
    185.  
    186.   _next:
    187.     cmp bx,0FFFFh   ; end search if end of memory reached
    188.     je  _no_copies
    189.     mov es,bx
    190.     mov si,_start
    191.     mov di,si
    192.     mov cx,16       ; compare first 16 bytes of each segment
    193.     repe    cmpsb
    194.     jne _chk_prev   ; repeat if no match
    195.  
    196.     mov ax,[maxcount]   ; copy found - set time for activation
    197.     mov [es:maxcount],ax
    198.     mov al,[off_flg]    ; change enable/disable flag
    199.     mov [es:off_flg],al
    200.     mov [es:count],0    ; reset tick count
    201.     mov dx,szEnableMsg  ; enabled
    202.     test    al,al
    203.     je  _out_msg    ; copy enabled - errorlevel = 0
    204.  
    205.     mov dx,szDisableMsg ; disabled
    206.     xor al,al       ; errorlevel = 0
    207.     jmp _out_msg    ; copy disabled
    208.  
    209.   _no_copies:
    210.     mov dx,szError2 ; not resident
    211.     cmp [off_flg],0
    212.     je  _install    ; ok to install
    213.  
    214.   _out_err:
    215.     mov al,1
    216.  
    217.   _out_msg:
    218.     mov ah,9        ; display message
    219.     int 21h
    220.     mov ah,4Ch      ; terminate with errorlevel = al
    221.     int 21h
    222.  
    223.   _install:         ; make program resident
    224.     mov ax,3509h    ; get old int 9 address
    225.     int 21h
    226.     mov ax,es
    227.     mov [old9_seg],ax   ; save old int 9 address  (keyboard)
    228.     mov [old9_ofs],bx
    229.  
    230.     mov ax,351Ch    ; get old int 1C address  (timer tick)
    231.     int 21h
    232.     mov ax,es
    233.     mov [old1C_seg],ax  ; save old int 1C address
    234.     mov [old1C_ofs],bx
    235.     mov dx,_new9    ; set int 9 to point to our code
    236.     mov ax,2509h
    237.     int 21h
    238.  
    239.     mov dx,_new1C   ; set int 1C to point to our code
    240.     mov ax,251Ch
    241.     int 21h
    242.  
    243.     mov dx,szUsage  ; usage
    244.     mov ah,9
    245.     int 21h     ; display message
    246.  
    247.     mov dx,(_init_junk-_start+256+16)/16
    248.     mov ax,3100h    ; terminate and stay resident
    249.     int 21h
    250.  
    251. ; eof
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а нафиг те дос. юзай прерывания биоса или вообще прямой вывод в видеобуфер.
    считывать с клавы так же
     
  3. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    про видеобуфер понятно, такая идея была и вроде работает, но непонятно про клаву
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да не вроде, а точно работает )

    а че непонятного то.. прерывание биоса для считывания символа. на крайняк общаться с контроллером через порты ввода-вывода
     
  5. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    А если клава USBшная? Более портабельно получится через буфер клавиатуры.
    Из Ralf Brown's Files:
    По Зубкову, 40:1A = адрес головы, +2 - адрес хвоста
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    10110111
    ну можно и так, конечно
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    То пофиг.
    Доступ к портам тоже эмулируется BIOS, даже если клавиатура USB.
    Если конечно эмуляция включена.
    А если не включена то USB клавиатура вообще работать не будет, и ты и в буфере ничего не получишь.
    Самый простой способ - int 16h
    Не надо сильно заморачиваться и в резиденте работать будет.
     
  8. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    спасибо за помощь, забыл что у меня книжки есть (оказывается), топик можно закрыть