INT 2fH: Multiplex Interrupt

 The INT 2fH vector (at 0000:00bc) is a portal to many varied services;
 some installed by DOS and others by device drivers, utility programs,
 Windows, etc.  It is sometimes call the Multiplex or MUX Interrupt.
 TECH Help! covers the following INT 2fH services:

   AX   DOS 5.0 TSRs & drivers        AX  Defined elsewhere in TECH Help!
  ▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  01xxH Print spooler services      4a11H DoubleSpace API services
  0600H Assign installed?
  1000H Share installed?            16xxH Windows 386Enh-Mode services
  1100H is network installed?
  1400H Nlsfunc installed?          17xxH Windows Clipboard access
  15xxH Mscdex services
  1680H AppIdle Release timeslice   40xxH Windows VDD fns for VM-aware apps
  1a00H ANSI.SYS installed?
  43xxH HIMEM.SYS / XMS Services
  48xxH Doskey services             xxfbH FaxBIOS Services
  4axxH HMA Allocations (undoc'd)
  4bxxH Dosshell / Switcher API
  54xxH POWER.EXE (undocumented)
  adxxH Keyb services
  aexxH COMMAND.COM hook services
  b000H Graftabl installed?
  b7xxH Append services

 TSR programs and device drivers intercept INT 2fH to install themselves
 into the "mux-process chain".  Later, another program may use INT 2fH to
 see if that TSR has been installed and to request various services.

█▌DOS Versions▐█
  INT 2fH is not defined for version prior to DOS 3.0.  In DOS 3.0, INT 2fH
  is defined ONLY for the print spooler and the value of AH (which is now
  critical) had no meaning.

  The various services may or may not be available with a particular version
  of DOS, since they are supplied by external programs.  For instance, the
  Windows clipboard fns are available on any DOS version which can run
  Windows 3.0 or later, but only while Windows is running.

█▌Accessing MUX Services▐█
  To use a service, load AH with the mux ID and load AL with the fn number,
  load other registers as needed, and invoke INT 2fH.

  Nearly all INT 2fH handlers support fn AL=0 to mean "check to see if the
  service is installed".  The service is installed if AL=ffH on return.
  Note that just checking AL may not be sufficient, since any program can
  hook into the chain.  See below.

  Mux IDs AH=00H through AH=bfH are reserved by Microsoft.  Other
  applications can hook into the chain using values from c0H-ffH.

█▌Creating Your Own MUX Process▐█
  INT 2fH can be used as a gateway for installing and communicating with
  your own TSR programs.  The idea is to avoid forcing programmers to pick
  arbitrary interrupt vectors for use in communication with installed TSRs.

 To install a MUX process: Install an INT 2fH handler by saving the
   current vector and installing a vector to your code via DOS Fns 35H
   and 25H.  Your handler watches for its MUX number (in AH) and on
   calls which specify any other MUX number, passes control to the saved
   vector via a FAR JMP.  If nothing else, you can use this technique to
   check if your TSR has been installed previously (when executed, do an
   INT 2fH with AH=yourMuxNumber and AL=0).

   Mux numbers 00H-bfH are reserved by DOS.  You may pick any number
   between c0H and ffH.  However, there is some danger that another
   application is using you Mux ID.  The recommended way to avoid this
   problem is:

    1 Use INT 2FH with AL=0, starting with AH=ffH.  If upon return, you
      don't get back your own unique return code, then keep trying lower
      mux IDs, working down to AH=c0H.

    2 If you never find your own process, then you know you have not been
      installed.  Otherwise, pick one of the mux IDs which was not used (an
      unused mux ID will leave AX unchanged after INT 2fH).

    3 Hook into the INT 2fH chain.  Your code should check for you Mux ID
      in AH, and when AL is 0, should return ffH in AL, and some uniquely-
      identifying code in other registers (so that step 1, above, can
      recognize your mux process).

    ■ When you later use INT 2Fh to access your own service, you must use
      logic similar to that in step 1, since you won't know your Mux ID in
      advance.

    Note: If your mux process uses DOS services or runs with interrupts
          enabled, you should make your process re-entrant.

See Also: DOS Interrupts
          DOS Functions
          Device Drivers
                                    -♦-