home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / peknmp.zip / PEEKNMP.ASM next >
Assembly Source File  |  1994-03-01  |  7KB  |  249 lines

  1.         page    ,132
  2.         title   PEEKNMP - TSR to fix DosPeekNmp API call
  3.  
  4. cr      equ     0Dh
  5. lf      equ     0Ah
  6.  
  7. PDB_env equ     002Ch
  8.  
  9. comment ~ ===========================================================
  10.  
  11. 93May17, George L. Fulk, IBM Corp.
  12.  
  13. To generate a copy of the executeable TSR, enter the following:
  14.         masm peeknmp,,;
  15.         link peeknmp,;
  16.         exe2bin peeknmp.exe peeknmp.com
  17.  
  18. MicroSoft has done a very nasty thing.  Without telling anyone (except
  19. their own applications people) they have changed the specification on at
  20. least one named pipe call, DosPeekNmp.  The MicroSoft application MS-SQL
  21. is expecting the new specification.  This TSR program will convert the
  22. old specification to the new one.  I'm not 100% certain, but I believe
  23. MicroSoft may have done the same thing to a second named pipe call,
  24. DosQNmpHandState.  My test of MS-SQL did not show this API being used.
  25.  
  26. For legal purposes:
  27. This source code, and the resulting executable file, can be freely copied
  28. and distributed without royalty or payment.  Although I've tested this
  29. program and all tests have passed, the code is provided without warranty.
  30.  
  31. ===========================================================
  32.  
  33. 94Feb22 G.L.Fulk
  34. I've changed the source code for the service department.
  35. Changed from .COM to .EXE syntax, added logon message,
  36. added DOS device driver support.
  37.  
  38. =========================================================== ~
  39.  
  40. ;---------------------------------------
  41. ;The following are the IBM/MS standards for TSR programs.
  42. TSR_signature   equ     424Bh
  43. TSR_flag_first  equ     80h
  44.  
  45. TSR_int_entry   struc
  46.                 dw      10EBh           ;  jmp short past
  47. TSR_PrevAddr    dd      0
  48.                 dw      TSR_signature
  49. TSR_flags       db      0
  50. TSR_reset       db      0EBh,0          ;  jmp short reset (to far return)
  51.                 db      0CBh,6 dup (0)  ;  reserved
  52. TSR_int_entry   ends
  53. ;---------------------------------------
  54. DD_packet struc
  55.         db      ?
  56.         db      ?
  57. cmd     db      ?
  58. status  dw      ?
  59.         dq      ?
  60.         db      ?
  61. EndAddr dd      ?
  62. DD_packet ends
  63. Status_error    equ     8000h
  64. Status_done     equ     0100h
  65. ;---------------------------------------
  66.  
  67.         page
  68.  
  69. DOSSEG
  70.  
  71.  
  72. CSEG    SEGMENT BYTE PUBLIC 'CODE'
  73.         assume  cs:CSEG,ds:nothing,es:nothing,ss:nothing
  74.         org     0
  75.         dd      -1
  76.         dw      8000h
  77.         dw      strategy
  78. pInt    dw      interrupt
  79.         db      " PeekNmp"
  80.  
  81.         assume  cs:CSEG,ds:nothing,es:nothing,ss:nothing
  82.  
  83. RetAddr dd      ?                       ;used to save user's retn addr
  84.  
  85. ;------ Standard TSR entry
  86. Our_int21h TSR_int_entry <>
  87.  
  88. ;------ If it's not our call, pass it on.
  89.         cmp     ax,5F35h
  90.         je      DosPeekNmp
  91.         jmp     cs:[Our_int21h].TSR_PrevAddr
  92.  
  93. ;------ our hooked call
  94. DosPeekNmp:
  95. ;Stack: (3 words from INT command)
  96. ; flags    =ss:[sp]+4
  97. ; retn,seg =ss:[sp]+2
  98. ; retn,ofs =ss:[sp]+0
  99.  
  100.         pop     word ptr cs:[RetAddr]+0 ;save the user's return address
  101.         pop     word ptr cs:[RetAddr]+2
  102.  
  103.         call    cs:[Our_int21h].TSR_PrevAddr ;perform the old int 21h
  104.                                         ;all 3 words pop-ed off stack
  105.         jc      peek_failed             ;change only applies to successful call
  106.  
  107.         mov     di,ax                   ;New MS LAN Manager returns state in
  108.         mov     ax,0                    ;DI instead of AX, and rc=0 in AX now.
  109.                                         ;Successful call now determined by
  110.                                         ;AX=0 instead of clear carry flag.
  111. peek_failed:
  112.         jmp     cs:[RetAddr]            ;return to the user
  113. TSR_end_of_TSR label byte
  114. ;---------------------------------------
  115.  
  116.  
  117.         assume  cs:CSEG,ds:nothing,es:nothing,ss:nothing
  118. ReqHdr  dd      ?
  119. strategy proc   far
  120.         mov     word ptr cs:[ReqHdr]+0,bx
  121.         mov     word ptr cs:[ReqHdr]+2,es
  122.         ret
  123. strategy endp
  124.  
  125. TSR_interrupt proc far
  126.         push    ds
  127.         push    bx
  128.         LDS     BX,[ReqHdr]
  129.         mov     [bx].status,Status_error+Status_done+3
  130.         pop     bx
  131.         pop     ds
  132.         ret
  133. TSR_interrupt endp
  134.  
  135.  
  136. DD_end_of_TSR label byte
  137.  
  138.  
  139. interrupt proc  far
  140.         push    es
  141.         push    ds
  142.         push    dx
  143.         push    bx
  144.         push    ax
  145.         LDS     BX,cs:[ReqHdr]
  146.         mov     [bx].status,Status_error+Status_done+3
  147.         cmp     [bx].cmd,0
  148.         jnz     not_init
  149.         mov     [bx].status,Status_done
  150.         LES     DX,cs:[pEndTSR_DD]
  151.         mov     word ptr [bx].EndAddr+0,dx
  152.         mov     word ptr [bx].EndAddr+2,es
  153.         call    HookInt
  154.         mov     cs:[pInt],offset TSR_interrupt
  155.         LDS     dx,cs:[pBanner]
  156.         mov     ah,9
  157.         int     21h
  158. not_init:
  159.         pop     ax
  160.         pop     bx
  161.         pop     dx
  162.         pop     ds
  163.         pop     es
  164.         ret
  165. interrupt endp
  166.  
  167.         assume  cs:CSEG,ss:STACK,ds:nothing,es:nothing
  168.  
  169.  
  170. pEndTSR_TSR     dd      TSR_end_of_TSR
  171. pEndTSR_DD      dd      DD_end_of_TSR
  172. PDB             dw      ?
  173. pOur_int21h     dd      Our_int21h
  174. pBanner         dd      Banner
  175. Banner          db      cr,lf,"PEEKNMP v2.11 for OS/2 loaded.",cr,lf
  176. Banner_size     equ     $-Banner
  177.                 db      "$"
  178.  db "Please do not alter and distribute this program.  To add",cr,lf
  179.  db "enhancements contact IBM OS/2-WinAp support at (800)992-4777.",cr,lf,0
  180.  
  181. main    proc    far
  182.  
  183. ;------ save the PSP(PDB)
  184.         mov     cs:[PDB],es
  185.  
  186. ;------ sign on banner
  187.         LDS     DX,[pBanner]
  188.         assume  ds:nothing
  189.         mov     cx,Banner_size
  190.         mov     bx,1    ;standard out
  191.         mov     ah,40h
  192.         int     21h
  193.  
  194. ;------ hook int 21h vector
  195.         call    HookInt
  196.         assume  ds:nothing,es:nothing
  197.  
  198. ;------ free all our file handles
  199.         mov     bx,19
  200. NextClose:
  201.         mov     ah,3Eh
  202.         int     21h
  203.         dec     bx
  204.         jnz     NextClose
  205.  
  206. ;------ free our environment space
  207.         mov     es,cs:[PDB]
  208.         assume  es:nothing
  209.         mov     es,es:[PDB_env]
  210.         mov     ah,49h
  211.         int     21h
  212.  
  213. ;------ install as TSR (Terminate Stay Resident)
  214.         LDS     DX,[pEndTSR_TSR]
  215.         add     dx,15
  216.         mov     cx,4
  217.         shr     dx,cl
  218.         mov     ax,ds
  219.         sub     ax,cs:[PDB]
  220.         add     dx,ax
  221.         mov     ax,3100h
  222.         int     21h
  223.  
  224. main    endp
  225. ;---------------------------------------
  226.         assume  cs:CSEG,ds:nothing,es:nothing,ss:nothing
  227. HookInt proc    near
  228.         mov     ax,3521h
  229.         int     21h
  230.         assume  es:nothing
  231.         LDS     DX,cs:[pOur_int21h]
  232.         mov     word ptr cs:[Our_int21h].TSR_PrevAddr+0,bx
  233.         mov     word ptr cs:[Our_int21h].TSR_PrevAddr+2,es
  234.         mov     ax,2521h
  235.         int     21h
  236.         ret
  237. HookInt endp
  238. ;---------------------------------------
  239. CSEG    ENDS
  240.  
  241.  
  242. STACK   SEGMENT STACK 'STACK'
  243.         dw      1000 dup (?)
  244. STACK   ENDS
  245.  
  246.  
  247.         END     main
  248.  
  249.