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
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

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

See Also: DOS Interrupts
- -

INT 2fH: Multiplex Interrupt