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 <> ANSI MSCD001 <> SGCDU EMMXXXX0 <> 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