Ŀ
 Presents
  ڿĴ VMag, Issue 2, 1 June 1998
  

                  㧪 १ ணࠬ  .

                 ஡,      ।   ࠧࠡ稪
       TSR-ணࠬ  (Terminate & Stay Resident),  㧪
       ⮩  ணࠬ,  ᫨        ࠡ  ⯠. 
         ᮢ  y⨫   室 pp-p TSR
       (p祬,  p  ᠬ py p release),
       ⮬y      p⭮  pp  ᫥y  pyᬮp
       p⢠  ᠬpy,  ⮬y      py ⠭
        p.
              ᯮᮡ p㧪 TSR,    p
         p㧪 p p ᪥  p㧪  y-
       ᮡ  (pp,   hot-key). p ⮬ 室
       ⬥,   ᠬ p py ⮨  ⠭
       p墠祭  p  (  p⠢  ᮡ ⤥y
       py)    ᢮  ,    p⭮
       pp.
           ᢮      ⢨  p  ᮢ
       㭪  49h, p p ppp MCB (  筮 
       )    ᫮ (   ᯮᮡ) - p
       㭪 4Ch,  p  ᥡ,  p pp.
               ᠥ  ⮣,   p 室
       py,     ᥣ ᯮy p y ⮩
        pp    pp  p, p
       resident.com /unload_this_fucking_proogy!!! ;-),  ᫥ 祣
         p⭮   p  室 ⢨ 
       p,   py      y    p,    
       pᯮ,    py etc.
           p  ⮤ py:
       1. p㧪 p int 21h/ah=49h.
           㬭   砥, ᫨ p p㦠  p
       ᪠    .  ⠭  p,  ⥬
       ᢮  ,  ⠥ p.
----------------
ID              dw 1234h
Old_08h         dd ?
       ...
Unload:
                mov    ax,3508h                 ; y  y p 8
                int    21h
                cmp    word ptr es:[offset ID],1234
                jne    Fuck                     ; p 8 p墠祭 py
                                                ; TSR
                mov    dx,word ptr es:[offset Old_08h]
                mov    ds,word ptr es:[offset Old_08h+2]
                mov    ax,2508h
                int    21h                      ; ⠭ p p
                mov    ah,49h                   ;  ᢮ ,
                int    21h                      ; y p⮬.
       ...
Fuck:                                           ; py  ᯮᮡ
                                                ; 
----------------

       2. 㧪 p MCB.
             室,  ᫨ 㦭 p㧨 p 
       p稪  p⭮  pp뢠, ⮬y   뢠
       p   pp쭮   .  :  MCB  p⭮
       pp  砥    ᢮ ⥬ ᥭ  
       Owner 0.
----------------
       ...                                      ; yp p稪
                                                ; p⭮ pp뢠
                mov    ax,cs                    ; ᢮ :
                dec    ax                       ;  int 21h/ah=49h
                mov    ds,ax                    ; y稬 ᢮ MCB
                mov    word ptr ds:[1],0        ;   ⥯p ᢮
       ...
----------------

       3. 㧪 p int 21h/ah=4Ch.
           筮   㭪 뢠 p p襭 pp,
         p      ⮫쪮 ⥪ pp,  
         p㣨. , y ppy p,  p
         ⥪饬  PSP  (p  ᠭ  SDA  ᬥ饭 10h 
         afaik  뢠  PID - program ID), ᢮ 
       ,   Owner p ᮤp p ⮣ PSP, 
       ⥪騩  PSP    PSP  p⥫᪮ pp (ᠭ  PSP
       ⮬   ᬥ饭 16h), ⠭ p 22h, 23h,
       24h  p룠  p p (ᮤp  PSP ⮬ 
       ᬥ饭 0Ah). p p⨪:
           ⮡ p㧨 p pp, 㦭
----------------
;      1)   SDA[10h] PSP py pp
                mov    ax,5D06h                 ; y p SDA
                int    21h                      ; (Swappable Data Area)
                mov    ds:[si+10h],es           ; p,  PSP
                                                ; py ᮤp 
                                                ; es,  py饩 -  cs
;      2)   PSP[16h]  PSP p㦠饩 pp
                mov    es:[16h],cs
;      3)   PSP[0Ah] - p p  p㦠 pp
                mov     es:[0Ah],offset Return_Here
                mov     es:[0Ch],cs
                mov     ax,4C00h
                int     21h
Return_Here:
;      4) ᫥ 맮 int 21h 室 ⠭  pp
;      (pp  ⮫쪮  pp cs)
                push    cs cs cs
                pop     ds es ss
                mov     sp,offset _Stack
       ...
----------------
           p      ⠭  p.  쭮  p
       ppp   㦤,     ᫨  -  p,
        p⭮ p, p墠祭 p㣮 pp,
          p㧪         .  p  ⮣
       㦤 p㬥p  ⠪:

        p int x
             
       Ŀ             Ŀ           Ŀ
       pp A jmp(call) ->pp B jmp far ->oldint x
                               

         2 pp⭮ p p㧪 B  .
       1) ᫨  p  ᢮  p  int  x,    
       ⠥ ᮢp襭  p  A,  ⠪:

                                                       p int x
                                                             
       Ŀ             Ŀ           Ŀ
       pp A jmp(call) -> ᢮             oldint x
                               

       H祣 p譮, ⮫쪮 ᭮ p室 .

       2) ᫨    A  ᮤp  堭 ᠬp㧪  ᯮ
       ,    :  p  x  ⠭ pp B 
       oldint x, B p㦠;

                                                       p int x
                                                             
       Ŀ             Ŀ           Ŀ
       pp A jmp(call) -> ᢮             oldint x
                               

       p  x  ⠭  A  pp B  㧪 
        A,  B 㦥   :

                                  p int x
                                       
       Ŀ             Ŀ           Ŀ
        ᢮                ᢮             oldint x
                               

        - ᨬ.

           ⮬  p  pp,      -
       ""        楯窥    p稪       pp뢠,
       p墠뢠  p⮬,    ᫨  ,   p㧪 
       p.          p祭  
       -⠪ ᢮   ,  p⮬,
       ⠢  让  祪, p  p pp
       맮        p騩   p稪.         
       墠뢠  뢠  ⠭    אַ  
       ࠡ稪,           jmp  XXXX:YYYY  (XXXX  -
       ᥣ    ࠡ稪, YYYY - ᬥ饭), 祬 
         (     ᪮쪮) ᯮ  
       ,        ਭ,    祣  㦭
       ࠢ  MCB. :

        p int x            jmp far 
                                       
       Ŀ            Ŀ           Ŀ
       pp A jmp(call) ணࠬ B jmp far ->oldint x
                               

       ᫥ 㧪 B:

        p int x            jmp far Ŀ
                                                           
       Ŀ            Ŀ           Ŀ
       pp A jmp(call)  ᢮             oldint x
                               

       ᫥ 㧪 A:

        p int x > jmp far Ŀ
                                                             
       Ŀ             Ŀ           Ŀ
        ᢮                ᢮             oldint x
                               

           ᠬ  ண  B   㦥 ,   ⮫쪮
       祪,    ᮤন  jmp  far  oldint x (࠭ 
       룫拉    jmp  far   ࠡ稪 int x  ணࠬ B).
         㧪 ᫮ -  ⠭ ᠬ
          x         XXXX:YYYY      樨
       jmp  XXXX:YYYY  oldint x,   ⠥  .
         ⢥,  ᫨ "" 訬 ࠡ稪  ,
       ᫥ ।ᬮ  㧪.
----------------
;  es  ᥣ 襣 ࠡ稪 int 9,   ds - ᥣ ,
;  ᮤন jmp XXXX:YYYY
                mov     ax,word ptr es:[Old_09h]
                mov     word ptr ds:[1],ax
                mov     ax,word ptr es:[Old_09h+2]
                mov     word ptr ds:[3],ax
                int     49h
----------------
                                           (c) Denis Vechersky,
                                                2:450/63.215
