


SWSUBST(1)                                             SWSUBST(1)


NNAAMMEE
       swsubst - CDS manipulator

SSYYNNOOPPSSIISS
       swsubst { option | command } [ arguments ]

       Valid  _o_p_t_i_o_n_s are: /h /?  /# /!  /a /f /k /t /_ /d /x and
       /o

       Valid _c_o_m_m_a_n_d_s are: /m /c /j /u /q /s /r /l /n /w

       Instead of the name _s_w_s_u_b_s_t the following names alter  the
       default  setting  of  _s_w_s_u_b_s_t _j_o_i_n _s_u_b_s_t _m_k_d_i_r _c_h_d_i_r _q_u_e_r_y
       _s_w_a_p _w_h_i_c_h _-_j_o_i_n _-_m_k_d_i_r _-_c_h_d_i_r _-_q_u_e_r_y _-_s_w_a_p  _d_r_v_l_i_s_t  _m_c_b_-
       _l_i_s_t _-_w_h_i_c_h

DDEESSCCRRIIPPTTIIOONN
       _s_w_s_u_b_s_t is designed to manipulate the CDS ( D S is access-
       able.  By  renaming  or  by  copying  of  the   executable
       swsubst.exe  to  one of the above mentioned file names one
       command switch is automatically inserted right  after  the
       executable's  name,  e.g.   "query  /a c:+net" is equal to
       "swsubst /q /a c:+net". Only _j_o_i_n and _s_u_b_s_t have an  addi-
       tional  meaning  by  restricting _s_w_s_u_b_s_t to conform to the
       DOS standard tools with the same name.

       Unnecessary options, or options which has no meaning  with
       the invoked command, are scanned and ignored.

       A path specification can be logical or physical. The drive
       specification of a physical drive means that drive,  which
       got that letter while booting. The logical drive specfica-
       tion is the one typed on the command line, e.g.  after the
       command "SUBST C: E:FREEDOS", the logical drive specifica-
       tion "C:" is the physical "E:", that  means,  if  the  DOS
       Prompt  says:  "C:>",  that  is  the  "original" directory
       "E:FREEDOS". The "original" drive "C" is no longer  avail-
       able.

       In  order  to  remove  that  limitation a leading dash '-'
       indicates a physical path. So after "SUBST D:  C:RCE"  the
       logical drive "D:" will point into "E:FREEDOSRCE", whereas
       after "SWSUBST D: -C:RCE" drive "D:" points into  "C:RCE".
       _N_o_t_e_:  If  a physical path is not fully qualified, it will
       be qualifed  according  to  the  logical  current  working
       directory.

       Drive specifications are also enhanced:
       Where  only  a  drive  specification is expected, a single
       letter acts a drive letter as  well  as  a  full-qualified
       path.
       Besides  these  methods, it is possible to specify a drive
       specification by the name of  its  driver  or  its  volume
       label.  Driver  names  are specified with ":*:", where "*"



                           22 May 1995                          1





SWSUBST(1)                                             SWSUBST(1)


       stands for the up to eight characters long  name.  Because
       one  driver  may  handle  several  drives, a number can be
       specified, like ":#:*:", where "#" stands  for  the  zero-
       based  number  and "*" for the driver name.  _N_o_t_e_: Not all
       drivers have a name.
       The search for a volume label is activated by using "::*:"
       or  ":-:*:", where "*" stands for the volume label and the
       optional dash '-' causes to temporarily release SUBST  and
       JOIN relations.
       While  scanning, the drives are searched in the order: A:,
       B:, ...  If one drive does not respond, it is ignored.
       The names are case-insensitive and are matched,  that rthe
       characters  specified  with  "*" must lead the name, e."g.:
       ":1:stac:os" means: The path ".br  And  "-:-:hd_c:\foomns:
       the  path  "FOOBAR"  on  the  physical drive, which voelume
       label starts with "HD_C".  _N_o_t_e_: The dash '-'  within  the
       colons ":-:" stands for: "retrieve the physical drive let-
       ter", whereas the dash '-' before the first  colon  stands
       for "treat the following path as a physical one".



OOPPTTIIOONNSS
       special names
              _j_o_i_n  _s_w_s_u_b_s_t  to  act like the standard JOIN.  See
              the help page for join.
              _s_u_b_s_t _s_w_s_u_b_s_t to act like the standard SUBST.   See
              the help page for subst.
              _m_k_d_i_r and _-_m_k_d_i_r add the /m command.
              _c_h_d_i_r and _-_c_h_d_i_r add the /c command.
              _q_u_e_r_y and _-_q_u_e_r_y add the /q command.
              _s_w_a_p and _-_s_w_a_p add the /s command.
              _w_h_i_c_h and _-_w_h_i_c_h add the /w command.
              _-_j_o_i_n adds the /j command.
              _d_r_v_l_i_s_t adds the /r command.
              _m_c_b_l_i_s_t adds the /l command.
              Any other name defaults to the /u command.


       /? and /h
              Display a help screen.

       /#     Causes  _s_w_s_u_b_s_t  to  display  the  statistic  about
              JOIN'ed drives, when it dumps the  CDS  table.   It
              displays  the number of JOIN'ed drives according to
              the CDS and the number retrieved fromout DOS inter-
              nal data structures. When these differ, it's possi-
              ble, that the system will not work correctly.
              If this option is used twice, it cancels the effect
              of the previous one.  It also cancels the effect of
              /!

       /!     This option displays the  JOIN'ed  drive  statistic
              under  the  CDS  table  and  updates  the  internal



                           22 May 1995                          2





SWSUBST(1)                                             SWSUBST(1)


              number, if both differ.
              When this option is  given  twice,  the  second  is
              ignored.

       /a     After the given command has been processed success-
              fully, the CDS table should be printed. If the com-
              mand  itself  orders  to  dump the CDS table, it is
              displayed only once.
              This options also causes to display unused entries.
              A second /a option cancels the effect of the previ-
              ous one.

       /f     There is a little space within the device  drivers,
              where  their names can be stored. Normally the part
              of the name from the frist available byte up to the
              first  non-printable charchater forms the name.  If
              this option is given, the whole name is  displayed,
              non-printable  characters  are  displayed in a hex-
              adecimal manner, like , where ?? are the  two  hex-
              adecimal numbers for that value.
              A second /f option cancels the effect of the previ-
              ous one.

       /_     Normally only a subset of the  16  available  flags
              are  displayed.  This  option enables a little map,
              where the named flags: Networked, Physical, Joined,
              Substed,  and  Hidden are marked with their capital
              letter, if they are set; the others  will  be  dis-
              played  as  a  plus  '+'. If a flag is not set, its
              positions is overwritten by a dash '-'.
              A second /_ cancels the effect of the previous one.

       /k     Causes  _s_w_s_u_b_s_t  to  create  the path if necessary,
              e.g. whren  invoking  the  command  "swsubst  /k  f:
              c:\foo"  _N_o_t_e_: This feature is disabled by default!
              This o.ption cancels the effect of a previous /t and
              /k

       /t     Causes  _s_w_s_u_b_s_t  to  test, if the desired paths are
              available, if not the command is aborted.
              This option cancels the effect of a previous /t and
              /k

       /d     This  is  not  really a options and is for use only
              with the commands /j and /u and acts like a  /d  as
              the second argument.
              The second /d cancels the effect of a previous one.

       /o=#   This option is also for the commands /u and /j only
              and overwrites the fromout the path-argument deter-
              mined backslash offset.  Use with caution!
              A second option will overwrite a previous one.
              The number # must be within the range 0..66 and can
              be  given  in C notation. That means, if the number



                           22 May 1995                          3





SWSUBST(1)                                             SWSUBST(1)


              starts with either "0x" or "0X", the rest  will  be
              treated hexadecimal, if the number starts with "0",
              the rest will be treated octal, and if  the  number
              starts  with a number from "1" to "9", it's treated
              decimal.  When # is zero, this option  is  disabled
              and  the backslash offset is determined fromout the
              path argument.
              This option is needed to use network  paths,  which
              normally  do not conform to the DOS path specifiac-
              tion.

       /x=??  This  option  specifies  the  drives,   which   are
              excluded  while searching for the drive of a volume
              label via the enhanced "::*:" drive  specification.
              Each  Option  cancels  the effect of a previous one
              and /x= excludes no drive.
              This option is very useful to  exclude  the  floppy
              drives, because scanning them with no floppy loaded
              uses an huge amount of time.

       /m     This command accepts any number of arguments, which
              are  treated  as path specifications. Those will be
              created along with the full path to them.

       /c     This command accepts  exactly  one  argument.  This
              argument  is treated as a path specification, which
              is made with the /k command. If this  was  success-
              ful,  the current working directory and the current
              disk will be set to that path.

       /j     This acts like _J_O_I_N without the restrictions.
              There are two formats:
              1) dr ( /d | - )
              which will release any existing SUBST or JOIN rela-
              tion  of  the  logical drive dr and is equal to " -
              _s_w_s_u_b_s_t tries to determine  the  settings  of  this
              physical drive while boot time.
              2) dr1 [
              which  will release any exising SUBST or JOIN rela-
              tion of the logical drive dr1 and joins it into the
              path  of drive dr2 optional dash indicates a physi-
              cal path. A logical path will be transformed into a
              physical  by  the  DOS  call  _t_r_u_e_n_a_m_e path is only
              upper-cased and fully qualified. To omit this, too,
              a  second dash must be placed in front the optional
              one.  _N_o_t_e_: Drives starting  with  two  backslashes
              "\\"  are  treated  as networked drives and preceed
              the path with one dash automatically.
              When DOS displays a path, it can skip some  charac-
              ters. This is called backslash offset for networked
              paths by _s_w_s_u_b_s_t for sure, the /o  is  offered  and
              the offset can be altered manually.

       /u     Is equal to /j



                           22 May 1995                          4





SWSUBST(1)                                             SWSUBST(1)


       /q     This  command test the drive flags, if they are set
              according to the specified  flags.  The  syntax  is
              equal  to  set  drive  flags mode '=' and the flags
              "ON" and "OFF" are not allowed.
              _s_w_s_u_b_s_t returns the result to the  calling  process
              via  the  errorlevel.   An errorlevel of zero indi-
              cates, that the flags are set  equally;  an  error-
              level greater than zero indicates, that they arn't.

       /r     This command accept up to one argument. It  enables
              to  display  and search in the device driver chain.
              The chain is displayed, when  the  command  has  no
              additional argument, or when the argument is either
              '+' or '-'.
              The output looks like:
              NUL
              CON      <<D>> ANSI
              MSCD001  <<D>> SGCDU
              EMMXXXX0 <<D>> EMM386
              CON
              AUX
              PRN
              CLOCK$
              COM1
              LPT1
              LPT2

              The names left of the "<< >>" are the driver names,
              the  character  within the "<< >>" is the MCB type,
              and the names right of the "<< >>" are the names of
              the  file. Latter is a favour of the routine, which
              has been loaded the driver, so it might be  missed.
              The  MCB  type itself was invented with DOS version
              4.

              The search is activated, when the additional  argu-
              ment is neither '+' nor searched, too. For matching
              an leading '+' or '-' is stripped.
              The errorlevel is set to zero, if  the  search  was
              successful, otherwise to a value greater than zero.

       /l     This command accept up to one argument. It  enables
              to  display  and search in the MCB ( C B displayed,
              when the command has  no  additional  argument,  or
              when the argument is either '+' or '-'.
              The output looks like:
              0x0264 M 0x01e4 nam=SD sys:data
              0x0265     D    0x0048    nam=HIMEM    drv=XMSXXXX0
              sys:device_driver
              0x02ae    D    0x00c3    nam=EMM386    drv=EMMXXXX0
              sys:device_driver
              0x0372 F 0x0082 nam=ilegiert sys:FILES
              0x03f5 X 0x0005 sys:FCBS
              0x03fb B 0x0020 sys:BUFFERS



                           22 May 1995                          5





SWSUBST(1)                                             SWSUBST(1)


              0x041c L 0x002c sys:LASTDRIVE
              0x041d A 0x0000 own#0x5c3a
              0x0449 M 0x0004 nam=SC sys:code
              0x044e M 0x0003 own=COMMAND
              0x0452 M 0x00bc nam=COMMAND
              0x050f M 0x0040 nam=arameter env=COMMAND
              0x0550 M 0x001d env=SWSUBST
              0x056e M 0x020f nam=sgcdu
              0x077e M 0x03de nam=MSCDEX
              0x0b5d M 0x1aa3 nam=SWSUBST
              0x2601 Z 0x79fd sys:free sys:end_of_chain
              0x9fff M 0x1159 nam=SC sys:code
              0xb159 M 0x0107 nam=SD sys:data
              0xb15a D 0x0106 nam=ANSI drv=CON sys:device_driver
              0xb261 M 0x0003 sys:free
              0xb265 M 0x0598 sys:free
              0xb7fe M 0x2002 nam=SC sys:code
              0xb7ff M 0x2000 nam=SM sys:memory
              0xd801 M 0x07d5 nam=SMARTDRV
              0xdfd7 Z 0x1028 sys:free sys:end_of_chain

              The  elements have the following meaning, from left
              to right:
              + The address of the  MCB.  It's  hexadezimal,  and
              always preceeded by "0x".
              + The type of the MCB. It might be a space.
              +  The  number  of associated paragraphs. It's also
              always hexadecimal and preceeded by "0x". This num-
              ber will be displayed only, if the argument "+" has
              been given.
              + A *guess*, what this MCB is for. This can be  any
              combination of the following items:
              ++  nam=???.  The name of the loaded program, which
              is read directly out of this MCB.
              ++ env=???. The name of  the  program,  which  owns
              this MCB as its environment.
              ++ drv=???. The name of the driver, which owns this
              MCB.
              ++ own=???. The name of  the  program,  which  owns
              this MCB.
              ++  sys:???.  This is memory controlled by the sys-
              tem. "???" stands  for  the  type  of  data  stored
              there.  A  special  meaning has "sys:end_of_chain",
              what indicates the last MCB in the chain.
              The names need not be stored  within  the  MCB;  if
              there should be a name, these items are substituted
              by an item of the  format:  "*#0x????",  where  "*"
              stands  for  the item type (the first three charac-
              ters), and "????"  stands for the 4-digit hexadezi-
              mal value of the owner's MCB.
              The  output  is  designed  as  input  for programs.
              Therefore the elements contains no  spaces  itselfs
              and  each  MCB is printed on its own line.  Because
              _s_w_s_u_b_s_t tries to determine  a  sub-chain  within  a



                           22 May 1995                          6





SWSUBST(1)                                             SWSUBST(1)


              MCB,  these  sub-chains  are indented. But this can
              lead into false  entries.  This  is  shown  at  the
              beginning of the above example (s. 0x041d).
              The  above  example  contains  two MCBs marked with
              "sys:end_of_chain".  This behaviour  bases  on  the
              way  later DOS versions manage the memory by divid-
              ing into two chains; one in the  conventional  mem-
              ory, the other in the UMBs.

              The  search is activated, when the additional argu-
              ment is neither '+' nor character is  an  '+',  the
              name determined fromout the MCBs (which follows the
              "nam=" item in the MCB  chain  display)  must  only
              start  with  the  argument. For matching an leading
              '+' or '-' is stripped.
              The errorlevel is set to zero, if  the  search  was
              successful, otherwise to a value greater than zero.

       /s     This command requires two arguments. Both are logi-
              cal drive specifications, which are simply swapped.

       /n     This command  is  closely  related  to  /s  entries
              within the CDS, but tries to swap their unit number
              of the device  driver.  This  requires,  that  both
              drives  share  the  same device driver. That is the
              only way to swap the floppies, for some reason.
              If there is no argument to this command,  it  tries
              to identify both floppies and swaps them; otherwise
              two arguments must be specified, which  are  to  be
              swapped.   _C_a_u_t_i_o_n_:  Better do not use this command
              on hard disks.
              This swap will not be resetted, neither by the com-
              mands  - -- and /d nor by directly manipulating the
              drive flags, e.g. "X:=OFF" or "X:=ON". Them must be
              swapped again or the computer must be rebooted.

       /w     This  command requires one argument, treats it as a
              drive specification  and  translates  it  into  the
              drive  letter.  This  will  returned via the error-
              level.
              An errorlevel between 65 (ASCII 'A') and 90  (ASCII
              'Z')  indicates  OK  and  the  drive letter itself;
              whereas a errorlevel of zero indicates, that  there
              is no such drive; and other errorlevels indicate an
              error.


       without any command switch
              In that case the arguments decide, what command  is
              invoked:

       without arguments
              This will dump the CDS table onto screen:




                           22 May 1995                          7





SWSUBST(1)                                             SWSUBST(1)


              H  0000:0000  NET  ....  PHYS  ..... HIDDEN \H.1.br
              ==>.MSCD001 .<==        _NP------H-------_
              Number of JOIN'ed drives per CDS 0  per flag: 0  =>
              seems OK

              Line 1 from left to right:
              + logical drive letter
              + far address of DPB
              + NETWORKED flag set
              + JOINED flag not set
              + PHYSICAL flag set
              + SUBST flag not set
              + HIDDEN flag set
              +  physical  path. The double quote marks the _b_a_c_k_-
              _s_l_a_s_h _o_f_f_s_e_t characters to the left are  not  visi-
              ble.  If  the  path  points to "A:" or "B:" and the
              unit number has been changed, for example  by  com-
              mand  /n the string " => X:" is appended, where 'X'
              stands for the  possible  drive  letter  this  path
              points to.

              Line 2:
              +  driver  name. The "==>..<==" are not part of the
              name.
              + full set of flags. Caused by the /_ options.  The
              "_"  surrounding the flags does not effect the val-
              ues.

              Line 3:
              JOIN'ed drives statistic: both numbers  are  equal,
              so there schould be no error.
              Unless the /a options is enabled, only used and the
              last entries are displayed.

       one argument: either - or --
              - will remove  all  SUBST  and  JOIN  relations  by
              invoking  the  command  "/u  dr:  /d"  on  all such
              drives;
              -- does the same but for all not networked  drives.

       set drive flags
              This requires exacly one argument in the syntax: dr
              - means: unset or is not set; + = other flags.
              The following flags are available: OFF  switch  the
              drive  OFF,  it  is no more accessable; ON switch a
              drive ON (This is _N_O_T the reversal of OFF, but  the
              invoking  of  the  command  "/u dr: /d".); PHYSICAL
              JOIN NETWORK SUBST HIDDEN refer to  the  associated
              flag;  and  a number between 0 and 15 refers to the
              bit.
              All flags but ON can be abbreviate down to a single
              letter.





                           22 May 1995                          8





SWSUBST(1)                                             SWSUBST(1)


       in all other cases
              is the command /u assumed.

SSEEEE AALLSSOO
       subst, join.

KKNNOOWWNN BBUUGGSS
       o      A  relative  physical  path is qualified by logical
              components.

       o      Sometimes the manipulation by the non-standard pos-
              sibilities  fails;  then either the system locks up
              or a harmless 'Cannot find *.*' error message beeps
              up.

       o      To  turn  ON  a  drive is the opposit of turning it
              OFF. For local hard disks this  works;  for  device
              driver  driven  drives  sometimes;  and for CD-ROMs
              seldom.

       o      Works  on  MS-DOS  compatibles  only,  but  doesn't
              check, if it is.

       o      This  program  does  some  error checking, but much
              could be valid, but locks  the  system  in  several
              cases.

       o      Several  commands,  like /s /u /j 32 bit access and
              the ability to hold  the  permanent  swap  file  of
              Microsoft Windows 3+ on the used drives.

EEXXAAMMPPLLEESS
       swsubst /w ::HD_e:
              Checks,  if an hard disk with a label starting with
              "HD_E" is currently available via a  logical  drive
              letter. The result can be checked with:

              swsubst /w ::hd_e:
              if errorlevel 91 goto error
              if errorlevel 90 echo Drive Z:
              if errorlevel 89 echo Drive Y:
              if errorlevel 65 echo Drive A:
              if errorlevel 1 goto error
              if  not errorlevel 1 echo No volume with label HD_E
              found!

              With 4DOS e.g.:

              iff %? .LE. 90 .AND. %? .GE. 65 then
              echo Drive %@char[%?]
              elseiff errorlevel 1 then
              echo error
              else
              echo There is no volume with label HD_E



                           22 May 1995                          9





SWSUBST(1)                                             SWSUBST(1)


              endiff

       swsubst /s e ::HD_e:
              Swap the drive currently accessable via the logical
              drive  letter  E:  and  the  drive  with  the label
              "HD_E". Doing so can ensure, that the drive  "HD_E"
              is  always  accessable  via  the  drive  letter E:.
              _N_o_t_e_: Have a look at the Known Bugs section!

CCOONNTTRRIIBBUUTTEERRSS
                             Steffen Kaiser
                         Mittelstra'ae 112/B115
                     53757 Sankt Augustin - Menden
                         Deutschland - Germany

                e-mail: Steffen.Kaiser@@FH-Rhein-Sieg.DE









































                           22 May 1995                         10


