home *** CD-ROM | disk | FTP | other *** search
/ How Computers Work (Alt) / HowComputersWork.iso / 3rdParty / Wilson / FIXES.TX_ < prev    next >
Encoding:
Text File  |  2001-06-01  |  85.1 KB  |  2,231 lines

  1. ----------------------------------------------------------------------------
  2. To read documentation regarding the fixes and improvements to earlier
  3. versions of Winbatch prior to what is documented in this file, please
  4. go to the following URL:
  5.  
  6.   http://techsupt.windowware.com
  7.  
  8. and on that web page, click on the link entitled, "Winbatch", then scroll
  9. down to the bottom of the page, and see the links:
  10.  
  11.   "Winbatch Fixes and Improvements 5.0H Through 97D"
  12.  
  13. and
  14.  
  15.   "Winbatch Fixes and Improvements 98A through 2000C".
  16. ----------------------------------------------------------------------------
  17.  
  18. WB 2000A  Feb 24, 2000
  19.  
  20.   Fixed problem in FileMenu with FileItemize("") and DirItemize("")
  21.   sometimes returning a "function failed" error.
  22.  
  23.   BoxDrawCircle and BoxDrawRect no longer draw anything if all the
  24.   coordinates are 0.
  25.  
  26.   FileMenu supports new FileItemPath("") function (see below under WIL DLL).
  27.  
  28.  
  29. DLL 3.0abv  First showing up in WB 2000A
  30.  
  31.   New functions:
  32.  
  33.     FileItemPath(file-list)
  34.       Returns a delimited list of file paths.
  35.  
  36.         This function is like FileItemize, but the list of file names it
  37.         returns contains full path information.
  38.  
  39.     ItemReplace(item, index, list, delimiter)
  40.       Replaces an item in a list.
  41.  
  42.         (s) item       the replacement item.
  43.         (i) index      the position in list that will be replaced by the item.
  44.         (s) list       a string containing a list of items.
  45.         (s) delimiter  a character to act as a delimiter between items in the list.
  46.  
  47.       This function replaces an item in a list with a new item.  It returns
  48.       a new list, with the specified replacement made; the original list
  49.       ("list") is unchanged.  For example, specifying an index of 1 causes
  50.       the first item in the list to be replaced with the new item ("item").
  51.  
  52.     AskTextBox(title, prompt, default, flags, reserved)
  53.       Prompts the user for multiple lines of input.
  54.  
  55.         (s) title      title of the dialog box.
  56.         (s) prompt     question to be put to the user.
  57.         (s) default    default answer.
  58.         (i) flags      see below.
  59.         (i) reserved   reserved for future use, should be set to 0.
  60.  
  61.       "default" can contain multiple lines of text, using embedded @CRLF's.
  62.  
  63.       "flags" can be set to 0, or can specify one or more of the following
  64.       values combined with the bitwise OR ('|') operator:
  65.  
  66.         Value   Meaning
  67.         -----   -------
  68.           1     do not automatically wrap text
  69.           2     place cursor at end of default text (instead of highlighting it)
  70.  
  71.       The return value is whatever the user enters in the edit box.  If
  72.       multiple lines of text are entered, they will be delimited in the
  73.       returned string with @CRLF's.
  74.  
  75.     StrClean(s:source-string, s:characters, s:replacement, i:match-case, i:mode)
  76.       Removes or replaces characters in a string.
  77.  
  78.         "source-string" is the string to be operated upon.
  79.  
  80.         "characters" is a string specifies the characters in "source-string"
  81.         to be replaced or retained.  This parameter can be a single character
  82.         (eg, "x"), a list of characters (eg, "~!@#"), or a blank string ("").
  83.  
  84.         "replacement" specifies the replacement string to be inserted in
  85.         place of matching (or non-matching) characters.  It can be a string,
  86.         one or more characters long.  It can also be a blank string (""), in
  87.         which case matching characters are removed.
  88.  
  89.         "match-case" can be @TRUE or @FALSE, indicating whether string
  90.         comparisons are case-sensitive or case-insensitive, respectively.
  91.  
  92.         "mode" can be one of the following:
  93.  
  94.           Value   Meaning
  95.           -----   -------
  96.             1     Replace all occurrences of "characters" with "replacement"
  97.             2     Replace all non-occurrences of "characters" with "replacement"
  98.  
  99.       This function can be used to remove or replace specific characters in a
  100.       string, or to retain only specific characters in a string.
  101.  
  102.       If "mode" is 1, then any characters which appear in "characters" will
  103.       be replaced with "replacement".  If "replacement" is a blank string,
  104.       then any characters which appear in "characters" will be removed.  If
  105.       "characters" is a blank string, then no chnges will be made.
  106.  
  107.       If "mode" is 2, then any characters which DON'T appear in "characters"
  108.       will be replaced with "replacement".  If "replacement" is a blank string,
  109.       then any characters which DON'T appear in "characters" will be removed.
  110.       If "characters" is a blank string, then ALL characters will be replaced.
  111.  
  112.       The return value is the new string, with all changes made.  The original
  113.       string ("source-string") is untouched.
  114.  
  115.       Examples:
  116.         ; Remove all spaces from a string
  117.         StrClean("Have a nice day", " ", "", @FALSE, 1)
  118.  
  119.         ; Replace all ampersands with the HTML code "&"
  120.         StrClean("Here & there & everywhere", "&", "&", @FALSE, 1)
  121.  
  122.         ; Remove all characters other then letters and spaces
  123.         StrClean("Healthy, wealthy, & wise.", "abcdefghijklmnopqrstuvwxyz ", "", @FALSE, 2)
  124.  
  125.   New IntControl:
  126.  
  127.     IntControl(38, p1, p2, 0, 0) (not really new, but previously undocumented)
  128.       Sets quiet mode.
  129.  
  130.         P1   Meaning
  131.         --   -------
  132.         -1   Don't change (just return current setting)
  133.          0   Disable quiet mode (default).
  134.          1   Enable quiet mode.
  135.  
  136.       p2 = error log filename, or a blank string ("") for no error log.
  137.  
  138.       In "quiet mode":
  139.  
  140.         1. No error messages are displayed.  If an error log filename is
  141.            specified, then error messages will be written to that file.
  142.  
  143.         2. You MUST set the "warning" parameter in any FileCopy or FileMove
  144.            commands to @FALSE, or else a fatal error will occur.
  145.  
  146.         3. Sounds that would normally be controlled by the Sounds() function
  147.            are suppressed.
  148.  
  149.       Returns previous setting.
  150.  
  151.   "#include" directives can have leading whitespace (ie, they can be indented
  152.   with spaces or tabs).  Note that an "#include" directive appearing in a menu
  153.   file MUST be indented at least 4 columns, just like all menu code must be.
  154.  
  155.   DirExist no longer returns true if the directory name is followed by "*.*".
  156.  
  157.   Fixed a problem with numeric strings containing an "e" incorrectly being
  158.   treated as floating point numbers.
  159.  
  160.   For DebugTrace, you can now specify a mode of 2, in which case when a
  161.   terminal error occurs, the error message and the WIL variable table will
  162.   be dumped to the debug log file.  This mode is entirely separate from
  163.   DebugTrace(@ON) (ie, only one of the modes can be active at any time, and
  164.   each mode has different types of output information, with no overlap).
  165.  
  166.   If you use IntControl(28) to specify a fixed pitch font for list boxes,
  167.   a fixed pitch font will now also be used for ITEMBOX controls in dialogs.
  168.  
  169.   IntControl(56) can now terminate an application based on its module or
  170.   file name as well as its window name.  The expanded syntax is:
  171.  
  172.     IntControl(56, p1, p2, 0, 0)
  173.  
  174.       p1 = window or application name
  175.  
  176.       p2 = name type specified by p1:
  177.         0  window name
  178.         1  module or file name (with optional path)
  179.  
  180.   FileVerInfo can now return numeric version fields, by preceding the resource
  181.   string name with a '#'.  The following are available:
  182.  
  183.       "#FileVersion"
  184.       "#ProductVersion"
  185.       "#FileFlagsMask"
  186.       "#FileFlags"
  187.       "#FileOS"
  188.       "#FileType"
  189.       "#FileSubtype"
  190.  
  191.     "#FileVersion" and "#ProductVersion" are 64-bit numbers, and are returned
  192.     as comma-separated strings in the form "n1,n2,n3,n4", where n1 is the
  193.     most significant word and n4 is the least significant word.  The other
  194.     fields each return a single 32-bit number.
  195.  
  196.   WaitForKey now supports punctuation keys.
  197.  
  198.   Improved speed of BinaryReplace.
  199.  
  200.   Fixed a problem with RegQueryMulSz crashing with NULL (blank) registry values.
  201.  
  202.   BinaryStrCount now returns an error if the specified end-offset is past
  203.   the binary EOD.
  204.  
  205.  
  206. Windows NT extender 11015  First showing up in WB 2000A
  207.  
  208.   New functions:
  209.  
  210.     wntServerInfo(s:server-name, i:request)
  211.       Returns information about a server.
  212.  
  213.         "server-name" is the UNC name of a server (eg, "\\SERVER1"), or a
  214.         blank string ("") to indicate the local machine.
  215.  
  216.         "request" specifies the information about "server-name" to be
  217.         returned, and can be one of the following:
  218.  
  219.            1   (i) major version
  220.            2   (i) minor version
  221.            3   (i) type (see wntServiceAt for a list of server types)
  222.            4   (s) comment
  223.            5   (i) maximum users who can log on
  224.            6   (i) auto-disconnect time, in minutes, or -1 if no auto-disconnect
  225.            7   (i) hidden to other computers in domain? (0 = visible, 1 = hidden)
  226.            8   (i) network announce rate, in seconds
  227.            9   (i) delta value by which announce rate can vary, in milliseconds
  228.           10   (s) path to user directories
  229.  
  230.     wntShareList(s:server-name, i:share-type, i:flags)
  231.       Returns a list of shares on a server.
  232.  
  233.         "server-name" is the UNC name of a server (eg, "\\SERVER1"), or a
  234.         blank string ("") to indicate the local machine.
  235.  
  236.         "share-type" is a bitmask specifying the type(s) of shares that
  237.         should be returned.  It can be set to 0 to return all shares, or it
  238.         can be one or more of the following values combined with the bitwise
  239.         OR ('|') operator:
  240.  
  241.           Value   Share type
  242.           -----   ----------
  243.             1     Disk drive
  244.             2     Print queue
  245.             4     Communication device
  246.             8     Interprocess communication (IPC)
  247.            16     Administrative or special share (eg: C$, D$, ADMIN$, IPC$)
  248.  
  249.         "flags" is reserved for future use and should be set to 0.
  250.  
  251.       This function returns a tab-delimited list of shared resources on a
  252.       server, including hidden shares.
  253.  
  254.       Example:
  255.         wntShareList("\\SERVER", 1 | 16, 0))
  256.  
  257.     wntShareUsers(s:server-name, s:share/computer-name, i:share-type, i:format, i:flags)
  258.       Returns a list of users connected to a share or server.
  259.  
  260.         "server-name" is the UNC name of a server (eg, "\\SERVER1"), or a
  261.         blank string ("") to indicate the local machine.
  262.  
  263.         "share/computer-name" specifies either a share name (eg, "PUBLIC")
  264.         on "server-name", or a computer name (eg, "\\FRED").  See explanation
  265.         below.
  266.  
  267.         "share-type" is a bitmask specifying the type(s) of shares that
  268.         should be returned if "share/computer-name" specifies a computer name.
  269.         It can be set to 0 to return all shares, or it can be one or more of
  270.         the following values combined with the bitwise OR ('|') operator:
  271.  
  272.           Value   Share type
  273.           -----   ----------
  274.             1     Disk drive
  275.             2     Print queue
  276.             4     Communication device
  277.             8     Interprocess communication (IPC)
  278.            16     Administrative or special share (eg: C$, D$, ADMIN$, IPC$)
  279.  
  280.         "format" specifies the information that will be returned for each
  281.         connection.  It can be one of the following values (see explanation
  282.         below):
  283.  
  284.           Value   Return format
  285.           -----   -------------
  286.             1     username
  287.             2     netname
  288.             3     username|netname
  289.  
  290.         "flags" is reserved for future use and should be set to 0.
  291.  
  292.       This function can return either a list of users connected to a share,
  293.       or a list of computers connected to a server.  If "share/computer-name"
  294.       specifies a share name, then the function will return a list of users
  295.       connected to that share.  If "share/computer-name" specifies a computer
  296.       name, then the function will return a list of shares on "server-name"
  297.       (filtered by "share-type") to which that computer is connected.
  298.  
  299.       This function returns a tab-delimited list of user names and/or net
  300.       names, depending on "format".  The values returned are as follows:
  301.  
  302.         username:
  303.           If "server-name" is running with user-level security, then
  304.           "username" will be the name of the user who made the connection.
  305.           If "server-name" is running with share-level security, then
  306.           "username" eill be the computer that made the connection.
  307.  
  308.         netname:
  309.           "netname" is the opposite of "share/computer-name".  In other words,
  310.           if "share/computer-name" specifies a share name, then "netname"
  311.           will be the name of the computer connected to that share, and if
  312.           "share/computer-name" specifies a computer name, then "netname"
  313.           will be the name of the share to which that computer is connected.
  314.  
  315.       Example:
  316.         wntShareUsers("", "PUBLIC", 1, 1, 0)
  317.  
  318.     wntRemoteTime(s:server-name, i:format)
  319.       Gets the time of day from a server.
  320.  
  321.         "server-name" is the UNC name of a server (eg, "\\SERVER1"), or a
  322.         blank string ("") to indicate the local machine.
  323.  
  324.         "format" specifies the format in which the time will be returned,
  325.         and can be one of the following values:
  326.  
  327.           Value   Format
  328.           -----   ------
  329.             1     UTC/GMT time, in YYYY:MM:DD:hh:mm:ss format
  330.             2     local time (on local machine), in YYYY:MM:DD:hh:mm:ss format
  331.  
  332.     wntShutdown(s:computer-name, s:message, i:timeout, i:force, i:reboot)
  333.       Shuts down (and optionally restarts) a computer.
  334.  
  335.         "computer-name" is the name of an NT machine (eg, "FRED" or "\\FRED"),
  336.         or a blank string ("") to indicate the local machine.
  337.  
  338.         "message" is an message to be displayed in the shutdown dialog box,
  339.         or a blank string ("") if no message is desired.
  340.  
  341.         "timeout" is the amount of time, in seconds, that a shutdown dialog
  342.         box should be displayed on the specified computer before the computer
  343.         is shut down.  While the dialog is displayed, a countdown timer shows
  344.         the number of seconds remaining, and when it reaches 0 the computer
  345.         is shut down.  "timeout" can be set to 0, in which case no dialog is
  346.         displayed and the computer is shut down immediately.
  347.  
  348.         If "force" is @TRUE, then applications with unsaved data will be
  349.         forcibly closed.  If "force" is @FALSE, then the user will be
  350.         prompted to close such applications, and if the user cancels (or
  351.         doesn't respond) then the computer will not be shut down.
  352.  
  353.         If "reboot" is @TRUE, the computer will be automatically restarted
  354.         after shutting down.  If "reboot" is @FALSE, the system flushes all
  355.         caches to disk, clears the screen, and displays a message indicating
  356.         that it is safe to power down.
  357.  
  358.       In order to shut down a remote computer, the caller must have the
  359.       privilege "Force shutdown from a remote system" (SeRemoteShutdownPrivilege).
  360.  
  361.       Returns 1 on success, or an error.  Note that this function returns
  362.       immediately, so the return value does not indicate whether the computer
  363.       is actually shut down or not.
  364.  
  365.     wntDomainSync(s:server-name, i:request)
  366.       Synchronizes domain controllers.
  367.  
  368.         "server-name" is the UNC name of the PDC (Primary Domain Controller)
  369.         or BDC (Backup Domain Controller) on which the operation will be
  370.         performed (eg, "\\SERVER"), or a blank string ("") to indicate the
  371.         local machine.
  372.  
  373.         "request" specifies the operation to perform, and can be one of the
  374.         following values:
  375.  
  376.           Value   Meaning
  377.           -----   -------
  378.             2     Force replicate on BDC (standard replication).
  379.                   "server-name" should be a BDC.
  380.             3     Force synchronize on BDC (full replication).
  381.                   "server-name" should be a BDC.
  382.             4     Force PDC to broadcast change.  "server-name" should be a PDC.
  383.             5     Force to re-discover trusted domain DCs.
  384.             7     Notify netlogon that a new transport has come online.
  385.  
  386.         Returns 1.
  387.  
  388.     wntAcctPolSet(s:server-name, i:request, i:value)
  389.       Sets account policy information for a server.
  390.  
  391.         "value" is the new value to be set for "request".
  392.  
  393.         See wntAcctPolGet for additional information.
  394.  
  395.         Note: This function can only be performed by members of the
  396.         Administrators or Account Operators local group.
  397.  
  398.         Returns 1.
  399.  
  400.   Fixed a problem with wntFilesOpen possibly crashing.
  401.  
  402.   Changed the error message from "password too short" to "password is
  403.   unacceptable", unless it's clear that the password really is too short
  404.   (Windows returns a "password too short" error for various unrelated error
  405.   conditions).  This affects wntChgPswd, wntUserAdd, and wntUserSetDat.
  406.  
  407.   Fixed a problem with wntAcctInfo(1) returning a SID that only included the
  408.   last subauthority, instead of all of them.
  409.  
  410.  
  411. Windows 95 extender 11007  First showing up in WB 2000A
  412.  
  413.   New functions:
  414.  
  415.     w95ServerInfo(s:server-name, i:request)
  416.       Returns information about a server.
  417.  
  418.         "server-name" is the UNC name of a server (eg, "\\SERVER1"), or a
  419.         blank string ("") to indicate the local machine.
  420.  
  421.         "request" specifies the information about "server-name" to be
  422.         returned, and can be one of the following:
  423.  
  424.            1   (i) major version
  425.            2   (i) minor version
  426.            3   (i) type (see w95ServiceAt for a list of server types)
  427.            4   (s) comment
  428.  
  429.     w95ShareList(s:server-name, i:share-type, i:flags)
  430.       Returns a list of shares on a server.
  431.  
  432.         "server-name" is the UNC name of a server (eg, "\\SERVER1"), or a
  433.         blank string ("") to indicate the local machine.
  434.  
  435.         "share-type" is a bitmask specifying the type(s) of shares that
  436.         should be returned.  It can be set to 0 to return all shares, or it
  437.         can be one or more of the following values combined with the bitwise
  438.         OR ('|') operator:
  439.  
  440.           Value   Share type
  441.           -----   ----------
  442.             1     Disk drive
  443.             2     Print queue
  444.             4     Communication device
  445.             8     Interprocess communication (IPC)
  446.  
  447.         "flags" is reserved for future use and should be set to 0.
  448.  
  449.       This function returns a tab-delimited list of shared resources on a
  450.       server, including hidden shares.
  451.  
  452.       Example:
  453.         w95ShareList("\\SERVER", 1 | 2, 0))
  454.  
  455.     w95ShareUsers(s:server-name, s:share/computer-name, i:share-type, i:format, i:flags)
  456.       Returns a list of users connected to a share or server.
  457.  
  458.         "server-name" is the UNC name of a server (eg, "\\SERVER1"), or a
  459.         blank string ("") to indicate the local machine.
  460.  
  461.         "share/computer-name" specifies either a share name (eg, "PUBLIC")
  462.         on "server-name", or a computer name (eg, "\\FRED").  See explanation
  463.         below.
  464.  
  465.         "share-type" is a bitmask specifying the type(s) of shares that
  466.         should be returned if "share/computer-name" specifies a computer name.
  467.         It can be set to 0 to return all shares, or it can be one or more of
  468.         the following values combined with the bitwise OR ('|') operator:
  469.  
  470.           Value   Share type
  471.           -----   ----------
  472.             1     Disk drive
  473.             2     Print queue
  474.             4     Communication device
  475.             8     Interprocess communication (IPC)
  476.  
  477.         "format" specifies the information that will be returned for each
  478.         connection.  It can be one of the following values (see explanation
  479.         below):
  480.  
  481.           Value   Return format
  482.           -----   -------------
  483.             1     username
  484.             2     netname
  485.             3     username|netname
  486.  
  487.         "flags" is reserved for future use and should be set to 0.
  488.  
  489.       This function can return either a list of users connected to a share,
  490.       or a list of computers connected to a server.  If "share/computer-name"
  491.       specifies a share name, then the function will return a list of users
  492.       connected to that share.  If "share/computer-name" specifies a computer
  493.       name, then the function will return a list of shares on "server-name"
  494.       (filtered by "share-type") to which that computer is connected.
  495.  
  496.       This function returns a tab-delimited list of user names and/or net
  497.       names, depending on "format".  The values returned are as follows:
  498.  
  499.         username:
  500.           If "server-name" is running with user-level security, then
  501.           "username" will be the name of the user who made the connection.
  502.           If "server-name" is running with share-level security, then
  503.           "username" eill be the computer that made the connection.
  504.  
  505.         netname:
  506.           "netname" is the opposite of "share/computer-name".  In other words,
  507.           if "share/computer-name" specifies a share name, then "netname"
  508.           will be the name of the computer connected to that share, and if
  509.           "share/computer-name" specifies a computer name, then "netname"
  510.           will be the name of the share to which that computer is connected.
  511.  
  512.       Example:
  513.         w95ShareUsers("", "PUBLIC", 1, 1, 0)
  514.  
  515.  
  516. Windows 9x extender 10004  First showing up in WB 2000A
  517.  
  518.   New functions:
  519.  
  520.     w9xGetDc(s:server-name, s:domain-name, i:flag)
  521.       Returns the domain controller for a domain.
  522.  
  523.         "server-name" is the UNC name of the NT server on which the function
  524.         will execute (eg, "\\MYSERVER").
  525.  
  526.         "domain-name" is the name of a domain, or a blank string ("") to
  527.         indicate the primary domain.
  528.  
  529.         "flag" must be set to 1:
  530.  
  531.           Flag   Meaning
  532.           ----   -------
  533.             1    Return the primary domain controller for the specified domain
  534.  
  535.         Returns a domain controller name in UNC format (eg, "\\MYSERVER").
  536.  
  537.     w9xRemoteTime(s:server-name, i:format)
  538.       Gets the time of day from a server.
  539.  
  540.         "server-name" is the UNC name of an NT server (eg, "\\SERVER1").
  541.  
  542.         "format" specifies the format in which the time will be returned,
  543.         and can be one of the following values:
  544.  
  545.           Value   Format
  546.           -----   ------
  547.             1     UTC/GMT time, in YYYY:MM:DD:hh:mm:ss format
  548.             2     local time (on local machine), in YYYY:MM:DD:hh:mm:ss format
  549.  
  550.  
  551. WB 2000B  Mar 20, 2000
  552.  
  553.   Compiler now sets the numeric FileVersion and ProductVersion fields to
  554.   match the corresponding string fields.  The strings should be specified as
  555.   a series of up to four numeric fields, delimited by periods or commas or
  556.   spaces (eg, "3.01" or "5,1,2,0" or "2000 1 2".  Any missing or non-numeric
  557.   fields will be converted to 0.
  558.  
  559.   If file specified by #include directive didn't exist, it was incorrectly
  560.   returning an "unable to allocate memory" error.
  561.  
  562.  
  563. DLL 3.0bbv  First showing up in WB 2000B
  564.  
  565.   New IntControls:
  566.  
  567.     IntControl(72, p1, 0, 0, 0)
  568.       Sets Cancel handler.
  569.  
  570.       This IntControl lets you specify what should happen when the next
  571.       Cancel event occurs in the script.
  572.  
  573.         P1  Meaning
  574.         --  -------
  575.         -1   Don't change (just return current setting)
  576.          0   Normal cancel processing (ie, the script exits)
  577.          1   Goto the label :CANCEL
  578.          2   Gosub the label :CANCEL
  579.  
  580.       By default, if you don't use this IntControl at all, then every time a
  581.       Cancel event occurs, WIL does a "Goto Cancel".  The first time you use
  582.       this IntControl, the behavior changes to being a one-time flag, which
  583.       gets reset to 0 after the next Cancel event occurs.
  584.  
  585.       When processing goes to :CANCEL, the following WIL variables are
  586.       automatically set:
  587.  
  588.         Variable                  Type     Meaning
  589.         --------                  ----     -------
  590.         wberrorhandlerline        string   Cancel line (ie, line in script that caused Cancel)
  591.         wberrorhandleroffset      integer  offset into script of Cancel line, in bytes
  592.         wberrorhandlerassignment  string   variable being assigned on Cancel line, or "" if none
  593.  
  594.       Note: The :CANCEL label must be in the same script where the Cancel
  595.       event occurred.  If a Cancel event occurs in a called script, it will
  596.       go to the label in the called script, not the calling script.
  597.  
  598.       Returns previous setting, or -1 if the setting had not previously
  599.       been changed from the default behavior.
  600.  
  601.     IntControl(73, p1, 0, 0, 0)
  602.       Sets Error handler.
  603.  
  604.       This IntControl lets you specify what should happen when the next
  605.       error occurs in the script.
  606.  
  607.         P1  Meaning
  608.         --  -------
  609.         -1   Don't change (just return current setting)
  610.          0   Normal error processing (default)
  611.          1   Goto the label :WBERRORHANDLER
  612.          2   Gosub the label :WBERRORHANDLER
  613.  
  614.       This is a one-time flag, which gets reset to 0 after the next error
  615.       occurs.
  616.  
  617.       When processing goes to :WBERRORHANDLER, the following WIL variables
  618.       are automatically set:
  619.  
  620.         Variable                  Type     Meaning
  621.         --------                  ----     -------
  622.         wberrorhandlerline        string   error line (ie, line in script that caused error)
  623.         wberrorhandleroffset      integer  offset into script of error line, in bytes
  624.         wberrorhandlerassignment  string   variable being assigned on error line, or "" if none
  625.  
  626.       Note: The :WBERRORHANDLER label must be in the same script where the
  627.       error occurred.  If an error occurs in a called script, it will go to
  628.       the label in the called script, not the calling script.
  629.  
  630.       Returns previous setting.
  631.  
  632.   Fixed a problem (introduced in WinBatch 2000A) with WaitForKey not
  633.   detecting some of the special keycodes.
  634.  
  635.   In 32-bit version, if you use IntControl(49) to add system menus to dialog
  636.   boxes, the icon in the title bar will now be the application icon instead
  637.   of a generic Windows icon.
  638.  
  639.   Fixed a problem with DirSize returning incorrect numbers for directories
  640.   containg files larger than 4 gigabytes.
  641.  
  642.  
  643. Windows NT extender 11016  First showing up in WB 2000B
  644.  
  645.   New functions:
  646.  
  647.     wntSvcCreate(s:server, s:string-values, s:numeric-values, s:dependencies, s:reserved)
  648.       Adds a service to the service control manager database.
  649.  
  650.         "server" is the UNC name of the server on which the function will
  651.         execute (eg, "\\MYSERVER"), or "" for the local computer.
  652.  
  653.         "string-values" is a is a tab-delimited or vertical-bar ('|')
  654.         delimited list of string properties for the service being created,
  655.         in the following format:
  656.  
  657.           "ServiceName | DisplayName | BinaryPathName | LoadOrderGroup | ServiceStartName | Password"
  658.  
  659.             (Spaces around the delimiters are permitted, but not necessary.)
  660.  
  661.         "numeric-values" is a is a tab-delimited or vertical-bar ('|')
  662.         delimited list of numeric properties for the service being created,
  663.         in the following format:
  664.  
  665.           "ServiceType | StartType | ErrorControl"
  666.  
  667.             (Spaces around the delimiters are permitted, but not necessary.)
  668.  
  669.         "dependencies" is a tab-delimited or vertical-bar ('|') delimited
  670.         list of dependencies of the service being created.  There should be
  671.         no spaces around the delimiters.
  672.  
  673.         "reserved" is reserved for future use, and should be set to "".
  674.  
  675.       See wntSvcCfgSet for information on the elements specifies in
  676.       "string-values" and "numeric-values".
  677.  
  678.       Returns 1.
  679.  
  680.     wntSvcDelete(s:server, s:service-name, i:flags)
  681.       Marks a service for deletion from the service control manager database.
  682.  
  683.         "server" is the UNC name of the server on which the function will
  684.         execute (eg, "\\MYSERVER"), or "" for the local computer.
  685.  
  686.         "service-name" is the name of a service.
  687.  
  688.         "flags" specifies the type of name that "service-name" represents:
  689.  
  690.              0  display name (the name shown in Control Panel)
  691.           1000  service name (the actual registry key name)
  692.  
  693.       Returns @TRUE on success, or @FALSE if the specified service has
  694.       already been marked for deletion.
  695.  
  696.     wntGroupEdit(s:server-name, s:group, i:group-type, i:request, s/i:value)
  697.       Modifies information about a group.
  698.  
  699.         "server" is the UNC name of the server on which the function will
  700.         execute (eg, "\\MYSERVER"), or "" for the local computer.
  701.  
  702.         "group-type" can be @LOCALGROUP or @GLOBALGROUP.
  703.  
  704.         "request" specifies the element to be modified, and can be the
  705.         following:
  706.  
  707.           Request   Element
  708.           -------   -------
  709.              1      group comment
  710.  
  711.         "value" specifies the new value to be set for the element.
  712.  
  713.         Note: This function can only be performed by members of the
  714.         Administrators or Account Operators local group.
  715.  
  716.         Returns 1.
  717.  
  718.  
  719. WB 2000C  May 3, 2000
  720.  
  721.   Fixed a problem with the compiler sometimes setting the "Src" key in the
  722.   project configuration (.CMP) file to the wrong source file name.
  723.  
  724.   Changed BoxButtonWait to be more responsive to window messages during the
  725.   wait period.
  726.  
  727.  
  728. DLL 3.0cbv  First showing up in WB 2000C
  729.  
  730.   New IntControl:
  731.  
  732.     IntControl(74, p1, 0, 0, 0) (32-bit only)
  733.       Set idle wait after Run commands.
  734.  
  735.         "p1" specifies the amount of time, in milliseconds, that the WIL
  736.         Interpreter will wait, after launching an application with the Run
  737.         (and similar) commands, for the application to become "idle" (ie,
  738.         ready for user input).  The default is 10000 (ie, 10 seconds).
  739.         Specify 0 for no idle wait.
  740.  
  741.       See also IntControl(43).
  742.  
  743.       Returns previous setting.
  744.  
  745.   Added new "function" to WinHelp (32-bit only):
  746.  
  747.     "HTML"   Launches HH.EXE to view a topic in an HTML help (.CHM) file.
  748.              "Keyword" specifies the topic to display, or "" to view the
  749.              starting topic in the file.
  750.  
  751.     Example:
  752.       WinHelp("iexplore.chm", "HTML", "web_collect_favorites.htm")
  753.  
  754.     Which is identical to:
  755.       Run("HH.EXE", "iexplore.chm::/web_collect_favorites.htm")
  756.  
  757.   In AskTextBox, "default" is no longer truncated at 256 characters.  Also,
  758.   a horizontal scroll bar is added if "flag" number 1 is specified.  Also,
  759.   the cursor is now scrolled into view if "flag" number 2 is specified.
  760.  
  761.   WinMetrics(-5) and (-6) now return floating point values (they are no
  762.   longer rounded to an integer).
  763.  
  764.   Added new request to IntControl(54):
  765.  
  766.     P2   Meaning
  767.     --   -------
  768.     -1   Return window's current topmost state (@TRUE = topmost, @FALSE = not)
  769.  
  770.   In 32-bit version, you can now specify a negative number for TimeDelay, in
  771.   which case the negative number will be treated as a positive number (eg,
  772.   -5 will be treated as 5), and an alternate delay routine will be used.
  773.  
  774.   In NT, several functions may not have worked properly after using
  775.   wntRunAsUser to impersonate a different user:
  776.  
  777.     IntControl(58)
  778.     IntControl(67)
  779.     IntControl(68)
  780.     RegLoadHive
  781.     RegUnloadHive
  782.  
  783.   Changed the internal routine used to create delays (eg, to wait for a
  784.   window to appear or a program to finish), so that during the delay the WIL
  785.   Interpreter is now more responsive to window messages.
  786.  
  787.   Fixed a problem with ItemReplace crashing when replacing the last item in
  788.   a list.
  789.  
  790.  
  791. Windows NT extender 11017  First showing up in WB 2000C
  792.  
  793.   wntSvcCreate now prepends '.\' to the specified ServiceStartName, if it
  794.   doesn't already contain a contain a '\' (unless it's "LocalSystem").  This
  795.   matches the behavior of wntSvcCfgSet.
  796.  
  797.  
  798. NetWare 4 extender 14027  First showing up in WB 2000C
  799.  
  800.   n4UserGroups now returns a blank string ("") instead of an error
  801.   if the specified user doesn't belong to any groups.
  802.  
  803.  
  804. WB 2001B  Feb 27, 2001
  805.  
  806.   16-bit version is no longer being developed (so no more references to
  807.   "32-bit only").
  808.  
  809.   Added additional option for IntControl(1007):
  810.  
  811.       p1   Meaning
  812.       --   -------
  813.        4   Modify currently-running script in the system tray
  814.  
  815.     If p1 == 4 (modify icon), then p2 can be one or more of the following
  816.     flags, combined with the bitwise OR ("|") operator:
  817.  
  818.       p2   Meaning
  819.       --   -------
  820.        1   Modify tool tip (p3 specifies the new tool tip)
  821.        2   Modify icon (p4 specifies the new icon file)
  822.  
  823.   IntControl 1004 now returns a full path for uncompiled WinBatch scripts.
  824.  
  825.   The extension for extender data files used by the compiler has been
  826.   changed from ".DAT" to ".EXT".
  827.  
  828.   Fixed some problems with overlapping boxes
  829.  
  830.   Fixed some problems with button focus in boxes.
  831.  
  832.  
  833. DLL 3.2bcb  First showing up in WB 2001B
  834.  
  835.   *** Important: The following changes alter (break) previous behavior ***
  836.  
  837.     In DiskFree and DiskSize, the items in "drive-list" can no longer be
  838.     separated with spaces (in order to now support UNC's containing spaces).
  839.  
  840.     In ItemCount, trailing delimiters are now significant.  This means that
  841.     the comma-delimited list "a,b,c," has 4 items in it.
  842.  
  843.     In ItemInsert, trailing delimiters are now significant.  This means that
  844.     if you specify a blank item ("") and an offset of -1, a blank item will
  845.     be added to the end of the list, even if the list already has a trailing
  846.     delimiter.
  847.  
  848.     The following functions no longer add a trailing delimiter to the
  849.     returned list (some of these are "legacy" functions that are no longer
  850.     documented):
  851.  
  852.       AskFileText
  853.       AskItemList
  854.       ItemSelect
  855.       RegQueryItem
  856.       TextBox
  857.       TextBoxSort
  858.       TextSelect
  859.  
  860.     Changed the format of the string for OLE return types of VT_DECIMAL
  861.     (this was previously undocumented).  The new format is described below.
  862.  
  863.     FileExist now returns @FALSE if the file name contains any '/'
  864.     characters (this change was actually made in WB 99M).
  865.  
  866.   16-bit version is no longer being developed (so no more references to
  867.   "32-bit only").
  868.  
  869.   New -- user-defined functions!
  870.  
  871.     WIL now supports user-defined functions (UDF's).  A UDF is defined as
  872.     follows:
  873.  
  874.       #DefineFunction functname([param1, param2, ..., param16])
  875.         <code>
  876.         Return retval
  877.       #EndFunction
  878.  
  879.       "#DefineFunction" and "#EndFunction" are the keywords indicating the
  880.       beginning and end of the UDF.
  881.  
  882.       "functname" is a placeholder for the name of the function.  The
  883.       function name must begin with a letter, can contain letters, numbers,
  884.       and underscores, and can be up to 30 characters long.  You may not
  885.       use a function name that is the same as the name of a WIL DLL function,
  886.       but you may override a function name that's in an extender DLL.
  887.  
  888.       You may specify up to 16 optional parameters.  "param1" - "param16"
  889.       are placeholders for your actual variable names.  These are the names
  890.       of the variables that your UDF will receive when it is called.
  891.  
  892.       Between the "#DefineFunction" and "#EndFunction" keywords is the code
  893.       that will get executed when the UDF is called.  It may contain a
  894.       Return command followed by a value (or an expression that evaluates to
  895.       a value), in which case the UDF will end and return this value.  If
  896.       you specify a Return command without a value, the UDF will return 0.
  897.       If a UDF does not contain a Return command, it will execute to the end
  898.       of the UDF and return 0.  An Exit command in a UDF will cause the
  899.       entire script to end, not just the UDF.
  900.  
  901.     A UDF must be defined anywhere in a script, as long as it is defined
  902.     prior to being used for the first time.  A UDF may be defined or used in
  903.     a separate script that is called with the Call command, as long as it is
  904.     defined before it is used.  You may not have nested UDF definitions (ie,
  905.     each "#DefineFunction" must be followed by an "#EndFunction" as a pair).
  906.  
  907.     A UDF will not have access to any variables in the main WIL script,
  908.     other than the variables passed as param1 - param16.  Any variables set
  909.     in a UDF will be destroyed when the UDF returns, other than the return
  910.     value of the UDF.  Any percent signs in the UDF code will be expanded at
  911.     runtime (when the code is called), not at define time.
  912.  
  913.     You may return a file handle, binary buffer, OLE object, or array from a
  914.     UDF using the Return command.  However, if you create one of these types
  915.     of objects in your UDF and do not return it using the Return command,
  916.     you are responsible for freeing it before the UDF returns, using the
  917.     appropriate WIL function (ie, FileClose, BinaryFree, ObjectClose, or
  918.     Drop, respectively); otherwise, the object will become an "orphan" and
  919.     will no longer be accessible and may not be automatically freed when the
  920.     script exits.
  921.  
  922.     Example:
  923.  
  924.       ; Define three UDF's
  925.  
  926.       #DefineFunction Done()
  927.         Message("All done", "Script processing is complete")
  928.       #EndFunction
  929.  
  930.       #DefineFunction Square(number)
  931.         Return (number * number)
  932.       #EndFunction
  933.  
  934.       #DefineFunction AddListItem(list, newitem, delimiter)
  935.         list = ItemInsert(newitem, -1, list, delimiter)
  936.         list = ItemSort(list, delimiter)
  937.         Return list
  938.       #EndFunction
  939.  
  940.       ; Now use them
  941.  
  942.       list = "apples,bananas,peaches"
  943.       list = AddListItem(list, "cherries", ",")
  944.       Message("New list", list)
  945.  
  946.       Message("The square of 5 is", Square(5))
  947.  
  948.       Done()
  949.  
  950.   New -- arrays!
  951.  
  952.     WIL now supports arrays.  Arrays are created using the new ArrDimension
  953.     function (see below).  An array may have from 1 to 5 dimensions, and each
  954.     dimension may contain up to 65,535 elements.  Array elements are
  955.     referenced with their subscripts enclosed in square brackets.  If an array
  956.     has more than one dimension, the subscripts are separated with commas.  Eg:
  957.  
  958.       arrayvar[1]
  959.       arrayvar[1, 1]
  960.       arrayvar[0, 5, 2]
  961.  
  962.     Array subscripts are 0-based; ie, the first element in an array is array[0].
  963.  
  964.     Array elements can contain any type of WIL value: string, integer, float,
  965.     etc.  You can have different types of values within an array.
  966.  
  967.     You may not pass an array as a parameter to a WIL function (except for
  968.     functions which state they accept an array), or use it in any sort of
  969.     operation.  For example, the following are NOT legal:
  970.  
  971.       arrayvar = 5                   ; NOT legal
  972.       x = arrayvar                   ; NOT legal
  973.       Message("Value is", arrayvar)  ; NOT legal
  974.  
  975.     On the other hand, the following are all legal:
  976.  
  977.       arrayvar[0] = 5
  978.       x = arrayvar[0]
  979.       Message("Value is", arrayvar[0])
  980.  
  981.     You can pass arrays to user-defined functions, and you can return arrays
  982.     with the Return command.
  983.  
  984.     When you pass an array name (ie, not an array element) as a parameter to
  985.     a function, the array gets passed "by reference".  That is, the function
  986.     receives a pointer to the array, and is therefore able to make changes
  987.     to it "in place".  This is similar to passing a binary buffer handle to
  988.     a function, where the function is then able to make wholesale changes to
  989.     the binary buffer.
  990.  
  991.     In contrast, passing an array element (ie, with a subscript) to a
  992.     function is like passing a regular string or integer parameter to a
  993.     function -- it gets passed "by value".  Ie, the function receives the
  994.     value of the array element, but is not able to modify the array itself.
  995.     By the same token, when you pass a string to a function like StrUpper:
  996.  
  997.       newstring = StrUpper(oldstring)
  998.  
  999.     The function does not modify the variable "oldstring" at all.  If you
  1000.     want to modify the existing variable, you can assign to it the return
  1001.     value of the function, eg:
  1002.  
  1003.       mystring = StrUpper(mystring)
  1004.       array[2] = StrUpper(array[2])
  1005.  
  1006.   New functions:
  1007.  
  1008.     ArrDimension(i:dim1 [, i:dim2 [, i:dim3 [, i:dim4 [, i:dim5]]]])
  1009.       Creates an array.
  1010.  
  1011.       This function creates an array of 1 to 5 dimensions.  Each dimension
  1012.       ("dim1" through "dim5") specifies a dimension size up to 65,535.  At
  1013.       least one dimension must be specified; the other parameters are
  1014.       optional and will default to 0 (ie, unused dimension).  For example:
  1015.  
  1016.         1-dimension array:  array1 = ArrDimension(10)
  1017.         2-dimension array:  array2 = ArrDimension(10, 10)
  1018.         3-dimension array:  array3 = ArrDimension(10, 10, 10)
  1019.         4-dimension array:  array4 = ArrDimension(10, 10, 10, 10)
  1020.         5-dimension array:  array5 = ArrDimension(10, 10, 10, 10, 10)
  1021.  
  1022.       ArrDimension(10) creates a 1-dimension array with a size of 10 (10
  1023.       elements).  Since array subscripts are 0-based, the first element is
  1024.       arrayvar[0] and the last element is arrayvar[9].
  1025.  
  1026.       An array can theoretically contain up to 200,000,000 elements in total.
  1027.       Of course this will be further limited by your available system memory.
  1028.  
  1029.       You can not create embedded arrays (ie, an array within an array).
  1030.  
  1031.       You can use the Drop command to free an array.  This will also Drop
  1032.       any OLE object handles within the array, as well as any WIL string
  1033.       variables.  It will NOT close any file handles or binary buffers.
  1034.  
  1035.       The return value is the array that was created.
  1036.  
  1037.     ArrInfo(a:array, i:request)
  1038.       Gets information about an array.
  1039.  
  1040.       "array" specifies an array.
  1041.  
  1042.       "request" can be one of the following:
  1043.  
  1044.         request   returns
  1045.         -------   -------
  1046.            0      number of dimensions in the array
  1047.            1      number of elements in dimension 1
  1048.            2      number of elements in dimension 2 (or 0 if unused)
  1049.            3      number of elements in dimension 3 (or 0 if unused)
  1050.            4      number of elements in dimension 4 (or 0 if unused)
  1051.            5      number of elements in dimension 5 (or 0 if unused)
  1052.            6      number of elements in the entire array
  1053.  
  1054.     ArrInitialize(a:array, i:value)
  1055.       Initializes an array.
  1056.  
  1057.       "array" specifies an array.
  1058.  
  1059.       "value" specifies an integer value.
  1060.  
  1061.       This function sets all elements of "array" to "value".
  1062.  
  1063.       Returns @TRUE.
  1064.  
  1065.     Arrayize(s:list, s:delimiter)
  1066.       Converts a delimited list to an array.
  1067.  
  1068.         This function takes a delimited list, and creates a one-dimension
  1069.         array with the same number of elements as the number of items in the
  1070.         list, setting each element to the value of the corresponding item in
  1071.         the list.  Ie, it converts a delimited list to an array.
  1072.  
  1073.         Returns the array that was created.
  1074.  
  1075.     RegOpenKeyEx(i:handle, s:subkey-string, s/i:mode, s:reserved-1, s:reserved-2)
  1076.       Opens a registry key with specified access rights.
  1077.  
  1078.         "handle"          handle to a registration database key
  1079.         "subkey-string"   a path from the key provided to the desired key
  1080.         "mode"            access mode (see below)
  1081.         "reserved-1"      reserved for future use; should be set to "".
  1082.         "reserved-2"      reserved for future use; should be set to "".
  1083.  
  1084.       This function is like RegOpenKey, but lets the user specify the desired
  1085.       access rights (RegOpenKey opens a key with default access, so may fail
  1086.       if the user only has read permission for the key).
  1087.  
  1088.       "Mode" may be one of the following pre-defined string values:
  1089.  
  1090.         Value     Name                     Meaning (see below for bit descriptions)
  1091.         -----     ----                     ----------------------------------------
  1092.         "READ"    KEY_READ                 KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS |
  1093.                                            KEY_NOTIFY | STANDARD_RIGHTS_READ
  1094.  
  1095.         "WRITE"   KEY_WRITE                KEY_SET_VALUE | KEY_CREATE_SUB_KEY |
  1096.                                            STANDARD_RIGHTS_WRITE
  1097.  
  1098.         "FULL"    KEY_ALL_ACCESS           (KEY_QUERY_VALUE | KEY_SET_VALUE |
  1099.                                            KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS |
  1100.                                            KEY_NOTIFY | KEY_CREATE_LINK |
  1101.                                            STANDARD_RIGHTS_ALL) & ~SYNCHRONIZE
  1102.  
  1103.       Or, "mode" may be a bitmask comprised of one or more of the following
  1104.       integer values, combined using the bitwise OR ('|') operator:
  1105.  
  1106.         Value     Name                     Meaning
  1107.         -----     ----                     -------
  1108.             1     KEY_QUERY_VALUE          Permission to query subkey data.
  1109.             2     KEY_SET_VALUE            Permission to set subkey data.
  1110.             4     KEY_CREATE_SUB_KEY       Permission to create subkeys.
  1111.             8     KEY_ENUMERATE_SUB_KEYS   Permission to enumerate subkeys.
  1112.            16     KEY_NOTIFY               Permission for change notification.
  1113.            32     KEY_CREATE_LINK          Permission to create a symbolic link.
  1114.  
  1115.       Returns a handle to the newly-opened key.
  1116.  
  1117.     VarType(s:varname)
  1118.       Gets the type of a WIL variable.
  1119.  
  1120.       This function returns the type of WIL variable that "varname"
  1121.       specifies.  The return value will be one or more of the following type
  1122.       flags, combined using the bitwise OR ('|') operator:
  1123.  
  1124.         Type   Meaning
  1125.         ----   -------
  1126.           0    undefined
  1127.           1    integer
  1128.           2    string
  1129.           5    file handle
  1130.          17    OLE object
  1131.          32    floating point value
  1132.          65    binary buffer
  1133.         256    array
  1134.  
  1135.     RegQueryStr(i:handle, s:subkey)
  1136.       Retrieves and expands a string value from the registry.
  1137.  
  1138.         This function can be used to read a REG_SZ or REG_EXPAND_SZ value
  1139.         from the registry.  If the value is a REG_EXPAND_SZ, any environment
  1140.         strings will be expanded to their defined values in the string
  1141.         returned by this function (the registry entry itself is untouched).
  1142.  
  1143.         See RegQueryValue for parameter information.
  1144.  
  1145.         Returns the expanded registry value.
  1146.  
  1147.     FileSizeEx(s:file-list)
  1148.       Finds the total size of a group of files (including open files).
  1149.  
  1150.         This function is like FileSize, but can be used to get the size of
  1151.         files that are open by other applications (which FileSize cannot).
  1152.  
  1153.         See FileSize for additional information.
  1154.  
  1155.  
  1156.     FileCreateTemp(s:prefix)
  1157.       Creates a temporary file.
  1158.  
  1159.         This function creates a 0-byte file with a unique name, in the
  1160.         directory designated for temporary files (as specified by the "TMP"
  1161.         or "TEMP" environment variable).
  1162.  
  1163.         "prefix" specifies a prefix for the file name, up to 3 characters
  1164.         long (the string may be longer than that, but only the first 3
  1165.         characters are used).
  1166.  
  1167.         The temporary file name will have the form:
  1168.  
  1169.           preXXXX.tmp
  1170.  
  1171.         Where "pre" is the prefix specified by the user, and "XXXX" is a
  1172.         4-character hexadecimal string generated to guarantee a unique file
  1173.         name.  The file name will have an extension of ".tmp".
  1174.  
  1175.         The return value is the full path name of the temporary file created.
  1176.  
  1177.         Note that this file will not be automatically deleted by the system.
  1178.  
  1179.     ClipHasFormat(i:format)
  1180.       Determines if the clipboard contains a particular format.
  1181.  
  1182.         This function returns @TRUE if the clipboard contains data in the
  1183.         format specified by "format", or @FALSE if it does not.
  1184.  
  1185.         See BinaryClipGet for a list of clipboard formats.
  1186.  
  1187.     BinaryTagIndex(s:tag-struct, i:mode)
  1188.       Returns the offset of a binary tag in a buffer.
  1189.  
  1190.         mode  returns
  1191.         ----  -------
  1192.           0   offset of text
  1193.           1   offset of start tag
  1194.  
  1195.         This function can be used after a successful BinaryTagFind, to
  1196.         return the offset where the binary tag was found.  It must be used
  1197.         before any subsequent BinaryReplace, since BinaryReplace will change
  1198.         the tag structure.
  1199.  
  1200.         See BinaryTagFind for additional information.
  1201.  
  1202.     BinaryTagLen(s:tag-struct, i:mode)
  1203.       Returns the length of a binary tag.
  1204.  
  1205.         mode  returns
  1206.         ----  -------
  1207.           0   length of text
  1208.           1   length of text + tags
  1209.  
  1210.         This function can be used after a successful BinaryTagFind, to
  1211.         return the length of the text that was found.  It must be used
  1212.         before any subsequent BinaryReplace, since BinaryReplace will change
  1213.         the tag structure.
  1214.  
  1215.         See BinaryTagFind for additional information.
  1216.  
  1217.     BinaryXlate(i:data-buffer, i:table-buffer, i:mode)
  1218.       Converts a binary buffer using a translation table.
  1219.  
  1220.         "data-buffer" is a binary buffer containing data to be converted.
  1221.  
  1222.         "table-buffer" is a binary buffer containing a translation table.
  1223.  
  1224.         "mode" can be one of the following:
  1225.  
  1226.           Mode  Source buffer  Target buffer  Table size
  1227.           ----  -------------  -------------  ----------
  1228.             0        byte           byte           256
  1229.             1        byte           word           512
  1230.             2        word           byte         65536
  1231.             3        word           word        131072
  1232.  
  1233.         This function looks up a byte or word in "data-buffer", uses that
  1234.         number to compute an index into "table-buffer", looks up the byte or
  1235.         word there, and places the result in a temporary buffer.  It does
  1236.         this for each byte or word in "data-buffer".  When it's finished
  1237.         processing "data-buffer", it copies the new (temporary) buffer back
  1238.         to "data-buffer", and sets the binary EOD appropriately.
  1239.  
  1240.         For mode 1, "data-buffer" must be large enough to hold at least
  1241.         twice as much data as is currently in the buffer.
  1242.  
  1243.   New IntControls:
  1244.  
  1245.     IntControl(69, p1, p2, 0, 0)
  1246.       Suspends machine by shutting power down.
  1247.  
  1248.         P1   Meaning (NT/2000 only)
  1249.         --   -------
  1250.          0   hibernate mode
  1251.          1   suspend mode
  1252.  
  1253.         P2   Meaning
  1254.         --   -------
  1255.          0   don't force apps to suspend
  1256.          1   force apps to suspend
  1257.  
  1258.       This IntControl puts the system into standby mode, if supported by the
  1259.       hardware and device drivers.
  1260.  
  1261.     IntControl(75, p1, 0, 0, 0)
  1262.       Gets last dialog coordinates.
  1263.  
  1264.         P1   Meaning
  1265.         --   -------
  1266.          1   Returns last X coordinate
  1267.          2   Returns last Y coordinate
  1268.  
  1269.       This IntControl returns the X or Y coordinate of the most recently
  1270.       displayed dialog (created with the Dialog function), at the time the
  1271.       previous dialog was closed.  Coordinates are in dialog units.  Returns
  1272.       -1 if there was no previous dialog.
  1273.  
  1274.     IntControl(76, p1, 0, 0, 0)
  1275.       Sets the computer name.
  1276.  
  1277.       This IntControl sets the NetBIOS name of the local computer, specified
  1278.       by P1.  The change does not take effect until the computer is restarted.
  1279.  
  1280.       The name may not be longer than 30 characters.  It may contain letters,
  1281.       numbers, and the following symbols:
  1282.  
  1283.         ! @ # $ % ^ & ' ) ( . - _ { } ~
  1284.  
  1285.       In Windows 95/98, if the name contains invalid characters, they will
  1286.       be replaced with valid characters.  In Windows NT/2000, if the name
  1287.       contains invalid characters, the function will fail.
  1288.  
  1289.       Returns @TRUE on success, or @FALSE on failure.
  1290.  
  1291.     IntControl(77, p1, 0, 0, 0)
  1292.       Gets internal operating parameters.
  1293.  
  1294.       This IntControl returns internal values which may be useful in script
  1295.       debugging.  P1 specifies one of the following request codes:
  1296.  
  1297.         Request  Meaning
  1298.         -------  -------
  1299.             0    total memory allocated for strings, in bytes
  1300.            10    number of variables assigned
  1301.            11    number of variable slots available
  1302.            12    tab-delimited list of variables assigned
  1303.            20    number of files open
  1304.            21    number of file slots available
  1305.            30    number of binary buffers open
  1306.            31    number of binary buffer slots available
  1307.            40    number of extenders loaded
  1308.            41    number of extender slots available
  1309.            42    tab-delimited list of extenders loaded
  1310.            50    number of extender functions loaded
  1311.            51    number of extender function slots available
  1312.            60    number of OLE objects open
  1313.            61    number of OLE object slots available
  1314.            70    current structure depth
  1315.            71    current structure slots remaining
  1316.            80    current Call level depth
  1317.            90    number of UDF's defined
  1318.            91    number of UDF slots available
  1319.           100    tab-delimited list of WIL function table entries
  1320.           101    tab-delimited list of parent application function table entries
  1321.           102    tab-delimited list of loaded extender function table entries
  1322.           103    tab-delimited list of UDF's
  1323.  
  1324.       Requests 101, 102, and 103 return a tab-delimited list of table
  1325.       entries.  Each entry consists of a list of fields delimited with an
  1326.       ASCII 255 character, as follows:
  1327.  
  1328.         index
  1329.         entry type:
  1330.           0  BINARYOP
  1331.           1  UNARYOP
  1332.           2  FUNCTION
  1333.           3  CONSTANT
  1334.           4  COMMAND
  1335.           5  COMPOP
  1336.           6  FUNCTBYNAME
  1337.           7  UNDEFINED
  1338.           8  STRUCTOP
  1339.         parameter type mask
  1340.         parameter count OR constant value
  1341.         name length
  1342.         name
  1343.  
  1344.       Returns the indicated integer or string.
  1345.  
  1346.     IntControl(78, 0, 0, 0, 0)
  1347.       Frees all UDF's.
  1348.  
  1349.       This IntControl frees (undefines) all user-defined functions.  It
  1350.       cannot be used while a UDF is currently executing.
  1351.  
  1352.       Returns the number of UDF's that were freed.
  1353.  
  1354.   Changed RegExistKey and RegQueryItem to work if the current user only has
  1355.   read access (not full access) to the specified key.
  1356.  
  1357.   IniItemize / IniItemizePvt no longer has a 32K limit on the size of the
  1358.   returned list.
  1359.  
  1360.   If you specify -1 for the X or Y coordinate of a Dialog, the corresponding
  1361.   coordinate (X or Y) from the most recently displayed dialog will be used.
  1362.   If there was no previous dialog, the dialog will be centered.
  1363.  
  1364.   The file name following an "#include" pre-processor directive no longer
  1365.   needs to be quote-delimited.  Any of the following are now permitted:
  1366.  
  1367.       #include "filename"
  1368.       #include 'filename'
  1369.       #include `filename`
  1370.       #include filename
  1371.  
  1372.     If the file name is not delimited, it may not have any trailing whitespace.
  1373.  
  1374.   Can now pass an OLE object handle as a parameter to an OLE function.
  1375.  
  1376.   DirItemize wasn't returning directory names beginning with a period.
  1377.  
  1378.   Fixed problem with BinaryReplace giving a "Data to store would overrun
  1379.   binary buffer" error when replacing a NULL byte.
  1380.  
  1381.   In BinaryReadEx, if "file-offset" + "count" is larger than the file size,
  1382.   or if "count" is -1, "count" will be ignored and it will be treated as a
  1383.   request to read from "file-offset" to the end of the file.
  1384.  
  1385.   Debug and DebugTrace modes are now reset to @OFF before a Call command,
  1386.   and automatically set back to their previous states after the Call returns.
  1387.   You will need to put Debug and/or DebugTrace commands in the Call'ed script
  1388.   if you want it to be debugged.
  1389.  
  1390.   The Return command can now return a value, by specifying a value (or an
  1391.   expression that evaluates to a value) after the "Return" keyword.  The
  1392.   value or expression may optionally be enclosed in parentheses.  This
  1393.   feature can be used with the Call command, and with the new user-defined
  1394.   functions (see above).  It does not affect the Gosub command.
  1395.  
  1396.     Examples:
  1397.  
  1398.       Return
  1399.       Return (10)
  1400.       Return "Okay"
  1401.       Return myvariable * 10
  1402.       Return (ItemCount(list, @TAB))
  1403.  
  1404.   A script run with the Call command can now return a value by using a
  1405.   Return command with a value (see above).  If a Return command without a
  1406.   value is used, or the called script does not contain a Return command, the
  1407.   called script will return 0.
  1408.  
  1409.     Example:
  1410.       result = Call("other.wbt", "")
  1411.  
  1412.   ClipPut no longer has a 64K limit.
  1413.  
  1414.   Drop and DropWild can accept array names as parameters.
  1415.  
  1416.   IsDefined can accept an array name as a parameter.
  1417.  
  1418.   Fixed crash problem when doing an ObjectClose (or Drop, or variable
  1419.   reassignment) of an OLE object that was assigned to more than one variable
  1420.   name and had already been freed.
  1421.  
  1422.   OLE objects are now automatically attempted to be closed on shutdown.
  1423.   However, if you have a dependent OLE object open (eg, a document within an
  1424.   application), it may prevent the application from being closed.
  1425.  
  1426.   Fixed a problem where, if you assigned an OLE object handle to a second
  1427.   variable and then Drop'ed or reassigned the original variable, the OLE
  1428.   object would be closed and the second variable would therefore no longer
  1429.   refer to a valid OLE object.
  1430.  
  1431.   No longer receive an "unable to process include file" message when running
  1432.   an empty script file.
  1433.  
  1434.   Fixed problem with WallPaper function using tile and stretch options.
  1435.  
  1436.   DiskFree and DiskSize now support UNC's containing spaces (note that the
  1437.   items in "drive-list" can be UNC's corresponding to drives, as well as
  1438.   drive letters).
  1439.  
  1440.   Fixed a problem with AskFileName not bringing the window to the foreground.
  1441.  
  1442.   Fixed a problem with the BinaryTag[..] functions when the found text was
  1443.   larger than 64K.
  1444.  
  1445.   Directory functions now automatically return failure for directory names
  1446.   ending with two backslashes.
  1447.  
  1448.   Added new "select mode" to AskItemList and AskFileText:
  1449.  
  1450.       @extended
  1451.  
  1452.     to allow selection of multiple items by extending the selection with the
  1453.     mouse or shift key.
  1454.  
  1455.   AskItemList and AskFileText now support multiple selection up to 32,767
  1456.   items (previous limit was 100 items).
  1457.  
  1458.   Added additional special characters to the SendKey (and SendKeysTo and
  1459.   SendKeysChild) functions.  These may or may not work for any particular
  1460.   application or situation:
  1461.  
  1462.     Key          SendKey equivalent
  1463.     ---          ------------------
  1464.     Ctrl-Break   {CANCEL}
  1465.     Pause        {PAUSE}
  1466.  
  1467.   OLE now supports return values of type VT_CURRENCY and VT_DECIMAL.  They
  1468.   are returned as strings with prefixes:
  1469.  
  1470.       "#CURRENCY:value"   (VT_CY)
  1471.       "#DECIMAL:value"    (VT_DECIMAL)
  1472.  
  1473.     where 'value' is the decimal or currency value, converted to a string.
  1474.  
  1475.     You can also pass these types as parameters to an OLE function by
  1476.     prefacing the string with the appropriate prefix:
  1477.  
  1478.       Type      Name         Format
  1479.       ----      ----         ------
  1480.       CY        VT_CY        CY:"#CURRENCY:value"
  1481.       DECIMAL   VT_DECIMAL   DECIMAL:"#DECIMAL:value"
  1482.  
  1483.   For FileOpen, increased the maximum number of open files from 5 to 128.
  1484.  
  1485.   For BinaryAlloc, increased the maximum number of current binary buffers
  1486.   from 10 to 128.
  1487.  
  1488.   WinActivChild has been renamed to WinActiveChild (the old name will
  1489.   continue to work).
  1490.  
  1491.   Added new request # to IntControl(71):
  1492.  
  1493.     P1   Meaning
  1494.     --   -------
  1495.      3   Dump WIL variable table to the debug log file.
  1496.  
  1497.   Added new request # to MouseInfo:
  1498.  
  1499.     Req#  Return value
  1500.     ----  ------------
  1501.       9   WinID of top level parent window under mouse
  1502.  
  1503.   Added new flag to AskFileName:
  1504.  
  1505.     3 for Save style, with no "Replace" confirmation.
  1506.  
  1507.   AskFileText no longer truncates lines at 254 characters.  It now uses the
  1508.   line length set by IntControl(65) (4096 characters by default).
  1509.  
  1510.   AskFileText now treats line feeds as line terminators, instead of carriage
  1511.   returns.  It therefore now supports both DOS files (which have CR/LF
  1512.   terminators) and UNIX files (which have LF terminators).
  1513.  
  1514.   Cleared up some confusion with AskDirectory by setting the edit field (if
  1515.   present) to a blank value, so the user will not try appending a
  1516.   subdirectory name to the text in the field.  Any text entered in the edit
  1517.   field is treated as a subdirectory name under the selected directory.
  1518.   Also added a static text field showing the name of the selected directory.
  1519.  
  1520.   In BinaryWriteEx, if you specify -1 for "count", then "handle" and
  1521.   "binary-offset" are now ignored (there was previously a discrepency in the
  1522.   documentation about this).
  1523.  
  1524.   The following functions now return a file time of 1/1/1980 at 00:00:00 if
  1525.   the specified file has an invalid time field:
  1526.  
  1527.     FileTimeCode
  1528.     FileTimeGet
  1529.     FileTimeGetEx
  1530.     FileYmdHms
  1531.  
  1532.   The following file time get functions no longer round the seconds field of
  1533.   the file's time stamp to a multiple of 2 seconds, if a more accurate time
  1534.   format is supported by the operating system:
  1535.  
  1536.     FileTimeGet
  1537.     FileTimeGetEx
  1538.     FileYmdHms
  1539.  
  1540.   The file time compare routines in the following functions no longer round
  1541.   the seconds fields of the files' time stamps to a multiple of 2 seconds,
  1542.   if a more accurate time format is supported by the operating system.  They
  1543.   now compare the full seconds and milliseconds fields of the time stamps:
  1544.  
  1545.     FileCompare
  1546.     FileCopy
  1547.     FileMove
  1548.     InstallFile
  1549.  
  1550.   Fixed a problem with DebugTrace where if you specified a filename that did
  1551.   not include a full path, and then changed directories while the script was
  1552.   running, a new debug file would be written in whatever the current
  1553.   directory was.
  1554.  
  1555.   Changed the output strings for FileTime and TimeDate to more correctly
  1556.   reflect the date and time format preferences set through Control Panel.
  1557.   This also affects the File Overwrite confirmation dialog displayed by
  1558.   FileCopy and FileMove.
  1559.  
  1560.   Changed the following error codes from fatal (3000-) to minor (1000-):
  1561.  
  1562.     Old   New   Error
  1563.     ---   ---   -----
  1564.     3210  1393  Cmd Extender: Out of memory to save result
  1565.     3393  1394  AddExtender: Too many extenders added
  1566.     3394  1395  AddExtender: Extender DLL not found
  1567.     3395  1396  AddExtender: Not a valid extender
  1568.     3396  1399  AddExtender: Extender table full
  1569.     3437  1437  AddExtender: Extender DLL load failed
  1570.  
  1571.   Added an optional parameter to AddExtender:
  1572.  
  1573.     AddExtender(s:filename [, i:required-version])
  1574.  
  1575.       "required-version" is the minimum acceptable version.  If the version
  1576.       of the extender being loaded is less than "required-version", the
  1577.       AddExtender command will fail.  The default value is 0 (ie, no
  1578.       required version).
  1579.  
  1580.   IntControl(73) now works with errors from extenders.
  1581.  
  1582.   Under Windows NT (and Windows 2000), AppExist and AppWaitClose now try to
  1583.   match the root + extension of "program-name", as well as just the root
  1584.   part, against any running application module names.  So if you specify
  1585.   "program.exe", it will match either a module named "program.exe" or a
  1586.   module named "program".
  1587.  
  1588.   Now suppressing a Windows crash error that can occur when doing an
  1589.   ObjectClose on an object that has already been freed by another process.
  1590.  
  1591.   Fixed problem using ObjectOpen after AskFileName.
  1592.  
  1593.   Optimized StrFill.
  1594.  
  1595.   Fixed problem with "multi-type" WIL variables being passed to OLE
  1596.   functions (ie, integers or floating point numbers that had been converted
  1597.   to strings, or vice versa).  If a variable has a floating point value, it
  1598.   will now be passed as a floating point value (even if it also has a string
  1599.   and/or integer value).  If a variable has both an integer and string
  1600.   value, it will now be passed as an integer.
  1601.  
  1602.   Fixed a string memory leak when converting string variables to integers.
  1603.  
  1604.  
  1605. Windows NT extender 32000  First showing up in WB 2001B
  1606.  
  1607.   New functions:
  1608.  
  1609.     wntLsaPolGet(s:server-name, s:class, i:element)
  1610.       Gets LSA (Local Security Authority) policy information.
  1611.  
  1612.         "server-name" is the UNC name of the server on which the function
  1613.         will execute (eg, "\\MYSERVER"), or a blank string ("") to indicate
  1614.         the current machine.
  1615.  
  1616.         "Class" is one of the following:
  1617.  
  1618.           "AuditEvents"
  1619.           "PrimaryDomain"
  1620.           "AccountDomain"
  1621.           "LsaServerRole"
  1622.           "DnsDomain" (Windows 2000 only)
  1623.  
  1624.         For each class, the possible elements are shown:
  1625.  
  1626.           "AuditEvents"
  1627.  
  1628.             -1   Auditing mode (1 if auditing is enabled, 0 if not)
  1629.              0   Event count
  1630.              1+  Audit Category (depending on NT version, use "Event count" to determine):
  1631.  
  1632.                  1  System
  1633.                  2  Logon
  1634.                  3  ObjectAccess
  1635.                  4  PrivilegeUse
  1636.                  5  DetailedTracking
  1637.                  6  PolicyChange
  1638.                  7  AccountManagement
  1639.                  8  DirectoryServiceAccess (Windows 2000)
  1640.                  9  AccountLogon           (Windows 2000)
  1641.  
  1642.               Each audit category returns an integer indicating the
  1643.               auditing options for that category:
  1644.  
  1645.                 0  None
  1646.                 1  Success
  1647.                 2  Failure
  1648.                 3  Success and Failure
  1649.  
  1650.           "PrimaryDomain"
  1651.  
  1652.             1  Name
  1653.             2  Sid
  1654.  
  1655.           "AccountDomain"
  1656.  
  1657.             1  Domain Name
  1658.             2  Domain Sid
  1659.  
  1660.           "LsaServerRole"
  1661.  
  1662.             1  Server Role (2=backup, 3=primary)
  1663.  
  1664.           "DnsDomain" (Windows 2000 only)
  1665.  
  1666.             1  Name
  1667.             2  Dns Domain Name
  1668.             3  Dns Forest Name
  1669.             4  Domain Guid
  1670.             5  Sid
  1671.  
  1672.       Returns a string or integer value.
  1673.  
  1674.     wntLsaPolSet(s:server-name, s:class, i:element, s/i:value)
  1675.       Sets LSA (Local Security Authority) policy information.
  1676.  
  1677.         "server-name" is the UNC name of the server on which the function
  1678.         will execute (eg, "\\MYSERVER"), or a blank string ("") to indicate
  1679.         the current machine.
  1680.  
  1681.         "Class" is one of the following:
  1682.  
  1683.           "AuditEvents"
  1684.           "PrimaryDomain"
  1685.           "AccountDomain"
  1686.           "LsaServerRole"
  1687.           "DnsDomain" (Windows 2000 only)
  1688.  
  1689.         For each class, the possible elements are shown:
  1690.  
  1691.           "AuditEvents"
  1692.  
  1693.             -1   Auditing mode (1 to enable auditing, 0 to disable it)
  1694.              1+  Audit Category (depending on NT version):
  1695.  
  1696.                  1  System
  1697.                  2  Logon
  1698.                  3  ObjectAccess
  1699.                  4  PrivilegeUse
  1700.                  5  DetailedTracking
  1701.                  6  PolicyChange
  1702.                  7  AccountManagement
  1703.                  8  DirectoryServiceAccess (Windows 2000)
  1704.                  9  AccountLogon           (Windows 2000)
  1705.  
  1706.               For each audit category, you may specify one of the following
  1707.               integer values to set the auditing options for that category:
  1708.  
  1709.                 0  None
  1710.                 1  Success
  1711.                 2  Failure
  1712.                 3  Success and Failure
  1713.  
  1714.           "PrimaryDomain"
  1715.  
  1716.             1  Name
  1717.             2  Sid
  1718.  
  1719.           "AccountDomain"
  1720.  
  1721.             1  Domain Name
  1722.             2  Domain Sid
  1723.  
  1724.           "LsaServerRole"
  1725.  
  1726.             1  Server Role (2=backup, 3=primary)
  1727.  
  1728.           "DnsDomain" (Windows 2000 only)
  1729.  
  1730.             1  Name
  1731.             2  Dns Domain Name
  1732.             3  Dns Forest Name
  1733.             4  Domain Guid
  1734.             5  Sid
  1735.  
  1736.       Returns 1.
  1737.  
  1738.     wntUserSidChk(i:request, s:SID, i:reserved-1, i:reserved-2, i:reserved-3)
  1739.       Checks SID's in an access token.
  1740.  
  1741.         This function checks whether the current user's access token
  1742.         contains a given SID.
  1743.  
  1744.         "request":
  1745.  
  1746.           Request   Meaning
  1747.           -------   -------
  1748.              0      Check if the specified SID is present and enabled in the token.
  1749.  
  1750.         "SID" specifies a security identifier, in string form (eg, "S-1-5-32-544",
  1751.         which is the well-known SID of the local Administrators group).
  1752.  
  1753.         The three "reserved" parameters should be set to 0.
  1754.  
  1755.       Returns @TRUE or @FALSE;
  1756.  
  1757.     wntAccessAdd2(s:server-name, s:resource/share-name, s:user/group name, i:object-type, s:access-string)
  1758.       Adds or updates access (permission) records for a resource.
  1759.  
  1760.         This function is like wntAccessAdd, but uses a different method of
  1761.         updating the access control list that may work better on Windows
  1762.         2000 machines.  It can also be used on Windows NT 4.0 machines.
  1763.  
  1764.     wntAuditAdd2(server-name, resource/share-name, user/group name, object-type, access-string)
  1765.       Adds audit records for a resource.
  1766.  
  1767.         This function is like wntAuditAdd, but uses a different method of
  1768.         updating the access control list that may work better on Windows
  1769.         2000 machines.  It can also be used on Windows NT 4.0 machines.
  1770.  
  1771.     wntEventLog(s:server-name, s:text)
  1772.       Writes a "WBMSG" entry to the NT application event log.
  1773.  
  1774.         "server-name" is the UNC name of the server on which the function
  1775.         will execute (eg, "\\MYSERVER"), or a blank string ("") to indicate
  1776.         the current machine.
  1777.  
  1778.         "text" is a string that will be stored with the event, or "" for none.
  1779.  
  1780.       This function will write an event with the message "WBMSG: xxx" to the
  1781.       NT application event log on the specified server, with "xxx" being
  1782.       replaced by the specified "text" string, and with an EventID of 1.
  1783.  
  1784.       This function will attempt to set the following values in the registry
  1785.       on the local machine, to specify the location of the message file:
  1786.  
  1787.         REGEDIT4
  1788.         [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\WBMSG]
  1789.         "EventMessageFile"="c:\\program files\\winbatch\\system\\wwwnt32i.dll"
  1790.         "TypesSupported"=dword:00000004
  1791.  
  1792.       If that key is not writable, or needs to be set on a remote machine,
  1793.       you will need to set those values manually before using this function.
  1794.       Note that the value "EventMessageFile" must be set to the full path of
  1795.       the Windows NT extender DLL.
  1796.  
  1797.       The message file is part of the extender DLL itself.  Since the Event
  1798.       Viewer locks and caches message files being used, you may need to
  1799.       close the Event Viewer before replacing or moving the extender DLL.
  1800.  
  1801.       Returns 1.
  1802.  
  1803.     wntGroupRen(s:server-name, s:group, i:group-type, s:new-name)
  1804.       Renames a group.
  1805.  
  1806.         "server" is the UNC name of the server on which the function will
  1807.         execute (eg, "\\MYSERVER"), or "" for the local computer.
  1808.  
  1809.         "group-type" can be @LOCALGROUP or @GLOBALGROUP.
  1810.  
  1811.         "new-name" specifies the new name for the group.
  1812.  
  1813.         Note: This function can only be performed by members of the
  1814.         Administrators or Account Operators local group.
  1815.  
  1816.         Returns 1.
  1817.  
  1818.   wntOwnerSet wasn't enabling the SE_RESTORE_NAME privilege to allow you to
  1819.   set ownership of an object to a different user.
  1820.  
  1821.   Fixed problem with wntUserAddDat("", "") not freeing some global memory.
  1822.  
  1823.   Fixed problem with wntUserAddDat possibly overwriting part of a different
  1824.   parameter value that had been previously set (with wntUserAddDat).
  1825.  
  1826.   Modified wntAccessAdd and wntAuditAdd to be more compatible with Windows
  1827.   2000 machines (also see new wntAccessAdd2 and wntAuditAdd2 functions).
  1828.  
  1829.   Added new predefined access strings for Windows 2000.  These are the same
  1830.   for files and directories:
  1831.  
  1832.     Access-string           Meaning          Specific equivalent
  1833.     --------------          --------------   -------------------
  1834.     "Win2000:Full"          Full Control     "0:3:2032127"
  1835.     "Win2000:Modify"        Modify           "0:3:1245631"
  1836.     "Win2000:ReadExecute"   Read & Execute   "0:3:1179817"
  1837.     "Win2000:List"          List             "0:2:1179817"
  1838.     "Win2000:Read"          Read             "0:3:1179785"
  1839.     "Win2000:Write"         Write            "0:3:1048854"
  1840.     "Win2000:None"          No Access        "1:3:983551"
  1841.  
  1842.   wntAccessList now returns a sorted list with no duplicate items.
  1843.  
  1844.   wntAccess[..], wntAudit[..], and wntShare[..] functions specifying a
  1845.   printer may have returned an "Access Denied" error, because they were
  1846.   trying to open the printer with an excessive level of access requested
  1847.   (especially under Windows 2000).
  1848.  
  1849.   wntPrivAdd and wntPrivDel may have failed with an "Access Denied" error
  1850.   because they were trying to open the policy object with an excessive level
  1851.   of access requested.
  1852.  
  1853.   Fixed problem with wntMemberLst2 returning users with blank names in local
  1854.   groups (ie, just "domain\").
  1855.  
  1856.   Changed wntServerInfo so that request #'s 1-4 can be called by any user.
  1857.   All other request #'s can can only be called by members of the
  1858.   Administrators or Account Operators local group, or those with
  1859.   Communication, Print, or Server operator group membership.
  1860.  
  1861.   Fixed a problem with wntMemberGrps that could have caused the script to
  1862.   hang if there were a very large number of groups that needed to be processed.
  1863.  
  1864.   Changed wntAccessAdd, wntAccessAdd2, wntAuditAdd, and wntAuditAdd2, so
  1865.   that if you specify one of the recursive object types (301, 302, 303, or
  1866.   401) and the function is unable to modify one of the objects it attempts,
  1867.   it will skip that object and continue, and won't return an error.  The
  1868.   function will return 0 if it was unable to modify an object.
  1869.  
  1870.   Fixed problem with wntRunAsUser with "allow interactive" flag set, where
  1871.   running an application could cause "abnormal termination" error.
  1872.  
  1873.   Added an additional flag to wntRunAsUser:
  1874.  
  1875.     Flag   Meaning
  1876.     ----   -------
  1877.       2    Load user profile into HKEY_USERS\<User SID>
  1878.  
  1879.   Fixed problem with wntAcctPolGet and wntAcctPolSet, where request #3 was
  1880.   getting/setting the password age in seconds rather than days.
  1881.  
  1882.   The wntAccess[..] and wntAudit[..] functions have been improved to work
  1883.   better under Windows 2000.
  1884.  
  1885.  
  1886. Windows 95 extender 32000  First showing up in WB 2001B
  1887.  
  1888.   Fixed a problem with the following enumeration-type functions that could
  1889.   have caused the script to hang if there were a very large number of items
  1890.   (files or shares) that needed to be processed:
  1891.  
  1892.       w95FileClose
  1893.       w95FileUsers
  1894.       w95ShareList
  1895.       w95ShareUsers
  1896.  
  1897.     Note that these functions are limited to using 64K buffers.  If that is
  1898.     not sufficient to accomodate all items, some items will not be processed.
  1899.  
  1900.   Fixed a problem with w95AccessAdd and w95AccessDel not working with a
  1901.   remote machine.
  1902.  
  1903.  
  1904. Windows 9x extender 32000  First showing up in WB 2001B
  1905.  
  1906.   Fixed a problem with w9xMemberGrps that could have caused the script to
  1907.   hang if there were a very large number of groups that needed to be processed.
  1908.  
  1909.  
  1910. WILX extender 32000  First showing up in WB 2001B
  1911.  
  1912.   Removed xCursorSet (not useful in 32-bit versions of Windows).
  1913.  
  1914.   Removed xMemCompact (not useful in 32-bit versions of Windows).
  1915.  
  1916.   Fixed problem with xGetChildHwnd returning the wrong window handle if
  1917.   'child-text' was blank.
  1918.  
  1919.   xBaseConvert now properly handles numbers beginning with a leading '-' or
  1920.   '+' sign.
  1921.  
  1922.  
  1923. WB 2001C  Mar 5, 2001
  1924.  
  1925.  
  1926. DLL 3.2ccb  First showing up in WB 2001C
  1927.  
  1928.   Fixed a problem with the OK button in AskDirectory being disabled under
  1929.   Windows 2000.
  1930.  
  1931.   In OLE functions, fixed a problem handling VT_DATE values outside the
  1932.   range 1/1/1980 to 12/31/2099.
  1933.  
  1934.   RegQueryKeys no longer adds a tab to the end of the list.
  1935.  
  1936.  
  1937. Windows NT extender 32001  First showing up in WB 2001C
  1938.  
  1939.   Fixed a problem with the wntAccess[..] and wntAudit[..] functions
  1940.   returning an Access Denied error.
  1941.  
  1942.   Fixed a problem with wntAccess[..] crashing when specifying a file in a
  1943.   FAT paartition.
  1944.  
  1945.  
  1946. WB 2001D  Mar 6, 2001
  1947.  
  1948.  
  1949. Windows NT extender 32002  First showing up in WB 2001D
  1950.  
  1951.   Fixed a problem with wntAccessList and wntAuditList adding a tab to the
  1952.   end of the list.
  1953.  
  1954.  
  1955. WB 2001E  Mar 8, 2001
  1956.  
  1957.  
  1958. DLL 3.2ecb  First showing up in WB 2001E
  1959.  
  1960.   IniItemizePvt now supports itemizing the sections of Unicode INI files.
  1961.  
  1962.  
  1963. Windows NT extender 32003  First showing up in WB 2001E
  1964.  
  1965.   Fixed a problem with wntAccessDel and wntAuditDel crashing if the only
  1966.   access record for the object was being deleted.
  1967.  
  1968.   Fixed a problem with the wntAccess[..] and wntAudit[..] functions
  1969.   creating ACL's with access records that were incorrectly sequenced.
  1970.  
  1971.  
  1972. WB 2001F  Mar 15, 2001
  1973.  
  1974.  
  1975. DLL 3.3fcc  First showing up in WB 2001F
  1976.  
  1977.   In Windows 95/98, FILELISTBOX controls in dialogs no longer display files
  1978.   or directories marked as hidden or system, unless you first use
  1979.   IntControl(5) to enable that behavior.
  1980.  
  1981.   In Windows NT/2000, FILELISTBOX controls in dialogs now display files and
  1982.   directories marked as hidden or system, if you have first used
  1983.   IntControl(5) to enable that behavior.
  1984.  
  1985.   Fixed a problem with FILELISTBOX controls in dialogs not displaying
  1986.   directories beginning with a '.'.
  1987.  
  1988.  
  1989. WB 2001G  Mar 27, 2001
  1990.  
  1991.   Fixed a problem with BoxButtonWait failing to wait if you had pressed the
  1992.   same button twice without calling BoxButtonStat in between.
  1993.  
  1994.   Fixed a problem with areas of the Box windows not getting repainted
  1995.   properly when the windows were resized.
  1996.  
  1997.   Fixed a problem with OLE objects becoming invalid after being passed as
  1998.   parameters to OLE methods or properties.
  1999.  
  2000.   In FileMenu, the functions FileItemize(""), FileItemPath(""), and
  2001.   DirItemize("") no longer add a trailing delimiter to the list.
  2002.  
  2003.  
  2004. DLL 3.3gcc  First showing up in WB 2001G
  2005.  
  2006.   Fixed a problem where the floating point number 0.0 was being displayed in
  2007.   scientific notation.
  2008.  
  2009.   Fixed a problem with IniItemizePvt returning an extra item with stray
  2010.   characters when itemizing sections in the file, if the file was over 32K.
  2011.  
  2012.   Fixed a problem with the parameter of a Return statement being validated
  2013.   even if the Return was in a conditional block that wasn't being executed.
  2014.  
  2015.   Fixed a problem with ItemInsert, ItemRemove, and ItemReplace removing
  2016.   blank items at the end of the list.
  2017.  
  2018.   Fixed a problem with ItemInsert inserting an item at the wrong position if
  2019.   it were being inserted between blank items at the end of the list.
  2020.  
  2021.   Fixed a problem with ItemReplace not replacing an item following a blank
  2022.   item at the end of the list.
  2023.  
  2024.   Fixed a problem with ItemSort removing blank items from the list.
  2025.  
  2026.  
  2027. Windows NT extender 33001  First showing up in WB 2001G
  2028.  
  2029.   Fixed a problem with wntServerList hanging if the list of servers returned
  2030.   was larger than 64K.
  2031.  
  2032.  
  2033. Windows 9x extender 33001  First showing up in WB 2001G
  2034.  
  2035.   Fixed a problem with w9xServerList hanging if the list of servers returned
  2036.   was larger than 64K.
  2037.  
  2038.  
  2039. WB 2001H  Apr 2, 2001
  2040.  
  2041.   Fixed a problem with the compiler not being able to compile extenders into
  2042.   a large EXE (introduced in 2001G).
  2043.  
  2044.  
  2045. Windows NT extender 33002  First showing up in WB 2001H
  2046.  
  2047.   The wntPriv[..] functions can now be used on a local workstation for
  2048.   domain accounts, by specifying the user/group name in the form
  2049.   "domain_name\account_name".  Note that wntPrivAdd and wntPrivDel require
  2050.   administrator privileges on the local workstation.
  2051.  
  2052.   Fixed a problem with the wntShare[..] functions failing with "access
  2053.   denied" errors when the target object was a printer.
  2054.  
  2055.  
  2056. WB 2001J  May 25, 2001
  2057.  
  2058.   New functions, only when running as a service:
  2059.  
  2060.     SvcSetAccept(i:codes)
  2061.       Specifies the control codes that the service will accept.
  2062.  
  2063.         "codes" can be 0 to specify that no, or it can be one or more of the following control
  2064.         codes, combined using the bitwise OR ('|') operator:
  2065.  
  2066.           Value  Controls accepted              Meaning
  2067.           -----  -----------------              -------
  2068.               1  SERVICE_ACCEPT_STOP            The service can be stopped
  2069.               2  SERVICE_ACCEPT_PAUSE_CONTINUE  The service can be paused and continued
  2070.               4  SERVICE_ACCEPT_SHUTDOWN        The service is notified when system shutdown occurs
  2071.           32768                                 Notify of logoffs.
  2072.  
  2073.       By default, a WinBatch service will accept and automatically process
  2074.       SERVICE_CONTROL_STOP commands.  If you use the SvcSetAccept function,
  2075.       you will be responsible for processing any of the control codes that
  2076.       are received, including SERVICE_CONTROL_STOP (ie, it will no longer
  2077.       be processed automatically).
  2078.  
  2079.       Returns the previous value for "codes", or -1 if not running as a service.
  2080.  
  2081.       See also SvcSetState and SvcWaitForCmd.
  2082.  
  2083.     SvcSetState(i:state)
  2084.       Updates the service control manager's status information for the service.
  2085.  
  2086.         "state" can be one of the following service states:
  2087.  
  2088.           Value  Service state             Meaning
  2089.           -----  ------------              -------
  2090.             1    SERVICE_STOPPED           The service is not running
  2091.             3    SERVICE_STOP_PENDING      The service is stopping
  2092.             4    SERVICE_RUNNING           The service is running
  2093.             5    SERVICE_CONTINUE_PENDING  The service continue is pending
  2094.             6    SERVICE_PAUSE_PENDING     The service pause is pending
  2095.             7    SERVICE_PAUSED            The service is paused
  2096.  
  2097.       Returns the previous state, or -1 if not running as a service.
  2098.  
  2099.       See also SvcSetAccept and SvcWaitForCmd.
  2100.  
  2101.     SvcWaitForCmd(i:timeout)
  2102.       Waits or checks for receipt of a service control code.
  2103.  
  2104.         "timeout" specifies the timeout flag, in milliseconds.
  2105.  
  2106.       If any control codes have been received but not yet processed (using
  2107.       this function), this function immediately returns the value of that
  2108.       control code.  WinBatch maintains a list of up to 16 unprocessed
  2109.       control codes that have been received, and this function returns the
  2110.       first (oldest) one in the list, then clears that code from the list,
  2111.       so the next time this function is called it will return the next
  2112.       control code in the list, if any.
  2113.  
  2114.       If there are no unprocessed control codes in the list, the behavior
  2115.       depends on the value specified by "timeout".  If "timeout" is -1, the
  2116.       function will wait until a control code is received, and then return
  2117.       its value.  If "timeout" is 0, the function will immediately return a
  2118.       value of 0.  If "timeout" is any other value, then it specifies a
  2119.       timeout period (in milliseconds), and the function will wait until
  2120.       a control code is received or until the timeout period elapses,
  2121.       whichever comes first.  If a control code is received before the
  2122.       timeout period elapses, the function will return its value, otherwise
  2123.       it will time out and return 0 indicating no control code was received.
  2124.  
  2125.       The following control codes may be returned:
  2126.  
  2127.           Value  Control code              Meaning
  2128.           -----  ------------              -------
  2129.               1  SERVICE_CONTROL_STOP      Requests the service to stop
  2130.               2  SERVICE_CONTROL_PAUSE     Requests the service to pause
  2131.               3  SERVICE_CONTROL_CONTINUE  Requests the paused service to resume
  2132.               5  SERVICE_CONTROL_SHUTDOWN  Requests the service to perform cleanup tasks, because the system is shutting down
  2133.         128-255                            User-defined control code
  2134.           32768                            Logoff notification
  2135.  
  2136.       Returns 0 or a control code value, or -1 if not running as a service.
  2137.  
  2138.       See also SvcSetState and SvcWaitForCmd.
  2139.  
  2140.   The compiler now properly handles "#include" directives with leading
  2141.   whitespace (ie, indented with spaces or tabs).
  2142.  
  2143.   The compiler now properly handles double byte characters in the
  2144.   customizable version strings.
  2145.  
  2146.  
  2147. DLL 3.3jcc  First showing up in WB 2001J
  2148.  
  2149.   New IntControl:
  2150.  
  2151.     IntControl(79, p1, p2, p3, 0)
  2152.       Causes a user-defined error.
  2153.  
  2154.         P1 = severity, which can be one of the following:
  2155.  
  2156.           -1  minor error
  2157.           -2  moderate error
  2158.           -3  severe error
  2159.  
  2160.         P2 = error code, which must be a number between 7000 and 7999.
  2161.  
  2162.         P3 = error message, which is a string describing the error.
  2163.  
  2164.       Returns 1.
  2165.  
  2166.   Fixed a problem with Arrayize crashing with large lists.
  2167.  
  2168.   In ItemLocate you can now specify a delimiter of "" to indicate a tab.
  2169.  
  2170.   Fixed a problem with Drop not returning a value.  It now returns 1, as
  2171.   documented.
  2172.  
  2173.   Fixed a problem with AppExist no longer working after being called
  2174.   thousands of times.
  2175.  
  2176.   The Print command now ignores the "waitflag" parameter, as documented.
  2177.  
  2178.   Fixed a problem converting strings like "-.2", where a signed floating
  2179.   point decimal value did not have a 0 before the decimal point.
  2180.  
  2181.   Fixed a problem handling OLE object names longer than 30 characters where
  2182.   the variable name (the part before the '.') contained an underscore.
  2183.  
  2184.   ShortcutDir now supports registry strings of type REG_EXPAND_SZ.
  2185.  
  2186.   Increased the maximum number of open OLE objects from 20 to 128.
  2187.  
  2188.  
  2189. Windows NT extender 33003  First showing up in WB 2001J
  2190.  
  2191.   New functions:
  2192.  
  2193.     wntAccessMod()
  2194.  
  2195.     wntAuditMod()
  2196.  
  2197.   wntMemberList() now accepts an optional parameter to allow members of
  2198.   local groups to be returned with domain and/or server information (as a
  2199.   prefix before the user/group name, e.g. "domain\user",
  2200.   "domain\global-group" or "server\user").
  2201.  
  2202.   Improved support for managing permissions and auditing of printer objects
  2203.   (e.g. traditionally called "printers") and printer shares, and added new
  2204.   pre-defined access strings for printer objects and printer shares.
  2205.  
  2206.   wntMemberList now properly returns domain names and/or server names for
  2207.   standalone systems and workstations.
  2208.  
  2209.   wntAccess[..] and wntAudit[..] functions specifying a registry key may
  2210.   have returned an "Access Denied" error, because they were trying to open
  2211.   the key with an excessive level of access requested.
  2212.  
  2213.   Fixed a problem with the wntShare[..] functions, where specifying a
  2214.   printer name or printer share as "resource/share-name" didn't work
  2215.   properly.
  2216.  
  2217.  
  2218. Windows 9x extender 33003  First showing up in WB 2001J
  2219.  
  2220.   Fixed a problem with the w9xShare[..] functions, where specifying a
  2221.   printer name or printer share as "resource/share-name" didn't work
  2222.   properly.
  2223.  
  2224.  
  2225. WB 2001K  Jun 1, 2001
  2226.  
  2227.   Changed SvcWaitForCmd to use less CPU time.
  2228.  
  2229.  
  2230. DLL 3.3kcc  First showing up in WB 2001K
  2231.