home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / sharewar / winbatch / winbatch.exe / fixes.tx_ < prev    next >
Encoding:
Text File  |  2002-01-22  |  116.3 KB  |  2,966 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(server-name, resource, object-type, request, flags)
  2194.     wntAuditMod(server-name, resource, object-type, request, flags)
  2195.  
  2196.       server-name:
  2197.  
  2198.         Same as "server-name" as used in wntAccessAdd() and wntAuditAdd()
  2199.  
  2200.       resource:
  2201.  
  2202.         For object type 300, a file or folder specified with either a drive
  2203.         letter specification or a UNC specification.
  2204.  
  2205.         For object type 400, a registry handle that points to
  2206.         an open registry key.
  2207.  
  2208.       object-type:
  2209.  
  2210.         300   file [either a drive letter or a UNC spec]
  2211.         400   registry key handle [for a local registry key]
  2212.  
  2213.         No other object types are valid with wntAccessMod() and wntAuditMod().
  2214.  
  2215.         Please note that registry key handles must have been obtained by opening
  2216.         a registry key on the local system.  Registry key handles for registry
  2217.         keys on remote systems cannot be processed by this function.  Attempting
  2218.         to modify the ACL inheritance flags for a remote registry key will result
  2219.         in an error being returned.
  2220.  
  2221.       request:
  2222.  
  2223.         1     For WinNT, remove all explicit ACEs from all child objects [e.g
  2224.               subfolders & files or subkeys] and then re-propagate all inheritable
  2225.               ACEs from the specified folder or key to all child objects under the
  2226.               specified folder or key.  In effect, this resets the security on a
  2227.               tree of folders & files or subkeys and makes it consistent with  the
  2228.               DACL or SACL settings of the parent folder at the root of that branch
  2229.               of the folder hierarchy on a volume or a branch of the registry.
  2230.  
  2231.               For Win2K, re-enable either DACL or SACL inheritance on all child
  2232.               objects, remove all explicitly assigned ACEs on all child objects
  2233.               then re-propagate all inheritable ACEs to all child objects.
  2234.  
  2235.         2     For Win2K only, disable either DACL or SACL inheritance on the specified
  2236.               object.  If Bit 0 in the flags mask is clear then all currently inherited
  2237.               ACEs will be converted to explicit ACEs.  If Bit 0 in the flags mask is
  2238.               set then all currently inherited ACEs will be removed.  All child objects
  2239.               will have their DACLs or SACLs updated as necessary to reflect the possible
  2240.               changes in their parent object's DACL or SACL w/respect to inheritable ACE
  2241.               changes.
  2242.  
  2243.         3     For Win2K only, re-enable either DACL or SACL inheritance on the specified
  2244.               object.  If Bit 0 in the flags mask is clear then all explicitly asisgned
  2245.               ACEs will be kept.  If Bit 0 in the flags mask is set then all explicity
  2246.               assigned ACEs will be removed.  All child objects will have their DACLs or
  2247.               SACLs updated as necessary to reflect the possible changes in their parent
  2248.               object's DACL or SACL w/respect to inheritable ACE changes.
  2249.  
  2250.               Please note that Request #3 cannot be used with the root folder of
  2251.               a network drive letter that is connected to a share that does not
  2252.               share out the root of a physical drive letter.  The reason for this
  2253.               is that it is impossible to get the DACL or SACL from the specified
  2254.               folder's parent in order to determine if the specified folder should
  2255.               inherit any inheritable ACEs from the parent folder's DACL or SACL.
  2256.               This same problem will occur if a UNC specification is passed in and
  2257.               the UNC spec only contains the server and share information [e.g. no
  2258.               subfolder information] and the share does not share the root of a
  2259.               physical disk drive on the server.  Attempting to re-enable the ACL
  2260.               inheritance for either the DACL or SACL of a folder whose parent
  2261.               folder cannot be accessed will result in an error being generated.
  2262.  
  2263.               For example, we have a workstation computer named WS1 and server named
  2264.               SRV1.  Server SRV1 has a local drive named D: and there is a user share
  2265.               named JOHN_DOE that shares out the directory D:\HOME\JOHN_DOE.  If the
  2266.               user "johndoe" logs in on WS1 and connects the drive letter H: to the
  2267.               share \\SRV1\JOHN_DOE and then tries to use wntAccessMod() with request
  2268.               #3 and passes in "H:\" as the value for "resource" then the function
  2269.               will return an error.  The reason for this is that it is impossible for
  2270.               wntAccessMod() [being executed in a script on WS1] to get the DACL of
  2271.               the folder "D:\HOME" on SRV1.  If the DACL of "D:\HOME" on SRV1 is not
  2272.               obtainable then wntAccessMod() cannot determine if there any ACEs in
  2273.               the DACL of "D:\HOME" on SRV1 that are inheritable by "D:\HOME\JOHN_DOE"
  2274.               and thus need to be propagated to the DACL of "D:\HOME\JOHN_DOE".  This
  2275.               same problem would occur if the value of "resource" had been specified
  2276.               as "\\SRV1\JOHN_DOE" [as opposed to something like "H:\FOLDER1" or
  2277.               "\\SRV1\JOHN_DOE\FOLDER1", both of which would be OK because the parent
  2278.               of "FOLDER1" could be accessed to find inheritable ACEs to add to the
  2279.               DACL or SACL of "FOLDER1"].
  2280.  
  2281.       flags:
  2282.  
  2283.         This is a bit masked integer value.  The effects caused by having various
  2284.         bits set or cleared varies with the particular request # that has been
  2285.         specified.  Refer to the documentation of the various request #'s in order
  2286.         to determine which flags values are valid in any particular situation.
  2287.  
  2288.   wntMemberList() now accepts an optional parameter to allow members of
  2289.   local groups to be returned with domain and/or server information (as a
  2290.   prefix before the user/group name, e.g. "domain\user",
  2291.   "domain\global-group" or "server\user").
  2292.  
  2293.   Improved support for managing permissions and auditing of printer objects
  2294.   (e.g. traditionally called "printers") and printer shares, and added new
  2295.   pre-defined access strings for printer objects and printer shares.
  2296.  
  2297.   wntMemberList now properly returns domain names and/or server names for
  2298.   standalone systems and workstations.
  2299.  
  2300.   wntAccess[..] and wntAudit[..] functions specifying a registry key may
  2301.   have returned an "Access Denied" error, because they were trying to open
  2302.   the key with an excessive level of access requested.
  2303.  
  2304.   Fixed a problem with the wntShare[..] functions, where specifying a
  2305.   printer name or printer share as "resource/share-name" didn't work
  2306.   properly.
  2307.  
  2308.  
  2309. Windows 9x extender 33003  First showing up in WB 2001J
  2310.  
  2311.   Fixed a problem with the w9xShare[..] functions, where specifying a
  2312.   printer name or printer share as "resource/share-name" didn't work
  2313.   properly.
  2314.  
  2315.  
  2316. WB 2001K  Jun 1, 2001
  2317.  
  2318.   Changed SvcWaitForCmd to use less CPU time.
  2319.  
  2320.  
  2321. WB 2001M  Aug 8, 2001
  2322.  
  2323.   BoxesUp was returning positive values on success, other than @TRUE.
  2324.  
  2325.  
  2326. DLL 3.3mcc  First showing up in WB 2001M
  2327.  
  2328.   New function:
  2329.  
  2330.     DllLastError()
  2331.       Returns the most recent error returned by a DllCall to a Win32 API.
  2332.  
  2333.         If you call this function after using DllCall to call a Win32 API
  2334.         function which set a "last-error code" value (or another function
  2335.         which used the "SetLastError" API to set a last-error code), this
  2336.         function will return that value.
  2337.  
  2338.         Returns an integer.
  2339.  
  2340.   Decimals() was not returning the previous setting.
  2341.  
  2342.   IntControl 56 could not be used to kill a service.
  2343.  
  2344.   BinaryPeekStr no longer returns an error if "offset" is within the binary
  2345.   buffer but "offset + maxsize" is past the end of the binary buffer.
  2346.  
  2347.   Statements such as "If x" and "While x", where 'x' is a floating point
  2348.   number that is too large or small to convert to an integer, no longer
  2349.   return an error.
  2350.  
  2351.   Fixed a problem with the Run[..] commands crashing with very long command
  2352.   lines.
  2353.  
  2354.   Fixed problem with Arrayize with large lists.
  2355.  
  2356.   IntControl 45 is now enabled for Windows 95/98/ME, which should result in
  2357.   faster SendKey and SendKeysTo to DOS windows on those platforms.  This
  2358.   functionality is now the same on all Windows platforms.  If the "SendKey
  2359.   speedup" causes a problem, you can turn it off with IntControl(45,0,0,0,0).
  2360.  
  2361.   In ArrInitialize, "value" may now be an integer, floating point, or string.
  2362.  
  2363.   Fixed problem with Debug and DebugTrace displaying an incorrect result on
  2364.   a line of the form "If ... Then Call(...)".
  2365.  
  2366.   Fixed problem with DebugTrace causing an "Unrecognised Request" error in
  2367.   WIL applications other than WinBatch.
  2368.  
  2369.  
  2370. Windows NT extender 33005  First showing up in WB 2001M
  2371.  
  2372.   New function:
  2373.  
  2374.     wntSecurityGet(server-name, resource, object-type, request, flags)
  2375.  
  2376.       server-name:
  2377.  
  2378.         Same as "server-name" as used in wntAccessAdd() and wntAuditAdd()
  2379.  
  2380.       resource:
  2381.  
  2382.         For object type 300, a file or folder specified with either a drive
  2383.         letter specification or a UNC specification.
  2384.  
  2385.         For object type 400, a registry handle that points to
  2386.         an open registry key.
  2387.  
  2388.       object-type:
  2389.  
  2390.         300   file [either a drive letter or a UNC spec]
  2391.         400   registry key handle [for a local registry key]
  2392.  
  2393.         No other object types are valid with wntAccessQuery() and wntAuditQuery().
  2394.  
  2395.       request:
  2396.  
  2397.         1     For Win2K, return @TRUE if the specified object has the protected [D|S]ACL flag
  2398.               set.  Please note that top level registry keys and root folders on
  2399.               NTFS volumes will generally have this flag enabled, but their children will have
  2400.               this flag disabled.  A protected DACL or SACL means that ACEs may not be inherited
  2401.               from the object's parent.
  2402.  
  2403.               If Bit 0 in the flags mask is clear then the permission [e.g. DACL] protected
  2404.               flag value will be queried.
  2405.  
  2406.               If Bit 0 in the flags mask is set then the audit [e.g. SACL] protected flag
  2407.               value will be queried.
  2408.  
  2409.               For WinNT this function will always return @FALSE since ACL inheritance is not
  2410.               implemented on WinNT and thus the concept of a protected DACL/SACL does not exist
  2411.               on WinNT.
  2412.  
  2413.  
  2414.         2     For Win2K, return @TRUE if the specified object has a [D|S]ACL that is marked as
  2415.               having been auto-inherited from the object's parent.
  2416.  
  2417.               If Bit 0 in the flags mask is clear then the permission [e.g. DACL] auto-inherited
  2418.               flag value will be queried.
  2419.  
  2420.               If Bit 0 in the flags mask is set then the audit [e.g. SACL] auto-inherited flag
  2421.               value will be queried.
  2422.  
  2423.               For WinNT this function will always return @FALSE since ACL inheritance is not
  2424.               implemented on WinNT and thus the concept of an auto-inherited DACL/SACL does not
  2425.               exist on WinNT.
  2426.  
  2427.  
  2428.         3     For both WinNT and Win2K, return @TRUE if the specified object has a [D|S]ACL present.
  2429.  
  2430.               If Bit 0 in the flags mask is clear then the permission [e.g. DACL] presence flag
  2431.               value will be queried.
  2432.  
  2433.               If Bit 0 in the flags mask is set then the audit [e.g. SACL] presence flag value
  2434.               will be queried.
  2435.  
  2436.  
  2437.         4     For both WinNT and Win2K, return @TRUE if the specified object has a default [D|S]ACL.
  2438.  
  2439.               If Bit 0 in the flags mask is clear then the permission [e.g. DACL] defaulted flag
  2440.               value will be queried.
  2441.  
  2442.               If Bit 0 in the flags mask is set then the audit [e.g. SACL] defaulted flag value
  2443.               will be queried.
  2444.  
  2445.  
  2446.         5     For both WinNT and Win2K, return the number of ACEs present in the [D|S]ACL.  If there
  2447.               is no [D|S]ACL present then zero (0) will be returned.
  2448.  
  2449.               If Bit 0 in the flags mask is clear then the # of ACEs in the permission list [e.g. DACL]
  2450.               will be returned.
  2451.  
  2452.               If Bit 0 in the flags mask is set then the # of ACEs in the audit list [e.g. SACL] will be
  2453.               returned.
  2454.  
  2455.  
  2456.         6     For both WinNT and Win2K, return the number of bytes that are free in the [D|S]ACL.  If
  2457.               there is no [D|S]ACL present then zero (0) will be returned.
  2458.  
  2459.               If Bit 0 in the flags mask is clear then the # of free bytes in the permission list [e.g.
  2460.               DACL] will be returned.
  2461.  
  2462.               If Bit 0 in the flags mask is set then the # of free bytes in the audit list [e.g. SACL]
  2463.               will be returned.
  2464.  
  2465.  
  2466.         7     For both WinNT and Win2K, return the number of bytes that are used in the [D|S]ACL.  If
  2467.               there is no [D|S]ACL present then the value that will be returned will be the # of bytes
  2468.               that are required to store an ACL structure with zero ACEs in it.
  2469.  
  2470.               If Bit 0 in the flags mask is clear then the # of used bytes in the permission list [e.g.
  2471.               DACL] will be returned.
  2472.  
  2473.               If Bit 0 in the flags mask is set then the # of used bytes in the audit list [e.g. SACL]
  2474.               will be returned.
  2475.  
  2476.  
  2477.         8     For both WinNT and Win2K, return @TRUE if the group SID value associated with the
  2478.               ownership of the object has been supplied through some default mechanism instead
  2479.               of having been directly assigned to the object.
  2480.  
  2481.               The flags mask value is ignored for this request number.
  2482.  
  2483.  
  2484.         9     For both WinNT and Win2K, return @TRUE if the owner SID value associated with the
  2485.               ownership of the object has been supplied through some default mechanism instead
  2486.               of having been directly assigned to the object.
  2487.  
  2488.               The flags mask value is ignored for this request number.
  2489.  
  2490.       flags:
  2491.  
  2492.         This is a bit masked integer value.  The effects caused by having various
  2493.         bits set or cleared varies with the particular request # that has been
  2494.         specified.  Refer to the documentation of the various request #'s in order
  2495.         to determine which flags values are valid in any particular situation.
  2496.  
  2497.   wntAccessMod and wntAuditMod now support registry keys (object type 400)
  2498.   on the local system.
  2499.  
  2500.   Improved the way the wntAccess[..] and wntAudit[..] functions handle
  2501.   registry key branches (object type 401), to solve "Access Denied" errors.
  2502.  
  2503.   wntAccessAdd2 and wntAuditAdd2 have been removed.
  2504.  
  2505.   Fixed problem accepting the group name "Everyone" as a parameter on
  2506.   non-English versions of Windows.
  2507.  
  2508.  
  2509. WB 2001N  Aug 31, 2001
  2510.  
  2511.   Fixed a resource (handle) leak in SvcWaitForCmd.
  2512.  
  2513.  
  2514. DLL 3.3ncc  First showing up in WB 2001N
  2515.  
  2516.   BinaryPeekStr now returns a blank string instead of an error if "offset"
  2517.   is set to the binary EOD and "maxsize" is 0.
  2518.  
  2519.   Fixed a problem with DirSize crashing with excessively long (illegal)
  2520.   directory names.  It now ignores (skips) invalid directory names.
  2521.  
  2522.   Fixed a problem with ShortcutInfo returning an invalid value for "hotkey"
  2523.   if the shortcut had a non-blank description and did not have a hotkey set.
  2524.  
  2525.   In ShortcutEdit, you can now specify "-1" for "target", "params", or
  2526.   "start-dir" to set NULL values.
  2527.  
  2528.   In ShortcutExtra, you can now specify "-1" for "description", "hotkey", or
  2529.   "icon-file" to set NULL values.
  2530.  
  2531.   In IntControl 34, if you specify -1 for "p1" it will return the string
  2532.   corresponding to the last extender error or user-defined error.
  2533.  
  2534.   New parameter type "huge number", used by several functions (below).  This
  2535.   is a long decimal number string, which may represent a number too large to
  2536.   be converted to an integer.  If the number is larger than 2147483647, it
  2537.   must be a string.
  2538.  
  2539.   Added an optional "format" parameter to DirSize, FileSize, and FileSizeEx:
  2540.  
  2541.       DirSize(dir-name, flags [, format])
  2542.       FileSize(file-list [, format])
  2543.       FileSizeEx(file-list [, format])
  2544.  
  2545.     This controls the format in which the size is returned if it is too large
  2546.     to be returned as an integer.  The default format, 0, is floating point.
  2547.     If you specify "format" of 1, the size will be returned as a huge number.
  2548.  
  2549.   BinaryReadEx and BinaryWriteEx now accept a huge number for "file-offset".
  2550.  
  2551.   In a Switch statement, a "Case" keyword followed by an invalid expression
  2552.   will now cause an error.
  2553.  
  2554.  
  2555. WB 2001P  Dec 10, 2001
  2556.  
  2557.  
  2558. DLL 3.4pcd  First showing up in WB 2001P
  2559.  
  2560.   New function:
  2561.  
  2562.     RunWithLogon(s:program-name, s:params, s:directory, i:display mode, i:waitflag, s:username, s:domain, s:password, i:logon-flags) (Windows 2000/XP only)
  2563.       Runs a program as a specified user
  2564.  
  2565.         "username" specifies the name of the user account to log on to.  If
  2566.         you use the UPN format (user@DNS_domain_name), "domain" must be a
  2567.         blank string ("").
  2568.  
  2569.         "domain" specifies the name of the domain or server whose account
  2570.         database contains the "username" account. If this parameter is a
  2571.         blank string, "username" must be specified in UPN format.
  2572.  
  2573.           Windows XP: If "domain" is ".", the function validates the account
  2574.           using only the local account database.
  2575.  
  2576.         "password" specifies the password for the "username" account.
  2577.  
  2578.         "logon-flags" can be 0, or one of the following values:
  2579.  
  2580.           Value  Name                       Meaning
  2581.           -----  ----                       -------
  2582.             1    LOGON_WITH_PROFILE         Log on, then load the user's profile. Loading the profile
  2583.                                             can be time-consuming, so it is best to use this value
  2584.                                             only if you must access the user's profile information.
  2585.  
  2586.             2    LOGON_NETCREDENTIALS_ONLY  Log on, but use the specified credentials on the
  2587.                                             network only. This value can be used to create a process
  2588.                                             that uses a different set of credentials locally than it
  2589.                                             does remotely. This is useful in inter-domain scenarios
  2590.                                             where there is no trust relationship.
  2591.  
  2592.       See RunShell for additional information.
  2593.  
  2594.   IsDefined and VarType now return -1 (instead of an error) if the specified
  2595.   name is a function name or other reserved word.
  2596.  
  2597.   New data types for BinaryOleType:
  2598.  
  2599.     3  byte array  (VT_UI1 | VT_ARRAY)
  2600.     4  I1  pointer (VT_I1 | VT_BYREF)
  2601.     5  I2  pointer (VT_I2 | VT_BYREF)
  2602.     6  I4  pointer (VT_I4 | VT_BYREF)
  2603.     7  UI1 pointer (VT_UI1 | VT_BYREF)
  2604.     8  UI2 pointer (VT_UI2 | VT_BYREF)
  2605.     9  UI4 pointer (VT_UI4 | VT_BYREF)
  2606.  
  2607.   Added support for OLE functions that return byte arrays (variant type =
  2608.   VT_UI1 | VT_ARRAY).  In this case, the function will copy the data to a
  2609.   newly-allocated binary buffer of the required size, with the binary EOD
  2610.   properly set, and the return value will be the binary buffer handle.
  2611.   The user is responsible for freeing this binary buffer.
  2612.  
  2613.   BinaryReadEx was returning 1 instead of 0 for a 0-byte file.
  2614.  
  2615.   If the following clipboard functions are unable to open the clipboard,
  2616.   they will now retry for up to 30 seconds:
  2617.  
  2618.     BinaryClipGet
  2619.     BinaryClipPut
  2620.     ClipAppend
  2621.     ClipGet
  2622.     ClipGetEx
  2623.     ClipHasFormat
  2624.     ClipPut
  2625.     SnapShot
  2626.  
  2627.   Added support for OLE variant types VT_I1, VT_UI1, VT_UI2, and VT_UI4.
  2628.  
  2629.   Fixed a problem with BinaryReplace replacing text past the binary EOD.
  2630.  
  2631.   Fixed a problem with the following functions crashing if the space bar and
  2632.   Esc keys were pressed simultaneously:
  2633.  
  2634.     AskFileText
  2635.     AskItemList
  2636.     AskTextBox
  2637.     ItemSelect
  2638.     TextBox
  2639.     TextBoxSort
  2640.     TextSelect
  2641.  
  2642.   In FileVerInfo, if you specify a blank string for "language-key" it will
  2643.   now additionally try to look up the item under the language key
  2644.   "000004B0" (Neutral, Unicode).
  2645.  
  2646.   Added two optional parameters to ShortcutDir:
  2647.  
  2648.     ShortcutDir(s:name [, i:source [, i:add-slash]])
  2649.  
  2650.       "source" specifies the location from which the information will be
  2651.       retrieved:
  2652.  
  2653.         source  location
  2654.         ------  --------
  2655.            0    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders (default)
  2656.            1    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
  2657.  
  2658.       "add-slash": if @TRUE, a backslash will be appended to the returned
  2659.       string if it doesn't already have a trailing backslash.  The default
  2660.       is @FALSE.
  2661.  
  2662.   Added a new request # to DirWindows:
  2663.  
  2664.     2 = shared Windows directory on a multi-user system (Windows 2000 and XP only).
  2665.  
  2666.       On other versions of Windows, this will return the same value as request 0.
  2667.  
  2668.   Fixed a problem with the StrFix[..] functions with "length" > 64K.
  2669.  
  2670.   Changed the behavior of IconReplace and IntControl(37).  Instead of
  2671.   replacing an individual icon image in an EXE file, they now replace
  2672.   multiple images in an icon group in an EXE file.  An icon group is a set
  2673.   of one or more associated icon images, of different dimensions and color
  2674.   depths.  An EXE file can contain multiple icon groups; an icon (.ICO) file
  2675.   contains a single icon group.  The difference betwwen the two functions is
  2676.   that IconReplace will modify the first icon group in the EXE, while
  2677.   IntControl(37) lets you specify which icon group to modify.  The "p3"
  2678.   parameter in IntControl(37) now specifies the ordinal position of the icon
  2679.   group to modify.  In both cases, each icon image in the targeted icon
  2680.   group in the EXE file is compared with each icon image in the specified
  2681.   .ICO file, and if the .ICO file contains an icon image whose size (and
  2682.   dimensions and color depth) is the same as the targeted icon image in the
  2683.   EXE, then the targeted icon image in the EXE is replaced with the
  2684.   corresponding icon image from the .ICO file.  If no suitable replacement
  2685.   icon is found in the .ICO file, then that particular icon image in the EXE
  2686.   is left unchanged.  The return value of the function is the number of
  2687.   icon images in the EXE that were successfully replaced.
  2688.  
  2689.   Added an additional optional parameter to the following shortcut functions:
  2690.  
  2691.       ShortcutEdit(link-name, target, params, start-dir, show-mode [, i:shortcut-type])
  2692.       ShortcutExtra(link-name, description, hotkey, icon-file, icon-index [, i:shortcut-type])
  2693.       ShortcutInfo(link-name [, i:shortcut-type])
  2694.       ShortcutMake(link-name, target, params, start-dir, show-mode [, i:shortcut-type])
  2695.  
  2696.     "shortcut-type" specifies the type of shortcut, and can be one of the following:
  2697.  
  2698.       Type  Meaning
  2699.       ----  -------
  2700.         0   Normal shortcut (default)
  2701.         1   Folder shortcut (Windows 2000/XP only)
  2702.  
  2703.     An extension of ".LNK" is assumed for "link-name" for normal shortcuts,
  2704.     but not for folder shortcuts.
  2705.  
  2706.   In AskFileName, if you specify a blank string ("") for "directory", the
  2707.   current working directory will be used.
  2708.  
  2709.  
  2710. Windows NT extender 34005  First showing up in WB 2001P
  2711.  
  2712.   New function:
  2713.  
  2714.     wntLastErrMsg()
  2715.       Retrieves the error message text for an extender error.
  2716.  
  2717.   Fixed problem with wntShareAdd under non-English versions of
  2718.   WinNT/Win2K.
  2719.  
  2720.   wntAccessList and wntAuditList now strip off the domain
  2721.   "NT AUTHORITY\".
  2722.  
  2723.   Added a new optional flag parameter to wnt[Access|Audit][Add|Del|Get].
  2724.  
  2725.   Added new flags to wnt[Access|Audit]List.
  2726.  
  2727.   Added a new request number (#2) to wntAcctInfo.
  2728.  
  2729.   Added a new optional flags parameter to wntAcctInfo.
  2730.  
  2731.   Changed wntOwnerSet so that if the 'account-name' parameter's value is an
  2732.   empty string [e.g. ""], then the current user's account-name will be used
  2733.   as the value for this parameter.
  2734.  
  2735.   Improved/corrected the way wntOwnerSet handles folder/file and registry
  2736.   key objects under Win2K.
  2737.  
  2738.   Changed the flags that are valid for wntOwnerGet.
  2739.  
  2740.   Added a new optional flags parameter to wntOwnerSet.
  2741.  
  2742.   Added a flag to enable the display of a progress dialog box for
  2743.   wnt[Access|Audit][Add|Del|Mod] and wntOwnerSet.
  2744.  
  2745.   wntOwnerSet can now perform recursive processing of an entire folder &
  2746.   file hierarchy or a branch of the registry, by specifying new object types
  2747.   301, 302, 303 and 401.
  2748.  
  2749.   wntOwnerGet and wntOwnerSet now support printer objects [object-type =
  2750.   200].
  2751.  
  2752.   Improved the way wnt[Access|Audit][Add|Del|Mod] and wntOwnerSet handle
  2753.   excessively long path names for recursive file object types 301, 302, and
  2754.   303.
  2755.  
  2756.   wntLsaPolGet and wntLsaPolSet now support named LSA Private Data Objects,
  2757.   using the new class name "PrivateData".
  2758.  
  2759.   Changed wnt[Access|Audit][Add|Del], wntAccessMod, and wntOwnerSet so that
  2760.   recursive operation failures that used to return an error 575 now return 0
  2761.   instead.
  2762.  
  2763.   Fixed a problem with wntRunAsUser with flag 1 hanging under Windows XP.
  2764.  
  2765.   Fixed problem with DLL not loading on NT 3.51.
  2766.  
  2767.   For wntShutdown, you can now specify a "timeout" of -1 to indicate that a
  2768.   time delayed shutdown request should be aborted, provided that the time
  2769.   delay has not already expired.
  2770.  
  2771.  
  2772. WB 2002A  Dec 24, 2001
  2773.  
  2774.   Added warning message to compiler when attempting to use an improper
  2775.   icon.
  2776.  
  2777.   Fixed problem in Winbatch Studio with new BinaryBuffer/Array views.
  2778.  
  2779.  
  2780. DLL 3.5acd  First showing up in WB 2002A
  2781.  
  2782.  
  2783. WB 2002B  Jan 22, 2001
  2784.  
  2785.   New function:
  2786.  
  2787.     BoxBitmap(box ID, coordinates, filename, stretch-mode)
  2788.       Displays a bitmap in a WinBatch box.
  2789.  
  2790.         (s) "filename" specifies the name of a BMP file.
  2791.  
  2792.         (i) stretch-mode specifies the mode to use when resizing the bitmap,
  2793.         and can be one of the following:
  2794.  
  2795.           Value  Name          Meaning
  2796.           -----  ----          -------
  2797.             1    BLACKONWHITE  Performs a Boolean AND operation using the color values for the
  2798.                                eliminated and existing pixels.  If the bitmap is a monochrome bitmap,
  2799.                                this mode preserves black pixels at the expense of white pixels.
  2800.  
  2801.             2    WHITEONBLACK  Performs a Boolean OR operation using the color values for the
  2802.                                eliminated and existing pixels.  If the bitmap is a monochrome bitmap,
  2803.                                this mode preserves white pixels at the expense of black pixels.
  2804.  
  2805.             3    COLORONCOLOR  Deletes the pixels.  This mode deletes all eliminated lines of pixels
  2806.                                without trying to preserve their information.
  2807.  
  2808.             4    HALFTONE      Maps pixels from the source rectangle into blocks of pixels in the
  2809.                                destination rectangle.  The average color over the destination block
  2810.                                of pixels approximates the color of the source pixels.  Supported on
  2811.                                Windows NT/2000/XP only.
  2812.  
  2813.           The stretching mode defines how the system combines rows or
  2814.           columns of a bitmap with existing pixels.  The BLACKONWHITE and
  2815.           WHITEONBLACK modes are typically used to preserve foreground
  2816.           pixels in monochrome bitmaps.  The COLORONCOLOR mode is typically
  2817.           used to preserve color in color bitmaps.  The HALFTONE mode is
  2818.           slower and requires more processing of the source image than the
  2819.           other three modes, but produces higher quality images.
  2820.  
  2821.  
  2822. DLL 3.5bcd  First showing up in WB 2002B
  2823.  
  2824.   New IntControl:
  2825.  
  2826.     IntControl(80, 0, 0, 0, 0)
  2827.       Waits until no keys on the keyboard are pressed.
  2828.  
  2829.         Returns 1.
  2830.  
  2831.   IgnoreInput is now supported on Windows 98/ME/2000/XP.  It will return -1
  2832.   if run on an unsupported platform.  Also you can now specify a "flag" of
  2833.   -1 to query the current state.
  2834.  
  2835.   Fixed problem with ArrInitialize not freeing any previous string values in
  2836.   the array.
  2837.  
  2838.   Added additional special characters to the SendKey (and SendKeysTo and
  2839.   SendKeysChild) functions.  These may or may not work for any particular
  2840.   application or situation:
  2841.  
  2842.       Key                              SendKey equivalent
  2843.       ---                              ------------------
  2844.       Print Screen                     {PRTSC}
  2845.  
  2846.       Left Alt key, standalone         {LALT}
  2847.       Right Alt key, standalone        {RALT}
  2848.       Left Control key, standalone     {LCONTROL}
  2849.       Right Control key, standalone    {RCONTROL}
  2850.       Left Shift key, standalone       {LSHIFT}
  2851.       Right Shift key, standalone      {RSHIFT}
  2852.       Left Windows key, standalone     {LWIN}
  2853.       Right Windows key, standalone    {RWIN}
  2854.       Applications key, standalone     {APPS}
  2855.  
  2856.       Left Alt key, combination        {*LALT}
  2857.       Right Alt key, combination       {*RALT}
  2858.       Left Control key, combination    {*LCONTROL}
  2859.       Right Control key, combination   {*RCONTROL}
  2860.       Left Shift key, combination      {*LSHIFT}
  2861.       Right Shift key, combination     {*RSHIFT}
  2862.       Left Windows key, combination    {*LWIN}
  2863.       Right Windows key, combination   {*RWIN}
  2864.       Applications key, combination    {*APPS}
  2865.  
  2866.     "Standalone" means the key is pressed and then released.  "Combination"
  2867.     means the key is held down while the following key is pressed.
  2868.  
  2869.     The left and right Alt, Control, and Shift keys can only be
  2870.     distinguished on Windows NT/2000/XP.  On other platforms they are
  2871.     treated as plain Alt, Control, and Shift keys, respectively.
  2872.  
  2873.     The "Windows" and "Applications" keys are on the Microsoft Natural
  2874.     keyboaard.
  2875.  
  2876.   Fixed a problem with empty WIL scripts causing an error, especially under
  2877.   Windows XP.
  2878.  
  2879.   Added an optional "format" parameter to DiskFree and DiskSize:
  2880.  
  2881.       DiskFree(drive-list [, format])
  2882.       DiskSize(drive-list [, format])
  2883.  
  2884.     This controls the format in which the size is returned if it is too large
  2885.     to be returned as an integer.  The default format, 0, is floating point.
  2886.     If you specify "format" of 1, the size will be returned as a huge number.
  2887.  
  2888.   Changed error 3385 ("DiskExist: Invalid Disk Argument") to 1385.
  2889.  
  2890.  
  2891. Windows NT extender 35001  First showing up in WB 2002B
  2892.  
  2893.   New functions:
  2894.  
  2895.     wntPrivUsers(server-name, privilege[, output-format-flag])
  2896.  
  2897.       This function accepts a privilege name as input and returns a list of
  2898.       account names [or SID strings] that have been granted that privilege.
  2899.  
  2900.     wntSvcList(server-name, service/group-name, flags)
  2901.  
  2902.       This function allows services to be listed.  On Win2K [and newer]
  2903.       systems, it is possible to selectively list services based on the
  2904.       groups to which they belong, based on the service type, and based on
  2905.       the service status.  On WinNT [and newer] systems it is possible to
  2906.       list services based on service types and service status.  On WinNT
  2907.       [and newer] systems it is possible to list all services [by type and
  2908.       status] that are dependent on a specified service.
  2909.  
  2910.   The following functions can now accept SID strings in place of group
  2911.   names.  They can also return SID strings in place of account names for
  2912.   either all SIDs or only for SIDs that cannot be resolved to account names:
  2913.  
  2914.       wntMemberDel
  2915.       wntMemberGet
  2916.       wntMemberGrps
  2917.       wntMemberList
  2918.       wntMemberSet
  2919.       wntGroupDel
  2920.       wntGroupEdit
  2921.       wntGroupInfo
  2922.       wntGroupRen
  2923.       wntListGroups
  2924.       wntPrivAdd
  2925.       wntPrivDel
  2926.       wntPrivGet
  2927.       wntPrivList
  2928.       wntRasUserGet
  2929.       wntRasUserSet
  2930.       wntUserDel
  2931.       wntUserExist
  2932.       wntUserGetDat
  2933.       wntUserList
  2934.       wntUserProps
  2935.       wtUserSetDat
  2936.       wntUserRename
  2937.       wntWtsUserGet
  2938.       wntWtsUserSet
  2939.  
  2940.   The following functions now accept 2 new object types, 500 and 501:
  2941.  
  2942.       wntAccessAdd
  2943.       wntAccessDel
  2944.       wntAccessGet
  2945.       wntAccessList
  2946.       wntAuditAdd
  2947.       wntAuditDel
  2948.       wntAuditGet
  2949.       wntAuditList
  2950.  
  2951.     Object type 500 is for window station objects and object type 501 is for
  2952.     desktop objects.  It is now possible to manipulate the security settings
  2953.     on window stations and desktops.  Currently there is no function to
  2954.     list/enumerate window stations and desktop on the system, so you have to
  2955.     already know the name of the window station &| desktop that you want to
  2956.     manipulate.  The default window station associated the keyboard, monitor &
  2957.     mouse [e.g. the console window station] is "WinSta0".  The default desktop
  2958.     on the console window station named "Default", and it is referred to as
  2959.     "WinSta0\Default".  All desktop objects must have their corresponding
  2960.     window station name prefixed onto them so that the format of the name is
  2961.     "window-station\desktop".
  2962.  
  2963.   The functions wntSvcCfgGet() and wntSvcCfgSet() have been modified.  On
  2964.   Win2K [and newer systems] they are now capable of getting & setting
  2965.   service descriptions and service failure recovery settings.
  2966.