                      UNIMAINT CHANGE HISTORY

******************************* V1.0a *******************************

The items fixed in Version 1.0a are:

1. There was a potential problem in 1.0 if a new file was selected
before the data for a key was written to the file. This turned out to
not be a problem.

2. If INIMAINT was closed in a minimized condition, the correct
window size and location were not stored. This has been fixed.

3. The SIZE calculation for All Groups was incorrect if a single
Application was included in more than one Group. This has been fixed.

4. If the Help Instance could not be created because the INIHELP.HLP
file was not found, the user only got a 5101 logic error. The Dump
Dialog has been changed to add a line that gives the reason for any
outstanding logic error.

5. The PM Error Text was not displayed when there was a PM Error.
OS/2 1.3 with CSD WR5050 has a bug in this area and will not display
the correct text. The text will now be displayed.

6. When an error was encountered during Help Instance Initialization,
the help error code was not stored in the Help Error area. This has
now been fixed.

7. INIMAINT would not run at all if there was a problem initializing
the Help. It will now run, but no Help will be available.

******************************* V1.0b *******************************

The items fixed in Version 1.0b are:

1. More of the Help has been done, the missing Help is now that for
the Dialog Boxes.

2. When run under OS/2 2.0 a Message Queue Full error was being
encountered. This was fixed by increasing the Message Queue from the
default 10 to 30.

******************************* V1.0c *******************************

The items fixed in Version 1.0c are:

1. A Dump message logging facility was added so that problems with
message sequences could be logged and identified.

2. Because of a problem in OS/2 2.0 the return from setting the top
index in a listbox is incorrect. The check for a valid return from
this API call has been removed so that INIMAINT will run under OS/2
2.0.

******************************* V1.0d *******************************

The items fixed in Version 1.0d are:

1. When INIMAINT first comes up, the LOGO box does not have the Focus
and the Enter Key will not close it, it can only be closed using the
Mouse. The Focus is not forced to the LOGO Dialog during initial
window processing.

2. The Dump Dialog will not fit on a 640x480 VGA Screen. To fix this
the Dump dialog was made 20 pels shorter.

3. The filling of the Listboxes, the MLE and the Size calculation all
have the capability to run for some time, especially under OS/2 2.0,
and they block any processing of messages during this period. These
functions have been moved to a separate thread.

4. Choosing Menu Items such as Size, Copy and Move cause a Dialog box
to appear with the selections. The Selections are now a menu, not a
dialog.

5. If there is a lot of data to be inserted into the MLE, the MLE
blinks a lot. The window is now be disabled during the data insertion.

6. If Size is selected and then Canceled, a Size of 20 bytes was
displayed. This has been fixed.

7. The buttons in the New File Dialog were in uppercase, but now are
lower case.

8. If a New File is selected on a diskette drive that has no
diskette, a terminal error resulted. Now a Message Box will be
presented and the old drive will remain the current drive.

9. Selecting an empty VDISK drive got a terminal error. This has been
fixed.

10. You could not Cancel a Copy without selecting a target file. This
has been fixed.

11. When the contents of the Dump Dialog were written to a file, the
values of the various error indicators, which are displayed at the
top of the Dialog, were not written. This has been fixed.

12. If a non-INI file is selected and it causes INIMAINT to
terminate, then the program would not restart, because it attempted to
use the same file and continued to get the same error. The user is
now informed the file is invalid and given a chance to select a new
file to edit.

13. When opening a new INI file to edit, the check for a valid INI
file was not sufficient to identify the bad file during the file
selection process. This has not been fixed and any file that gets
through the file selection will be a valid INI file.

14. If a Drive was selected and the root directory was empty,
INIMAINT would terminate attempting to fill the file Listbox. This
has now been fixed.

15. When editing the any line of a multiline entry in the Key
Value MLE while in overtype mode, as opposed to insert mode,
the following line had the initial characters deleted. This has been
fixed.

16. When the Focus was removed from the INIMAINT window, the
Titlebars of both Listboxes stayed in a highlighted condition. This
has been fixed and the colors of the Titlebars will now behave
correctly.

17. Since no user input is accepted while the Listboxes are being
filled, the MLE is being reset, a Size is being calculated or a Move
or Copy are in progress, the Pointer should be changed to an
hourglass pointer, this was not working, but has been fixed.

18. The Help has been finished.

19. There was a problem with seeing the pointer in the MLE under OS/2
2.0, so a call to WinSetOwner setting the Main Client window as the
Owner of the MLE was added to fix the problem.

******************************* V1.0e *******************************

The items fixed in Version 1.0e are:

1. Copy an Entire File got a return of 10 from the Copy program. This
has been fixed.

2. The MOVE/COPY in Progress Dialog did not display the word
Move/Copy. This has been fixed.

3. The MOVE/COPY did not verify that the target file was a valid INI
file. This will now be done and an Error Message box will be
displayed if the COPY/MOVE cannot be done.

4. The smallest item that could be MOVEed or COPYed was an
Application. It is now possible to COPY/MOVE an individual key.

5. Considerably more Help has been added.

6. Accelerator Keys have been implemented and added to the Help.

7. If a New File was selected and either the OS2.INI or OS2SYS.INI
files were specified without the initial path information, INIMAINT
did not recognize them as the User and System INI files and attempted
to open them in an incorrect manner. This has been fixed.

8. If a COPY/MOVE was attempted and either the OS2.INI or OS2SYS.INI
files were specified as the target without the initial path
information, INIMAINT did not recognize them as the User and System
INI files and attempted to open them in an incorrect manner. This has
been fixed.

9. If an INI file was selected that had no Applications in it, the
INIMAINT window would not appear. This has been fixed.

10. It was not possible to cancel the Add Application or Add Key
without getting the Message Box saying that something had to be
entered. The Cancel will now work correctly.

11. The Listboxes and MLE would flash excessively. This will no
longer occur.

12. When in the Dump Dialog, it was not possible to change the name
of the Dump File by simply typing in the Filename Entry Field. This
will now work and the new filename will become the Dump File for
future Dumps.

13. When the Help was open, the Title Bars of the smaller INIMAINT
windows appeared to still have the focus because they were
highlighted. This will no longer occur.

14. When in the Replace Key Dialog and the key value was longer than
what could be displayed in the Listbox, any change to the value would
cause the contents of the ASCII and Hex Entry Fields would shift to
the very end of the value data. This has been fixed.

15. INIMAINT was not using the Logo Display Time that is set by the
user in the Control Panel, but was using an internal 10 second
display time. This has been changed so that the Control Panel value
will now be used. Even with a value specified in the Control Panel,
it is still possible to turn off the Initial Logo Display with the
Options Dialog.

******************************* V1.0f *******************************

The items fixed in Version 1.0f are:

1. The Menus did not show the Accelerator Keys, this information has
been added to the appropriate menu items.

2. Because of a bug in handling Timers, INIMAINT would get an error
when run under OS/2 2.0 and the About Dialog was dismissed. This has
been fixed by changing the Parent of the About box when it is invoked
from the Menu.

3. The Help indicated that there was an Accelerator key that would
directly pull down the COPY or MOVE menus. This was an error and has
been removed from the Help file.

4. When a COPY/MOVE was attempted for the Selected Application or
Selected Key and either of the Selected Names had an embedded blank,
then the COPY?MOVE would terminate with an Error=5 from the INICOPY
program. This has been fixed.

5. The Error Message Box displayed when an invalid INI file was
selected did not include the error message, this has been fixed.

6. When an invalid INI file was selected, INIMAINT would not close
the file, therefore, no other process could use the file. This has
been fixed.

******************************* V1.0g *******************************

The items fixed in Version 1.0g are:

1. The Dump to a file could get a Trap D and could dump some garbage
messages because it was going past the end of the Message table. This
has been fixed.

2. A message sequence number has been added to the dump of messages.

3. When doing a MOVE/COPY the Wait Pointer was not set correctly when
the pointer was over the Listboxes or MLE. This has been fixed.

4. If a Group was deleted, a hole was left in the menu items that
include the Groups. This has been fixed.

5. When things were MOVEd from an INI file to another file, the
Listboxes were not updated to reflect the fact that the MOVEd items
were no longer in the Source INI file. This has been fixed and the
Listboxes will be automatically updated after the MOVE.

6. The supplemental error text was not always complete if an error
occurred during a MOVE/COPY operation. This has been fixed.

7. V1.0f displayed a Version number of 1.0e. V1.0g will show the
correct version.

8. When the last Key for an Application was moved to another INI
file, the Application entry was not deleted and an Application with
no Keys was left in the file. INIMAINT will now check to see if a
MOVE Key is being done for the last Key and promote it to a MOVE
Application, so that the Application entry will be removed from the
Source INI file.

9. The Groups Dialog did not redisplay the Group that was being
displayed when the last Group Update was done. This has been fixed.

******************************* V1.1  *******************************

The items fixed in Version 1.1 are:

1. The System Default Accelerator keys did not work because the
System Commands were not getting to the Main Window Frame. This has
been fixed.

2. The Registration code was added.

3. When an input string was requested, the user was asked to 'Select'
something. This has been changed to ask the user to 'Enter' the
information.

******************************* V1.1a  *******************************

The items fixed in Version 1.1a are:

1. The supplemental error text was not correctly filled in when there
was an error during a COPY/MOVE. This has been fixed.

2. It was possible to get a Trap D when selecting a New INI File
because dynamic memory was released prematurely. This has been fixed.

******************************* V1.1b  *******************************

The items fixed in Version 1.1b are:

1. It was possible to get a Trap D while the MLE was formatting a
long entry if an attempt was made to make a selection in one of the
Listboxes or an attempt was made to change the MLE. Now any such
attempt will cause an error tone and the action will be rejected
until all updating has been done.

2. There were some relatively rare situations where dynamic memory
blocks were not being freed, the that amount of memory used would
slowly grow. This has been fixed.

3. In order to better track potential memory problems, a dump of the
contents of the heap has been added to the Dump window and more
complete listing will be written to the Dump File.

4. Under certain circumstances, INIMAINT would put Keys in the
OS2.INI file for the INI File Maintenance Application that had NULL
Values. This will no longer occur, although it did not cause any
problem other than put unneeded items in the INI file.

5. There are certain Applications and/or Keys that cannot be deleted
from the OS2SYS.INI file. When an attempt was made to Delete or MOVE
one of these entries, INIMAINT would terminate. Additional code has
been inserted that will identify these conditions, inform the user
and then continue.

6. Under OS/2 2.0 INIMAINT would terminate with an error 109 after
the About INIMAINT Dialog box was displayed. This was caused by
static variables that were not correctly initialized after the first
use of the dialog. This has been fixed.

7. The Spooler, and perhaps other sections of OS/2 protect certain
areas of the INI files, especially the System INI file, thus making
it impossible to remove certain Keys from the files, even though the
Keys are associated with things that are no longer on the Desktop. In
order to facilitate these efforts, a new capability has been added to
INIMAINT that allows the user to change the User and/or System INI
files to a different file. The user can then edit the original file
as he wishes and then switch back. This must be done with much care
in order to avoid causing a system problem, but the capability can be
extremely important when attempting to recover from conditions where
the operating system has created conflicting or other conditions that
can be corrected no other way.

******************************* V1.1c  *******************************

The items fixed in Version 1.1c are:

1. The Main Window Menu Items for changing the User and System INI
files have been moved from the Actions Menu to a new Menu, Recover.
It is intended that additional capabilities will be added to give the
user the ability to recover from corrupted INI files and those
capabilities will be added to this menu. In addition, the Actions
Menu was getting crowded.

2. Two new items have been added to the Action Menu. Rename Key will
change the name of an existing Key and Duplicate Key will make a
duplicate copy of a Key Value using a different Key Name.

******************************* V1.1d  *******************************

The items fixed in Version 1.1d are:

1. The New File and Exit Menus have been combined into a single Menu
called File. This was done for two reasons, first, the number of menu
items was becoming too large and, second, a new file type function
was added, see below.

2. Since there are a number of different conditions that could modify
an INI file that is currently being viewed using INIMAINT, the
ability to reload an INI file from disk has been added. It is the
Refresh selection on the File Menu.

3. There was an error in Error Message 13 in the INICOPY program.

4. It was not possible to select a Application/Key pair when the Key
Value was zero length i.e.., there was no Value, only the Application
and Key Names. This has been fixed.

5. It was not possible to COPY/MOVE and INI file that had an
Application/Key pair with a zero length Key Value. This has been
fixed.

6. When Adding or Replacing a Key Value, the ability to specify that
a zero termination character is to be added to the Key Value can now
be indicated with a Checkbox.

7. The most common files that INIMAINT is asked to display are the
User and System INI files. In order to make it easy to select these
files, two new entries have been added to the File Menu that allow
for direct selection of these two files without having to use the
file selection dialog.

8. Some of the dialog procedures did not initialize static data
causing a new use of the same dialog to behave in unexpected ways.
This has been fixed.

9. A new item has been added to the Options that gives users the
ability to have the Application and Key Listboxes loaded in the same
sequence as the actual INI file as opposed to alpha sequence.

******************************* V1.1e  *******************************

The items fixed in Version 1.1e are:

1. When the menu item was used to switch to the User or System INI
files, the new file information was not saved. The effect of this was
that the next time INIMAINT was run, it would go back to the previous
INI file. This has been fixed.

2. INIMAINT can now be started with a Command Line parameter
specifying the initial INI file for this execution of INIMAINT. This
not only allows INIMAINT to be run with a parameter, but also allows
for it to be run by double clicking on an INI file, if the
association has been set up, and allows for running INIMAINT by
dropping an INI file on the ICON on the Desktop.

3. For versions of OS/2 prior to 2.0, there is no provision for
setting up file associations. Therefore a new item has been added to
the FILE Menu that will set up an association between INIMAINT and
all files whose file extensions are INI. This option will not appear
on the menu if the version is 2.0 or higher.

4. There are some key values which are very long, therefore, they
take a long time to load into the MLE. It is often the case that the
user does not even want to see the key value and would prefer to
switch to another key name. However, it was necessary to wait until
the MLE was filled and then wait again until all of the lines were
removed from the MLE. It is now possible to terminate the loading of
the key value lines into the MLE by hitting the ESC key while the MLE
is loading. The current Application and Key names will still be
highlighted, but the MLE will be empty.

5. In order to keep the menu line from becoming too crowded, the Dump
menu item has been moved to the File submenu. This was an item that
is not frequently used anyway. This makes room for the item below.

6. A new menu item has been added to the main menu, Find. This
submenu will allow searching of either of the listboxes, the key
value MLE, all the key names in the current file, all of the key
values for the current application or all of the key values in the
current file for either an ASCII or Hex value.

7. It was possible to select a new item in the Application or Key
Listboxes while the boxes were being filled. This would cause a
Protection Violation and has now been fixed.

8. When certain errors were encountered during the loading of the
Listboxes or the MLE, they were not reported, this has been fixed.

9. If the Value of a Key is larger than 65,500 characters, selecting
that Key in the Key Listbox would cause a memory allocation error and
the INI file with the Key Value could not be MOVEd, COPYed or used as
the target of a FIND search. All of these have been fixed. However,
only the first 60,000 characters of the Key Value will be displayed
in the Key Value MLE.

10. If INIMAINT was started with an INI file where the first Key
Value of the first Application was very large, it was not possible to
terminate the loading of the Key Value MLE because the main window
was not visible. This has been fixed by making the main window
visible before the initial loading of the Key Value MLE.

11. A new feature, Compare, has been added to the File menu. This
item will allow the user to compare two INI files on any one of three
different levels, write or print a listing of the differences and
write an INI file that contains only those Applications and/or Keys
where there are differences.

******************************* V1.1f  *******************************

The items fixed in Version 1.1f are:

1. When an attempt to set an association with the INI files was
attempted under OS/2 1.3, the association was set up, but INIMAINT
would then abend with a protection exception. This has been fixed.

2. When INIMAINT asked the user to enter any character string
variable, there was no warning when the entered string was too long.
This has been fixed and the user will hear a beep if they attempt to
enter a string that exceeds the maximum length for the requested
item.

3. It was possible to enter a Group Name that was longer than 30
characters, which is the maximum. This would appear to work
correctly, but subsequent attempts to use INIMAINT on the INI file
involved would cause a protection exception.

4. The filling of the window that holds the Key values, an OS/2 MLE,
was very slow if the key value length exceeded 1,000 or so
characters. If the value approached 64k, then time needed was several
minutes, even on a fast machine. The loading has been changed and 64K
can be loaded into the window in less than 10 seconds on the test
machine, which is a 25mhz 486. However, there does not seem to be any
way to clear a long key value from the window in less than
approximately 45 seconds on the test machine. Several different
approaches have been tried, but none of them resulted in a lower
time. Therefore, it takes longer to clear the key value window than
it takes to fill it. If the 45 seconds becomes a problem, hitting F3
will immediately terminate INIMAINT, which can then be restarted.
However, it is hard to see how this could be done in less than 45
seconds on a regular basis.

5. A Repair feature is being worked on and is in the On-line Help.
However, there are still some problems with the code that compares
the INI file entries to the actual contents of the desktop. This
feature will be implemented in the next release. If the item is
selected from the menu, the dialog box will appear and will be fully
functional, except that the Execute Button will not work. Choosing
Execute will result in a Message Box saying that the Execute has not
been implemented in this release.

6. At least one user has a need to move a Key from one Application to
another. The Duplicate Key item on the Action Menu has been modified
so that the user will now be prompted for a New Application Name as
well as a New Key Name. One of these names must be modified and the
Key Value will be copied using the modified names. If just the
Application Name is changed, then this has the effect of copying the
Key Name and Value to the new Application. The information will
remain using the old Application and Key Names unless specifically
deleted by the user.
Where there are differences.

******************************* V1.1g  *******************************

The items fixed in Version 1.1g are:

1. The clearing of the Key Value window could take a considerable
amount of time when the key value was larger than a few thousand
characters. This has been fixed by changing the code from sending a
message to delete the contents of the window to simply destroying the
window and recreating it.

2. Hitting F10 did not cause a refresh of the file, because the
System uses F10 to highlight the first menu item. The Refresh was
changed to F4.

3. The address and phone number for Carry Associates was changed in
the documentation files, but was not changed in the About Dialog or
in the on-line Help. This has been fixed.

4. A new item has been added to the Action Menu, Duplicate
Application, which will make a duplicate copy of any Application in
the same INI file using a different Application Name.

5. When a Key was Duplicated in an INI file and the copy was put in
an Application that did not previously exist, the Application Listbox
was not refreshed. This has been fixed.

******************************* V1.1h  *******************************

The items fixed in Version 1.1h are:

1. A Rename Application item has been added to the Action Menu.
This is the same as the Duplicate Application except that the old
Application is deleted.

******************************* V1.1i  *******************************

The items fixed in Version 1.1i are:

1. The Control Program Error indicator could be reset in an error
situation before the Dump Dialog was displayed, thus losing this
information. This has been fixed by saving the contents of this
variable at the point that the initial error occurred.

2. The found flag was not always reset when multiple Find's were
requested. The result of this was an indication that a target was
found when it really was not. This has been fixed by resetting the
found flag at the start of each find cycle.

3. A new item has been added to the Recover Menu, Repair INI file.
Refer to the INIREP.TXT file for a detailed description of the
currently available repair actions and the on-line help for how to use
the facility. Initially, the only repair action that is available is
to remove entries from any INI file that reference files which are
not present on the desktop.

4. The Print function in the Compare and Repair Dialog boxes did not
correctly print lines that were longer that the current page, the
line would be truncated rather than carried over to the next line.
This has been fixed.

5. When certain errors occurred, for example during a repair action
or a file compare, the error was not reported via the Dump Dialog and
INIMAINT would simply stop processing messages. This has been fixed
by insuring that the various work threads correctly return any error
indication to the controlling dialog and that the dialog procedure
terminates the dialog when the error is seen.

******************************* V1.1j  *******************************

The items fixed in Version 1.1j are:

1. A new item, Condense, has been added to the Repair Menu. This item
will condense the empty space out of the Current, System, User or
both System and User INI files with a single selection. INIMAINT has
had this capability for some time, but it required a number of
different selections to accomplish.

2. The menu item to change both the System and User INI files only
changed the User INI file. This has been fixed.

3. An item has been added to the on-line help to describe what is
meant be the System and User INI files.

4. The Size submenu has been expanded to add the ability to calculate
a Size for the System INI File or User INI File without having to
make one of these files the current INI file.

5. The Copy submenu has been expanded to add the ability to make a
Copy of the System INI File, the User INI File or both the System and
User INI files without having to make these files the current INI
file.

******************************* V1.1k  *******************************

The items fixed in Version 1.1k are:

1. A new submenu has been added to the Actions menu, Backup. This
allows the user to make a backup copy of the System INI File, the
User INI File or both the System and User INI Files. This item
differs from the Copy item in two respects. First, in order for a
Copy to be a true backup, the target file must not exist. With Copy,
it was necessary for the user to insure that this was the case. The
Backup menu item will automatically erase the file if it already
exists. Second, each time a copy was done, it was necessary to
specify the target INI file for the copy and, since INIMAINT only
maintains a single target copy filename and does not save this
filename from one execution of INIMAINT to the next, the names had to
be reentered each time. INIMAINT will save the names of the System
and User INI File backup target files and present them as the default
target files each time a backup is requested. Finally, a new item has
been added to the Options Dialog that allows the user to bypass being
asked if they want to use the current backup target files. If this
option is selected then INIMAINT will use the backup target files
without asking the user for confirmation.

2. The Copying File Box would always be displayed during a copy, even
if the Option was set to not display it. This has been fixed.

3. There were two potential heap corruption situations in the INICOPY
program. In one case the wrong form of the free API was used. In the
other case, it was possible to free the same memory block more than
one time. Both of these have been fixed.

4. The Condense item on the Recover menu has been improved in two
ways. First, INIMAINT will now automatically build a name for the
temporary INI file and insure that it does not duplicate an existing
file, this eliminates the need to ask the user for the temporary
filename. Second, once the initial copy is done, INIMAINT will use
the standard copy to make a second copy of the new file, erase the
original file and then rename the second copy to the original name.
This eliminates the need to do a second INI type of copy, which can
take a relatively long time. The effect of this is to significantly
reduce the amount of time that is required to do the Condense.

5. There was a serious bug in the Condense Both INI files code. The
temporary file was not erase between the two copies, so the second
file contained everything from both files. This has been fixed by
erasing the temporary file immediately after the copy.

******************************* V1.1l  *******************************

The items fixed in Version 1.1l are:

1. When attempting to do a Copy or Move with the System or User file
as either the source or target file and lower case characters were
user in either file name, the Copy could fail because INICOPY did not
recognize the names as the names of these files, which must be opened
differently. This has been fixed by forcing the names to upper case
before checking them against the names of the standard files.

2. If an error was encountered setting the normal or wait pointers,
it was not reported because the subroutines did not return an error
return. This has been fixed.

3. If Cancel was chosen when the initial Condense Dialog was
displayed a SYS3175 error would occur because a NULL pointer was
passed to free(). This has been fixed by moving the free() to a point
after the pointer has been validated.

4. It was possible for certain entries in some INI files to cause the
INIMAINT Repair Dialog to terminate with a 1109 logic error and a DOS
error of 123. This was caused by passing a name to DosLoadModule that
it considered invalid, INIMAINT did not check for this return and
would, therefore, post it as an error. This has been fixed by
including this check in the list of returns that are considered valid
returns by INIMAINT.

5. A logic error 1111 with a DosError of 15 was possible during a
Repair because INIMAINT did not check for an Invalid Drive return
from the DosOpen of a drive. This has been fixed by including this
error in the normal set of checks.

6. When INIMAINT starts, it saves the current pointer from the
Desktop so that it will know which pointer to restore after putting
up the Wait pointer. It was possible, if some unusual pointer was
displayed at the time that INIMAINT saved the current pointer, that
the wrong pointer type would be saved and an attempt to restore to
this incorrect pointer would cause a logic error 616. This has been
fixed by saving the standard pointer rather than attempting to save
the current pointer.

7. When the Condense of both the System and User INI files was
selected. The desktop was reset two times for each file. This caused
two problems, first, it takes a long time to reset the desktop and,
second, on certain occasions it left the desktop in a condition where
it was necessary to reboot before any work could be done. This has
been fixed by, in this situation, copying both the System and User
INI files before the first Reset. This way the desktop is only reset
two times, which is the minimum possible.

8. Because of a conflict between the LOCKUP facility and Dialog boxes
that have had their Parent switched to the Desktop Object Window, in
order to make the dialog not visible, the Option that sets the
display of the Copy Dialog will not work. The Copy Dialog will always
be displayed, no matter what the setting of the Option. Once this
problem is researched and something is done to remove the conflict,
the Option will be reenabled.

******************************* V1.1m  *******************************

The items fixed in Version 1.1m are:

1. When a Size was canceled using the Esc key, the pointer did not
return to the normal pointer and the thread was not terminated, thus
INIMAINT would not do any work and had to be canceled externally.
This has been fixed.

2. The Options Dialog was becoming too high, so it has been broken
into tow side by side lists.

3. A new Option, Fast Copy, has been added. If this Option is
activated then INIMAINT will use special high speed methods to access
the INI files when an entire file is being Copied, Moved, Backedup or
Condensed. This greatly reduces the time necessary to process large
INI files, such as the System and User INI files.

******************************* V2.0  *******************************

The items fixed in Version 2.0 are:

1. This version is a full 32 bit version.

2. A number of improvements have been made to the INSTALL procedure,
including the ability to install all the files into a single
subdirectory.

3. The Repair and Compare Dialogs had the Options box and the results
Listbox too close together the Dialog was also too high to
comfortably fit on a default 640x480 screen. Both of these have been
fixed. 

4. When an error was encountered in the Repair Process, the line from
the INI file that caused the problem was not placed into the
supplemental error text field. This has been fixed.

5. Because the 16 bit Prf API's were limited to 64K of data for any
key Value, INIMAINT was limited to reading and displaying this amount
of data. The restriction has been removed with this version because
of the conversion to full 32 bit.

6. The Repair Function had attempted to see if *.PSF files that were
in the INI files with no path information actually existed on the
Desktop. DosLoadModule was used for this check, since the files
should be in the LIBPATH. It turns out that DosLoadModule will not
find anything other than DLL files, so this check was removed.

7. The Repair Function ignored files that had a pathname that
indicated they were on a floppy drive, a disk drive with removable
media, a tape drive, an unknown type of drive, an invalid drive and a
drive that could not be accessed via DosOpen. Since it is very
unlikely that any INI file entry that has a pathname that starts with
any of these type of drive is one that should remain in the INI file,
all of these conditions have been added to the list of situations
that INIMAINT will recommend for removal.

8. If Help was requested while doing a Repair after a new Save INI
File or Write File was selected, the Help would not work because the
Repair Dialog was not reset as the active help window. This has been
fixed.

9. If the Repair function encountered a path and filename combination
that looked like it was valid, but it was not, the Repair would
terminate with a 1109 Logic Error Code. This has been fixed by adding
checks for an invalid filename at the appropriate points.

******************************* V2.0a  *******************************

The items fixed in Version 2.0a are:

1. V2.0 forced and path and filenames to upper case in a number of
places. The caused a number of problems with lower case characters in
filenames and this code has been removed.

2. It was possible for the New File Dialog to go into a loop during
the initialization phase. This has been fixed by checking if the code
involved has already been executed, and causing an abend if it has.

3. Two of the SIZE Accelerator keys used Alt-F8 and Alt-F9, which are
used by OS/2, so they are not available. The SIZE User INI File has
been changed to Alt-R and the SIZE System INI File has been changed
to Alt-M.

4. The New File Dialog was not wide enough, so it has been expanded.

******************************* V2.0b  *******************************

The items fixed in Version 2.0b are:

1. Because of problems with the custom New File Dialog, this version
has been modified to use the standard OS/2 New File Dialog.

******************************* V2.0c  *******************************

The items fixed in Version 2.0c are:

1. When INICOPY was invoked by INIMAINT, the path and filename of the
Input and Output files were not enclosed in quotes. This created a
problem with parsing the parameter string. This has been fixed by
enclosing these two parameters in quotes.

2. When the Condense was used the part of the initial message that
said that the Desktop would be reset twice was confusing. The part of
the message about resetting the Desktop twice has been removed so
that the message now simply states that the Desktop will be reset.

3. During the Condense, some of the messages displayed in the right
hand window were too long for the window. The window has been
expanded so that it will now display the full message.

4. Because of the warning about resetting the Desktop, users have
sometimes waited for some time after a Condense has completed, since
they do not want to cause a problem with their environment. This is
because there is no clear indication that the Condense is complete.
This has been fixed by displaying an additional dialog that will tell
the user that the Condense is finished and it is okay to resume
normal operations.

5. When the Fast Copy Option was used, INICOPY did not validate the
input file to insure that it was an INI file and one that the Fast
Copy code understood. This has been fixed by adding two new checks to
INICOPY and to the Copy Dialog in INIMAINT. One check will report an
error if the input file is not a valid INI file. The other will
change the Fast Copy to a normal copy if the INI file is not one that
the Fast Copy Code understands, thus making the file not valid for
Fast Copy.

6. The Condense routine has been updated to test the file to be
Condensed to see if the Condense is really necessary. If the Condense
will not reduce the size of the file, then the user will be informed
of this via a Message Box.

******************************* V2.0d  *******************************

The items fixed in Version 2.0d are:

1. There were a number of places where the return from a PM API call
was converted to a 32 bit integer by using the SHORT1FROMMR macro and
then casting the result to a 32 bit integer. Because the macro goes
through an unsigned short variable, this did not work for negative
numbers, such as LIT_END. The result of this was that some things did
not work correctly, including selection of a new member of a group.
All of these situations have been fixed by having the macro fill a 16
bit integer and then using the 16 bit integer to fill the 32 bit
integer.

2. If INIMAINT could not open a file as a valid INI file and the
current INI file could also not be opened, INIMAINT would just start
and end with no error message. Users with this problem were very
confused by this and did not know what was happening. This has been
fixed by adding code that will insure that at least the error dialog
will be displayed in any error situation.

3. If an error was encountered attempting to open the default INI
file at the very start of the execution of INIMAINT, it was possible
for the Error Dialog routine to get an access violation because some
pointers were NULL and the NULL value was not tested. This has been
fixed by adding code to test the pointer values for NULL and print
None if they are not yet set.

4. When the initial file that INIMAINT attempted to open was a file
with no applications or keys, an error was encountered because the
determination of whether the file was in the new or old format would
result in an invalid file setting. This has been fixed by
specifically checking for an empty file.

******************************* V2.0e  *******************************

The items fixed in Version 2.0e are:

1. Because of the large number of possible items in the Repair
window, it was possible to exceed the maximum capacity of a Listbox.
Therefore, the Repair window has been changed to a Text type
Container.

2. An additional option has been added to the Repair selections. If
the users chooses to simply have the items that would be Repaired
displayed in the Window, it is now possible to select the items that
they want repaired and then check the 'Repair Selected' Checkbox and
then Execute and those items that are selected will be Repaired.

3. Because there will now be a number of different Repair actions,
the selection of the type of Repair desired is now a Combobox rather
than a Checkbox.

4. A new Repair items has been added, Removal of any Key with a Zero
Length Key Value. These Keys cause a problem for the WPSBKUP program
and have no value.

5. A new Repair capability has been added, the removal of any
File/Directory Handles in the OS2SYS.INI file that point to Files or
Directories that are no longer on the desktop. If a Drive or
Directory is deleted using this facility, all subdirectories and
files in the Directory and Subdirectories are also deleted. In
addition, making any changes in this area requires that the Desktop
be reset before the WPS will recognize the changes, so this will be
done upon dismissal of the Repair dialog.

6. A new Repair capability has been added, the removal of any WPS
entries in the OS2.INI file that point to objects that are no longer
on the desktop.

7. A new Repair capability has been added, the removal of any Objects
in the OS2.INI file that the user wants removed from the INI files.
There is currently no known way to verify whether the Objects
actually exist, therefore, INIMAINT cannot automatically delete
invalid Objects.

8. The capability to display the contents of the File/Directory
Handles, Objects and WPS entries has been added to the Repair.
Although this is not strictly a Repair function, it allow the user to
see, save in a file or print the expanded information. This allows
the user to determine the actual meaning of all the random looking
numbers seen in the OS2.INI and OS2SYS.INI files for both Key Names
and Key Values.

9. It was not possible to always print the contents of the Repair
Window because the print routine would not handle an empty line.
This has been fixed.

10. It was possible to initially start INIMAINT in such a way that it
would set the default window size at zero, even though the window was
not minimized. When this occurred, the INIMAINT window would not be
visible and it would not be in the minimized folder. This has been
fixed by adding checks to force the window to a minimum size if it is
not minimized.

11. I the user of a registered copy of INIMAINT set the Logo Display
Time to indefinite, INIMAINT would abend during its initialization
because a negative number was passed to the WinStartTimer API. This
has been fixed by adding code to check for a negative number and to
not even start the timer in this case.

12. The word 'reason' was not spelled correctly in the message that
informed the user that the Help was not available if the Help file
could not be found. This has been fixed.

13. There was no user notification when INIMAINT was about to create
a new INI file because the file the user selected did not already
exist. This has been changed so that the user will now be informed
that INIMAINT is about to create a new INI file and the user will
have the option of creating the new file, choosing a different file
or canceling INIMAINT.

14. The type of ICON displayed in some of the message boxes was not
the appropriate ICON. These have been fixed.

15. It was not possible to add any Groups to an INI file because the
response from the Prf API that deleted the old Groups was changed
from TRUE to FALSE if the old Group information did not exist. This
would cause a 704 logic error when the OK button was chosen on the
Group Dialog. This has been fixed by checking for the Not in Index PM
Error Code when a FALSE is returned by this API and accepting this as
a valid response.

******************************* V2.0f  *******************************

The items fixed in Version 2.0f are:

1. When Repairing Dir/File Handles and the drive letter is selected
for deletion, all of the invalid directories and files on the drive
should be deleted. It did not happen if the drive was a valid
drive. This has been fixed by adding extra logic to check for this
specific condition.

2. If the number of Dir/File handles becomes very large, it is
possible that they will be stored in the OS2SYS.INI file in multiple
pieces. 2.0e would ignore all but the first piece. This has been
fixed by continuing to get the data until all of the pieces have been
accessed.

3. There were a number of problems with the dumping of the Repair
Variables. These have all been fixed.

4. If the Device Driver for a drive did not correctly handle the API
used by INIMAINT to identify the drive type, it would cause INIMAINT
to terminate with a Logic Error 1112. This was caused by a
undocumented return code from the API. Typically, the device driver
is an old driver and often is supporting a CD-ROM device. This
problem has been fixed by adding code to handle the new return from
the API and, when the error return is seen, INIMAINT will do a
further check on the drive and, if it is write only, will identify it
as a CD-ROM device. Otherwise, the drive will be identified and an
invalid drive.

5. There were circumstances where a Repair to the WPS entries would
get a logic error 1104 because of an attempt to allocate a zero
length memory block. This has been fixed by initializing the Key
Value Length field to a small value rather than zero, so that the
allocation will work.

6. Invalid PM_Abstract:FldrContent entries that had an invalid Object
ID were not deleted, even though the entry in the Repair Window would
indicate it was deleted. The reason was the some of the value level
items were valid, but the key name was not a valid Object. This
caused the item to be deleted from the INI file and then reinserted.
This has been fixed by insuring that all value level entries for an
invalid key name are also marked as invalid because of the key name.

7. The Repair Save and Repair Write file were not saved from one run
of INIMAINT to the next. Additional code has been inserted to save
the current information and it will be presented as the default for
future Repair activities.

******************************* V2.1  *******************************

The items fixed in Version 2.1 are:

1. When there was nothing to Repair for the Repair Dir/File Handles
and Repair WPS Entries, the message box that told the user this was
not displayed because the variable that the message box code tested
was not set correctly. This has been fixed.

2. When displaying the Dir/File Handles the drive entries were
displayed even if there were no Directory or File entries to display
for the drive. This has been fixed by adding additional code to only
add the drive information to the window when the first Directory or
File is added.

3. The Help for the new Repair functions was not complete, but has
now been completed.

4. Some object values in the 0x20000 range could be identified as
invalid, when they were actually valid. This has been fixed by
insuring that values in the 0x20000 range are correctly checked
against the Objects entry in the OS2.INI file.

5. Some of the Repair functions take a considerable amount of time
and often the INI files do not have any errors in them, so the only
result is a message box telling the user that there is nothing to
Repair. I was easy to miss the appearance of this box, so code has
been added to cause a beep whenever the message box is displayed.

******************************* V2.1a  *******************************

The items fixed in Version 2.1a are:

1. If a drive connected to the system via a switch was not switched
onto the system when a Repair was requested, it was possible for a
couple of the API's to return the General Failure Error code, which
was not correctly handled by the Repair code. The code has been
changed to look for this specific error condition and to treat the
drive as an Inaccessible Drive.

2. When a Repair was requested, the Do Not Save Option was not turned
on and the Save INI file had not been selected, INIMAINT would
terminate with a logic error code of 1. This was caused by an
incomplete check of the filename, specifically, it was checked for a
NULL pointer, but not checked to see if it was an empty string. The
additional check has now been added.

3. When Repairing the File/Directory Handles, the Ask Before Repair
did not work because there was a drive level check placed in front of
the code that asked the user and it should have been placed after the
code that asked the user. The code has now been moved to the correct
position.

4. Alt-R was specified as an accelerator key for Size User INI File.
However, this key was needed for the Recover Menu. Therefore the Size
User INI File has been changed to Alt-E.

5. In order to facilitate the processing of both the WPS Entries and
the File/Dir Handles, a new set of Repair types have been added that
will List or Repair both sets of Entries at one time.

6. When Invalid Handles were being listed or the Handles were being
Repaired. The actual drive entry for CD-ROM and Floppy drives was not
displayed in the Window. Additional code has been added to insure that
these entries will always get put in the window when appropriate.

7. If the Ask First Repair Type was chosen, it was possible that the
user could be forced to respond Yes or No to a very large number of
items and there was no way to stop the questions until all of the
appropriate items had been presented to the user. The message box has
now been modified so that there is also a Cancel entry that will
terminate the questions and do the Repair actions that had been
requested to that point.

******************************* V2.1b  *******************************

The items fixed in Version 2.1b are:

1. When attempting to open a network drive, under some circumstances,
INIMAINT would get a logic error 1111 with a dos error of 3. The dos
error indicates that the path is not found and is not handled
correctly. Code has been added to check for this return and to treat
the drive as unavailable.

2. If INIMAINT is added to the WPS main menu, it is started with the
Desktop subdirectory passed as a command line parameter. This would
cause a dialog box to appear indicating that the directory was not a
valid INI file and asking if the user wanted to create it. In order
to prevent this from happening, code has been added to examine the
start-up filename and, if it is only a directory, to ignore it.

3. If INIMAINT was started with a current INI file that had been
deleted, one of two things would occur. If the INI file could be
created, it was created and used as the default. If the file could
not be created, for example, if the subdirectory had also been
removed, then INIMAINT would terminate. INIMAINT will now check to
see if the default file exists and if it does not, ask the user if he
wants to create it and, if he does not, then it will ask the user to
enter a new filename.

4. When the Repair dialog was displayed and the current entry in the
combobox that lists the type of repair was selected by hitting the
tab key. A request for help would cause INIMAINT to terminate. Code
has been added to the combobox help routine to check for this
condition and to insure that the correct help panel is displayed.

******************************* V2.1c  *******************************

The items fixed in Version 2.1c are:

1. Some users found the use of the word 'List' in the for the type of
Repairs to be misleading, so the word 'List' has been changed to
'Display'.

2. The message 'Doing Repair' would appear in the Repair Dialog even
when no actual Repair was being performed, but the Display window was
simply being loaded. Additional code has been added to change the
message to 'Loading Display' when that is all that is being done.

3. The Handles structure for certain kinds of Network situations have
a Drive entry that is not a normal drive letter followed by a colon.
The Repair Function did not handle this situation correctly and would
get a 1114 Logic Error. This has now been fixed and will be
recognized as a Network situation.

4. The Repair Options dialog did not have an entry to allow the user
to ignore or bypass Network drives and other Network entries. A set
of Network options has now been added.

5. There were situations where IniMaint would indicate an INI file
did not exist, when it was simply opened in such a way that all other
users were denied. This has been fixed by handling the check for
whether the file exists in a different manner.

6. A number of additional error returns from the call to the DosOpen
API that indicate a drive entry is a Network Drive have been
identified and added into the code that determines what kind of drive
the Repair function is dealing with.

7. The return from WinPostMsg was treated the same as the return from
WinSendMsg and normally not checked. This could result in a message
posting error that would not be detected by the error checking code.
All calls to the WinPostMsg API have been changed so that the return
code from the API is validated.

8. There are situations where it was not clear exactly where an error
occurred when the Dump Dialog was invoked. The reason for this is
that there are a number of error codes that are used by more than one
subroutine. In order to address this problem, the error routine is
not passed an additional parameter which identifies the subroutine
that is reporting the error and the id of the routine that first
reports an error that will cause the Dump Dialog to appear is saved
by the error reporting routine. This information has also been added
to the Dump Dialog Window.

9. The only way that the Repair function would ask the user about
each Repair action was if the user wanted to be asked about every
single item that needed to be repaired. It was not possible to select
certain items and then have the Repair function only ask about those
items. The Repair code has been modified so that it is now possible
to check the Ask box with some of the items selected and the user
will then only be asked it they want to Repair the selected items.

10. A number of the Accelerator Keys used the Alt Key in conjunction
with a letter. This cause problems with menu selections and a number
of other functions. All of these Accelerator Keys have now been
replaced with Ctrl-Alt and a letter combinations. Refer to the
Accelerator Key section of the Help for a detailed list.

11. When doing the Repair of the WPS entries or the File Directory
Handles, selecting certain items to be Repaired also would cause
other lower level items to be Repaired. For example, selecting a
Drive entry would cause a Repair to all the items on that drive. This
was not clear from the behavior of the highlighting in the window,
since only the selected item was highlighted and not the other items
that would also get Repaired. The highlighting code has been changed
so that all of the items that are going to get Repaired will now be
highlighted.

12. The initial version of the code to handle Extended Attributes has
been added in this version. When the Extended Attribute feature is
activated, IniMaint becomes SysMaint and a new set of menu items
appear that provide editing, displaying, moving, copying and a
number of other functions in the Extended Attribute area. The
Extended Attribute functions are not Shareware, but are only
activated when a fully registered copy is being used. Refer to the
Help file under Registration for details.

******************************* V2.1d  *******************************

The items fixed in Version 2.1d are:

1. The TEST function for the Extended Attributes has been
implemented.

******************************* V2.1e  *******************************

The items fixed in Version 2.1e are:

1. An additional option has been added to the Repair Options Dialog
box. This item, Bypass Known Errors, will cause the Repair function
to make some additional checks for errors it knows about and should
not be of concern to the user. A full list of the things bypassed are
in the on-line help file.

2. During the updating of an INI file, OS/2 creates a file in the
same directory with the same name except with an extension of ###.
The ### entry gets added to the Handles structure in the OS2SYS.INI
file. Since the ### file only exists for a short time, it will always
be identified by the Repair function as an entry in the Handles that
cannot be found. Additional code has been added so that when the ###
file is not found and the user has asked to bypass known errors, a
check is made for a file with the same name with an INI extension. If
the INI file is found, then the Repair function will not identify the
### file as a file not found.

3. The EA Test Dialog has been added to the Help file.

4. The Help file has been updated to also describe SysMaint.

5. An additional item has been added to the Extended Attribute
Defaults that allows the user to specify that they always want to
continue when a sharing error is encountered while processing
Extended Attributes.

6. Deskman/2 adds a zero value entry to the Abstracts:Icons entry in the
OS2.INI file. This entry is not found in the list of Objects,
therefore, this entry is reported as invalid. Since we know the entry
is valid, additional code has been inserted to check for this
condition and to identify the Icon as the Deskman Icon if the user
wants IniMaint to bypass known errors.

7. The WPSBKUP program creates a temporary object with the name of
NFD73 during the backup process. This causes an entry to be made in
the Handles structure for this filename. Since the file is temporary,
it will always be identified as a file not found. Code has been
included in this version to not report this specific filename if the user
wants IniMaint to bypass known errors.

8. When the EA Test function found entries to add to the Test Dialog,
the processing EA's Dialog was left on the screen. The exact reason
for this is not known, but I believe it is associated with loading
two different modal dialogs with the same Parent and Owner and then
destroying the second dialog before destroying the first one. It was
not possible to debug this problem because it would not occur when
the program was run under IPMD. The problem has been fixed by
including code to destroy the Processing EA's dialog before the
Testing dialog is created.

9. If some sort of terminal error was encountered before the main
window was created, no error Dialog would appear because the error
routine was posting a message to the main window in order to get the
error Dialog to appear. The error routine has been changed to check
to see if the main window handle is valid and, if it is not, the
error routine will display the error Dialog directly.

10. If the OS2.INI file was corrupted to the point that the data
needed by IniMaint or SysMaint could not be read from the file, it
was not possible to run the application, since it would terminate
during the initialization phase. In order to get around this problem,
the application will now look for an Environment Variable INIMAINT=
and, if this variable is found, it will assume this is the full
pathname of a file than should be used to obtain the IniMaint or
SysMaint default information. For example, if the user wanted to use
an INI file with the name of: 
     C:\OS2\APPS\INIMAINT.INI
then you would add the following line to your CONFIG.SYS file or to a
CMD file that runs IniMaint or SysMaint:
SET INIMAINT=C:\OS2\APPS\INIMAINT.INI

11. If a terminal error occurred before the name of the current INI
file was filled in, the error Dialog code would get a protection
exception attempting to display this name. The code has been changed
to test for a null value before attempting to print the name.

******************************* V2.1f  *******************************

The items fixed in Version 2.1f are:

1. IniCopy has been upgraded to handle Extended Attribute files as
well as INI files.

2. The Add New Key Name item on the Action Menu did not work because
a return from one of the Prf API's was not tested correctly. The test
has been fixed.

3. A new item has been added to the Files Menu, Recall. Selecting
this menu item will cause a submenu to be displayed showing the a
list of the INI or EA files that were the current file. If one of
these files is selected, it will become the current INI or EA file.
The number of files displayed is controlled by a new Option in the
Options Dialog and has a default value of 10.

******************************* V2.1g  *******************************

The items fixed in Version 2.1g are:

1. When Updating the Extended Attributes from an EA file and one of
the Source Files or Directories has been deleted, SysMaint will get a
1317 Logic Error because the Set Path Info API will give a return
code of 3, indicating that the file is not found. Additional code has
been inserted to notify the user of this condition.

2. The Duplicate Key menu item has been updated to handle EA files.

3. The Rename Key menu item has been updated to handle EA files.

4. The Delete Key menu item has been updated to handle EA files.

5. Code has been added to deactivate the Add Application and Add Key
menu items when an EA files is the current file. Adding Extended
Attributes involves adding a number of different control items and
will be implemented via an entry on the Extended Attribute Menu.

6. Code has been added to delete the Condense items from the Recover
Menu if the version of OS/2 is 2.1 or later. This function makes no
sense for these versions, since no empty space is ever left in the
INI files.

7. After Editing an Extended Attribute file and switching back to an
INI file, the EA flag would sometimes not get reset, causing SysMaint
to think it was working with the wrong type of file.

8. Some of the Ctl-Alt Accelerator Keys did not work correctly
because of the order in which they were defined in the resource file.
The sequence of the definitions has been changed so that the
Accelerator Keys will work correctly.

9. The Dialog that is responsible for getting new character string
information from the user was not capable of handling a character
string longer than 32 characters. This limit has been increased to
255 characters.

******************************* V2.1h  *******************************

The items fixed in Version 2.1h are:

1. Popup menus have been added for the various windows. Clicking on
the RMB while the pointer is in the Application, Key Name or Key
Value windows will popup a menu with the items that are appropriate
for that window.

2. A Desktop menu item has been added to the SysMaint menu bar. This
menu will eventually have a number of different entries to allow
users to do various maintenance functions for the Desktop.

3. A Reset Desktop item has been added to the Desktop menu. This item
will simply reset WPS so that changes that have been made to the INI
and EA files that require the Desktop to be restarted will become
effective.

4. It was not possible to split the EAs from a Directory or to update
the EAs  for a Directory because a logic error 1346 would result. The
reason was that the name of the Directory that was used for one of
the API's still had the trailing slash on it causing a Path Not Found
error to be returned. The code has been modified so that the
Directory name is specified correctly.

5. After Repairing the WPS Entries and/or the Handles Entries, it can
take a considerable amount of time to free the memory for the
Container Records. In order to make sure the user knows what is
happening, a message dialog will now be displayed telling the user
what is going on.

6. It was possible for some of the WPS entries, such as
PMWP_ASSOC_TYPE, to be incorrectly marked as invalid. The reason was
that a case in a switch statement was missing a break, thus causing
it to fall through to the next case. The break has been added to the
code so that the entries will be reported correctly.

7. If the last item in the PMWP_ASSOC_TYPE Application was associated
with nothing, the association was simply left blank because the check
for any association entries in the structure did not work correctly
for the last entry. The test has been changed so that it will work
for all entries.

8. The titles for the Extended Attribute Submenu entries were
confusing for most people. This Submenu has been completely reworked
and will, hopefully, be more clear.

******************************* V2.1i  *******************************

The items fixed in Version 2.1i are:

1. The Edit item on the Extended Attribute Menu bothered some users
because Edit implies that things are going to be modified. When
SysMaint 'edited' the Extended Attributes, it did not change anything
unless the user asked for a specific update of the Extended
Attributes. Therefore, this menu item has been changed to View.

2. Running IniMaint or SysMaint would leave a zero length file in the
default directory, INIERR.TXT. This was caused by redirecting the
stderr output. The code has been changed so that stderr will only get
redirected when compiling the debugging version of the program.

3. The Extended Attribute Default option to delete temporary files
would only delete the files used in the Compare. The temporary files
created when the Extended Attributes are Viewed should also be
deleted when the user is finished Viewing the information. The code
has been changed to do the additional deletes.

4. Whenever the Control or Alt Keys were pressed and held, the Key
Value window would flash. This was caused by the code that disabled
and reenabled the window while a key was being processed. Additional
code has been inserted to prevent these keystrokes from being passed
to this window.

5. If the current INI file was deleted between runs of IniMaint, the
user was informed of this the next time that IniMaint was run and was
asked if they wanted a new file created. If the user replied NO, then
the standard User INI file, OS2.INI, was opened as the current file.
However, the IniMaint entry in the INI file for the current default
INI file was not updated. Therefore, the user would be asked about
the same file the next time IniMaint was run and this would continue
until the user did something to cause the information in the INI file
to get updated. Additional code has been added so that the
information in the INI file will get updated when the User INI file
is made the default.

6. A Defaults Dialog has been added to the Desktop menu to allow the
user to set the various default values and flags for the Desktop Menu
items.

7. It was not possible to use the Copy or Move entries on the Action
menu to copy the Extended Attributes for a single file to another
file if the target file did not already exist. The copy would
terminate with a message that the files were not compatible. This was
caused by code that opened the target file before the copy was
started in order to verify that the target could be used as a valid
INI or Extended Attribute file. This caused an empty file to be
created, which had not control information. When this file was opened
by the IniCopy program, IniCopy got an indication back from the open
routine that the target was not a valid Extended Attribute hold file
because of the lack of control information. The problem has been
fixed by modifying the open code so that it will use the default file
type that it was passed when it opens a file and the file does not
even have the signature bytes written to it, in short, it is
completely empty.

8. The Join would not work for certain combinations of source and
target sets of Extended Attributes if the sets were not the same
type, such as both the Extended Attributes for all the Directories in
a specific Directory. The reason for this was because a flag in the
structure used to control the Join was set from the wrong source. The
code has been modified so that the flag is now set from the correct
source.

9. I was not possible to Compare the Extended Attributes that were
current for a file(s) and/or directory(s) to a set of Extended
Attributes that had been saved in a file. A new menu item has been
added to the Extended Attribute menu that will now allow for this
type of Compare, Compare to Saved EAs.

10. Code has been added to automatically detect the condition where
the OS2.INI and OS2SYS.INI files cannot be updated. When this occurs,
the user will be informed of the situation and asked it they would
like for the condition to be fixed. If the user replies YES, then
IniMaint will go through a reset procedure that will fix this problem
and pick up where it left off.

11. In line with the item above, a new item has been added to the
IniMaint Repair menu that will allow the user to have IniMaint
automatically fix the problem of INI files that cannot be written to.

12. A new item has been added to the Repair menu that will allow the
user to run a test for INI files that cannot be written to. If the
condition is found, it will be automatically fixed if the user wants
it to be. This is for users who store the IniMaint or SysMaint
information in an INI file other than the OS2.INI file, thus would
not normally be automatically notified when the INI files cannot be
updated.

13. A number of items have been added to the Desktop menu for
SysMaint that allow for a Simple backup of the Desktop, including the
ability to keep as many generations of backup as desired, a selection
that will generate a backup CMD file that can be run at anytime and
will maintain all the generations, the ability to generate a CMD file
that will do a command line restore of the Desktop, and items that
will restore the two major parts of the Desktop, the directory
structure and the INI files, while WPS is operational.

14. This version introduces the 'safe' versions of the program,
IniSafe and SysSafe. These two versions do the same kinds of things
as IniMaint and SysMaint do, however, they will not update any files
or do anything that can cause a problem with the Desktop. If there
are users in an organization that you want to have access to the
things that can be accessed via IniMaint and SysMaint, but these
users should not be allowed to modify anything, then these users can
be furnished IniSafe and SysSafe in place of the xxxMaint version and
they will have this capability.

15. A number of new things have been added to the help files under
the category General Help Information. Most, if not all, of these
topics have also been inserted into the see also lists for the
appropriate subject areas. This section contains a discussion of the
environment that is required for IniMaint or SysMaint, a discussion
of different kinds of Desktop Backups, a description of and how to
address INI files that cannot be updated, notes on how the Extended
Attributes from different files are matched for things like Compare,
and a description of what IniSafe and SysSafe are. In addition, all
of the *.TXT files that are normally distributed with IniMaint and
SysMaint have been incorporated into the on-line help.

16. If the user was running an unregistered version of IniMaint, the
message that the registration information was invalid would appear
everytime the app was run. This was caused by the reuse of a variable
before it was tested to see if there was no registration information.
The problem has been fixed by using different variables.

17. The stack size for the secondary threads was not large enough, so
it has been considerably increased.

18. There were a couple of places where the memory allocation was
done using the wrong routine, which would cause a problem with
switching back and forth between the normal memory allocation
routines and the debug routines. All of the source modules have been
modified to use the correct memory allocation API call.

19. There was a problem with how the menu selection worked when the
main window menu was on more than one line. This seems to have been
caused by the fact that the frame window was not notified when some
of the menu changes were made. Code has been added to make sure that
the proper notifications are sent.

******************************* V2.1j  *******************************

The items fixed in Version 2.1j are:

1. If there was a Network Drive in the Handles0 or 1 structure in the
OS2SYS.INI file that was not in the normal format and any of the
handles were deleted. The resulting Handles structure would be
invalid because the code that rebuilt the Handles structure assumed
that the Drive entry had a two character name consisting of the Drive
letter followed by a colon. This is not always true for network
drives and the code has been modified to use the length of the drive
information in place of a default value.

2. The code in the routine that restores the Desktop Directory does
not remove the temporary CMD file after doing the restore because the
lines that were commented out for testing were not restored before
the 2.1i version was released. The comments have been removed and the
file will not get deleted. The filename will be of the form
TMMDDXXX.CMD where MM is the month, DD is the day of the month and
XXX is a sequential number starting from 001, and will probably be
001.

3. Because of the way the default was built and since that is what
was used during testing, none of the Desktop routines to build Backup
or Restore CMD files would work correctly once a new directory was
chosen. This is because the new directory would have a trailing
backslash and the default one did not. The problem has been fixed by
insuring that all directory names have a trailing backslash.

4. The Desktop Default Dialog would put the incorrect information
into the window that displays the name of the Backup and Restore CMD
files, if the user tried to change these entries. Actually, the
Default Backup Directory would be placed in the field.

******************************* V2.1k  *******************************

The items fixed in Version 2.1k are:

1. The Repair Objects entry in the Repair Dialog has been upgraded so
that the display will include the folder that contains the Object
and, when the Object is deleted, all references to the Object will be
removed from the INI files and the Desktop will be reset. This will
assure that the Object has been completely deleted, even if it cannot
normally be shredded.

2. The SysMaint Desktop Backup still did not work because of an error
in specifying one of the filenames. The first character of the
filename was left off. The code has been changed to create a CMD file
with the correct filename.

3. If the user chose the User INI File or System INI File options
from the Files Menu as the file to view immediately after Viewing a
set of file and/or directory Extended Attributes, the temporary file
that contained the Extended Attributes was not deleted and a message
would be seen indicating that the Current INI file could not be
deleted. This was caused by a failure to save the temporary filename
in the old INI file field when the two menu items above were
selected. The code has been updated so that the old filename will be
properly saved in both situations.

4. Some changes have been added to the Dump code so that the Version,
Date and Time of the dump information will be included.

5. The Dump of certain control structures was limited to only 100
members of each structure. There were times when this limit was too
small and critical dump information was in included. Therefore, the
limit has been increased to 1000.

6. A new item has been added to the available types of INI File
Repair. IniMaint will now check the OS2.INI file for leftover
PM_ProgramListxxx entries and remove them at the user's option. These
entries are no longer needed under OS/2 2.1 and can cause problems
with deleting of Program type Objects that are contained in the
entries.

7. A new item has been added to the available type of INI file Repair
that will remove old Printer information from the OS2SYS.INI file.
When Printers are removed from the Desktop, some of the old
information is left in the INI file. While this information does not
cause a problem with the Desktop, it can cause a problem with various
programs, such as Word Processing programs, that look in the
OS2SYS.INI file for printer information. Some of these programs will
assume that the old printers can still be used. However, any attempt
to print to the old printers will be unsuccessful. This item will
examine the 10 or so entries in the OS2SYS.INI file that might have
old printer data left and remove it at the user's option.

******************************* V2.1l  *******************************

The items fixed in Version 2.1l are:

1. The SysMaint Restore process was not sufficiently robust, so a
number of things have been done to address the problem. First, the
Restore CMD file will no longer use OS/2 Commands to clean up the
Desktop Directory, this will now be done via a new program, IniClean,
that simply has the root as the input and will use the root
information to remove whatever Desktop Directories and Files
currently exist. In addition, the name of the programs that are
executed are now fully qualified, so the CMD file will work with
any directory as the default directory.

2. In order to assure that the executable files and the source and
target files for the various Backup and Restore actions will all be
found correctly, all file, directory and program names are now fully
qualified and enclosed in quotes.

3. The Desktop Restore Command file did not have lines that would
erase the existing OS2.INI and OS2SYS.INI files before the UNZIP was
done. Additional lines have been added to insure that this is done.

4. The Repair of the PM_ProgramListxxx entries did not remove all the
references to the Application. It is possible for entries also be
stored in the PM_Workplace:Location Application. Additional code has
been added to insure that these entries are also deleted.

5. The Repair Printers Item did not recognize IBMNULL Printer
entries, which should never be deleted, if they had lower case
characters in the name. The type of compare has been changed so that
upper and lower case characters will compare the same.

6. When an attempt to remove a Printer entry was not successful, the
program would terminate with a Dump Dialog. Since the inability to
remove a Printer entry is not really a terminal type of error, the
code has been changed to simply notify the user when this situation
has occurred.

7. There were some areas in the Repair Printer and Repair
PM_ProgramListxxx routines where memory could be left allocated. This
memory would be freed once the program terminated, but should not be
left allocated. The problem areas have been fixed.

8. A new Button has been added to the Dump Dialog, Continue.
Previously, when a Dump occurred because of some sort of error
condition, the user had no option but to terminate the program. The
Continue Button gives the user the ability to continue processing
even though an error has occurred. If the user chooses to Continue,
they will be warned that an error condition could continue to exist.

9. If there was a problem removing a printer entry, the Dialog that
indicated that the INI files  could not be written to would appear.
This was in error, since the problem was that a specific OS2SYS.INI
file entry could not be removed, therefore, additional code has been
inserted to handle this condition.

10. If one of the threads other than the main thread got an error
attempting to make a change to the OS2SYS.INI or OS2.INI files, the
code that indicated that the INI files could not be updated would be
entered. This code would abend with a logic error of 1201 because an
attempt would be made to pop up a message box for a thread that did
not have a message queue. Additional code has been inserted to insure
that the check will only be made for the main thread.

11. In order that the user knows the limitations of the Sysmaint
Restore process, a message box will be displayed anytime the users
asks that the Restore CMD file be created that explains the
limitations.

******************************* V2.1m  *******************************

The items fixed in Version 2.1m are:

1. If the user selected Continue after a dump and the supplemental
error text field had been allocated, the memory was not freed. Code
has been added to free this memory.

2. There were possible combinations of user names and SysMaint
registration codes that would not register correctly because a
variable would evaluate to zero. Additional code has been added to
check for this condition.

3. It was possible to get a protection exception when attempting to
remove invalid registration information. The code has been changed so
the INI file will get updated correctly.

4. If the IniClean program used to do the restore of the Desktop did
not find the old Desktop, it would terminate with an error rather
than simply allowing the restore process to continue. Additional code
has been added so that the condition will no longer be treated as an
error.

******************************* V3.0  *******************************

The items fixed in Version 3.0 are:

1. It was possible to get a logic error 1109 when attempting to do a
Repair because of filenames in the Handles structure that contained
*. This generated an Invalid Path DOS error that IniMaint was not
handling correctly. Additional code has been inserted to handle this
DOS error code.

2. During certain copy operations it was possible to get a 1201 logic
error code because an attempt was made to pop up a dialog box for a
thread that did not have a Message Queue. This problem has been fixed
by insuring that every thread that creates an Anchor Block also
creates a Message Queue.

******************************* V3.0a  *******************************

The items fixed in Version 3.0a are:

1. Under certain circumstances the Application level compare of two
INI files would go into a loop. The problem was caused by a pointer
not getting incremented correctly and has been fixed.

2. An additional check has been added to the Repair File Handles
routine that will look for Orphan Handles, Handles with no Parent in
the structure. This condition would previously cause a 1115 Logic
Error, but will now be added to the list of invalid handles with a
error message that identifies it as an orphan handle.

3. If the INIMAINT= Environment Variable was invalid, the Dump Dialog
would appear after the message box that informed the user. There was
no reason to display the Dump Dialog and it will no longer appear.

4. Some users were confused by the All Groups display, which includes
the Applications which are in any of the defined Groups. Therefore,
additional text has been added to the Help entry that discusses the
contents of the Groups Listbox.

5. A number of new users have mentioned that they were not sure how
to get started with IniMaint and SysMaint, so a Getting Started
section has been added to the Help file.

******************************* V3.0b  *******************************

The items fixed in Version 3.0b are:

1. While getting the Extended Attributes for the Desktop of the
MultiMaint Portable Backup, the memory for the EAs for each directory
or file should have been freed after the information was recorded in
the *.EA file. However, this was not done, causing the program to use
very large amounts of memory. The appropriate areas are now freed
correctly and the total memory requirement is much smaller.

2. If a Filename in the Handles structure contained invalid
characters, it was not identified as having a invalid format and was,
therefore, no placed in the window listing files that should be
Repaired. This could result in a number of different problems ranging
from a Desktop that would not boot to Orphan Handles in the File
Handles structure. The code has been fixed by adding a new type of
error that will identify these entries as being an invalid name.

3. Additional information will be captured by the MultiMaint Beta
Code. This is the second of three steps in producing a workable
version of the program.

4. The MultiMaint Beta did not release the memory as it obtained the
Extended Attributes for each Directory or File. This has been fixed,
so the Portable Backup  code will no longer cause the Swap file to
grow by several megabytes.

5. Additional error recovery has been added to the MultiMaint code so
that recovery from an error condition will be reported correctly, all
of the WPS pointers changed for the data collection will be restored
to their original value and there will be no problems with WPS after
the test.

6. The IniClean program would leave part of the Desktop when there
were several levels of nesting of Folders because the Folders were
done in the incorrect sequence and some of the chain information was
lost. The sequencing has been corrected and all Desktop information
will now be deleted.

7. If a generation other than generation 01 was used for the restore
of the Desktop, an error was encountered because there was a space
between GO and TO in the CMD file. The space has been eliminated, so
the CMD file will not encounter the error.

8. There were a number of situations where a Dump Dialog would appear
if the name of a file used by one of the dialogs was old and pointed
to a directory that no longer existed. What should happen is that the
user is informed that the file cannot be opened. All of the locations
that would have generated a Dump Dialog have been changed to simply
pop up a message box.

9. The accsswps.dll file is a dll that is only needed for the upgrade
to SysMaint, which is in beta. However, V3.0a would not run without
this file because there were some calls to the AccessWPS API's in the
Dump Dialog code. These lines have been made conditional based on
some compile options, so this dll is not longer required for IniMaint
or SysMaint and can be erased.

10. Two items have been added to the popup menu for each of the
windows. One of the items will write the contents of the window to a
file and the other will print the contents of the window.

11. It was possible for IniMaint to run out of stack space in certain
very unusual situations, so the  primary stack size and the thread
stack size have both been increased.

12. Although it is, in theory, impossible to have an Application with
no Keys, some examples of this condition have been seen in some INI
files. It was not possible to delete these Applications with IniMaint
because IniMaint attempted to use a pointer that was NULL in this
particular situation. Additional code has been added to handle this
condition and these Applications can now be deleted.

******************************* V3.0c  *******************************

The items fixed in Version 3.0c are:

1. The Write and Print Window contents items added to the popup menus
in the previous version, did not identify the Application when the
Key Name window was the source and did not identify both the
Application and Key Name when the Key Value window was the source.
This made it necessary to manually document this information on each
printout or in each file. Additional line have been added to the
heading information to output this information.

2. The name and location of the logging files for the Repair,
Extended Attributes and Portable Backup functions were fixed and
would always be in the default directory. Now, both the name of the
logging file and its location can be selected by the user from a new
entry in the Options or Defaults Dialog for the particular function.
The selected file will be remembered from one run of IniMaint or
SysMaint to the next.

******************************* V3.0d  *******************************

The items fixed in Version 3.0d are:

1. The initial Portable Restore capability has been added to the
MultiMaint version.

2. The application names of the Objects saved during the Portable
Backup have been changed to eliminate the Desktop Directory. This was
redundant information, since every Application started with the
Desktop, since every Object is on the Desktop.

3. The INI File write routine will no longer cause the Dump Dialog to
appear when it finds an error, it will simply pass the error back to
the calling routine. It will be the responsibility of the calling
routine to pop up the error dialog. The problem with having the write
routine pop up the error dialog is that the id of the routine
actually having the problem and the INI file that was causing the
problem would often be lost.

4. There were conditions where the Save or Write INI file for various
functions could get the RO attribute left on even though the file was
not actually opened. This would cause a 704 Logic Error the next time
the file was used because the file would be considered to be Read
Only by OS/2. Additional code has been inserted to insure that the RO
attribute is not set for these files, so that they will always be
usable.

5. When a error occurred during a Repair operation, there were
situations where the error logging was not sufficient to easily and
accurately determine the problem. Additional information will now be
logged to improve this area.

6. If it was not possible to open the file currently set as the Save
INI file for the Repair because the file had been chosen in a past
run and the directory structure had been changed to make the path and
file name combination invalid, an abend would occur with a generic
Logic Error code of 1. Additional code has been added to insure that
the Save INI file can be opened before any Repair is executed which
will need to Save any of the INI file data.

7. The time-out for the execution of the WPS and SOM methods was set
at 30 seconds, which turns out to be too short for some methods, such
as wpPopulate. Therefore, the time-out has been increased to 3
minutes.

8. The Repair Uninstalled Printers code would sometimes incorrectly
identify a Printer as not being installed because the key Value entry
for a critical Application had an ending semicolon. The semicolon
caused a compare to be unequal, thus causing the incorrect
conclusion. The code has been modified to ignore the semicolon when
doing the compare in question.

9. The physical sequence of many of the items in the Help file have
been changed to make them more logical. This has no effect on the
actual Help, however, there are programs that will transform the Help
file into a text file that can be used in a word processor or
printed. When this is done to the Help file, the physical sequence of
the items determines the sequence of the items in the output file.
The changes were made in order to make this process easier

******************************* V3.0e  *******************************

The items fixed in Version 3.0e are:

1. The DEF file for the DLL that holds the API's supplied with the
compiler had an incorrect DLL name because of the conversion from
V1.0 of the compiler to V2.01 of the compiler. This meant that
IniMaint and SysMaint would not run without the DDE4MBS.DLL file. The
DEF file has been fixed and the C SET/2 DLL is no longer required.

******************************* V3.0f  *******************************

The items fixed in Version 3.0f are:

1. There were situations where memory would not get freed when
Continue was selected after the Dump Dialog was displayed. Code has
been inserted to insure that everything is freed once the dialog has
been dismissed.

2. If the Save INI file does not exist when an attempt is made to do
a Repair, a logic error 634 will result because an attempt is made to
remove the Read Only Attribute from a file that does not exist and
the code does not test for this condition. The code now makes the
appropriate tests and this error will no longer occur.

3. The initial Explain capability has been added to the popup menus
for each of the three windows. This is a feature that will continue
to evolve over time as more and more is learned about the various
entries in the INI files and Extended Attributes.

4. The Repair File Handles did not correctly process Directory or
File Names that had characters in them that are not considered
printable ASCII characters. The names were immediately identified as
invalid, even though no actual check was made. This turns out to be
an incorrect approach because there are names in non-US versions of
OS/2 that are valid and contain these characters. The code has been
modified so it will check a name from the Handles structure, even if
the name contains characters that are not printable ASCII characters.

5. The EA Test Dialog Write File name was not remembered from one run
of the Dialog to the next. This forces the user to select this file
from scratch every time they want to have the contents of the Listbox
written to a file. The Filename will now be remembered and it will be
displayed as the Default File whenever the Write button is selected.

6. There was still a problem with certain printers being identified
as not being installed, when there were perfectly valid. Additional
changes have been made to the code that validates the printers so
that printers that are valid will not be treated as invalid.

7. The default selection on all three popup menus has been changed
from the Refresh item to the Explain item.

8. The Help for the Popup Menu items: Write, Print and Explain have
been added.

9. It was possible that the Desktop Restore CMD file would not create
the new Desktop Directory structure correctly if the default drive
was not the same as the drive that contains the Desktop. Therefore,
two additional lines have been added to the Restore Command file to
insure that the correct drive is the default drive.

10. The Popup Menus did not have the Accelerator Keys noted as part
of the Menu lines. This information has been added to each line.

11. There were no Accelerator Keys for Write Window to File or Print
Window, these have also been added and are the same for all three
possible windows. An Accelerator Key for Explain has also been added.

12. It was possible to Exit from IniMaint or request a second window
Print or Write while there was already a Print or Write in progress.
In the case of the Exit or Write, several things could happen, but the
most likely was a protection exception. In the case of the Print, a
logic error 1504 would occur because an attempt was made to set a
semaphore that was already set. All of these situations have now been
fixed by the addition of code that will cause the routines involved
to wait for the current activity to be completed.

******************************* V3.0g  *******************************

The items fixed in Version 3.0g are:

1. A number of people have had problems with the Repair Objects item
in the Repair Dialog. Most of the time, user have simply selected the
Do Repair item and then Execute. The effect of this is to remove
every object from the Desktop. In order to address this problem, two
things have been done. First, the name of the item has been changed
from Repair Objects to Destroy Objects and, second, the Do Repair
button warning has been changed to make sure that the user
understands that every Object Destroyed will be removed fro the
Desktop.

2. Many, but not all, Objects have Location information in the
PM_Abstract:Objects entry for the Object in the OS2.INI file.
However, for some reason, not all of the Locations defined in the
Objects are present in the PM_Workplace:Location entry in the OS2.INI
file. This apparent inconsistency does not seem to cause a problem in
the vast majority of situations. However, it is an inconsistent
situation, so an additional Repair Item has been added to the list,
Restore Missing Location Entries, which will display any Objects with
Location information that is not in the Location entry and give the
user the ability to add the appropriate information.

3. The Variable dump did not identify the version of OS/2 being used,
which has caused confusion in certain situations, therefore, this
information is not included in the variable dump.

4. The Repair File Handles and Repair WPS Entries would not work with
versions of OS/2 prior to V2.0 because of a change in the names of
some of the Applications in the OS2SYS.INI file. Additional code has
been added to handle either name format.

5. If a music CD was in the CD-ROM drive when a Repair of the File
Handles was attempted, the Repair would abend with a 1109 Logic Error
because Sector Not Found was returned from the Query Path Info API.
Additional code has been added to handle this return and a couple of
other similar return values.

6. Once a drive was identified as a Network Drive by the Repair
Handles routine, all files and Directories on the drive were
considered to be invalid, even without checking them and even if the
Automatic Repair was set in the Defaults. The code has now been
modified so that Network drives will be handled the same as CD-ROM and
VDISK drives and in accordance with the Default settings.

7. There have been a couple of situations where the Repair
Uninstalled Printers Repair function has caused a problem with the
Desktop. In order to insure that this does not happen in the future,
this item will not work unless the IBMNULL printer is installed, thus
insuring that none of the critical Applications in the OS2SYS.INI
file will have their last Key Name deleted, thus deleting the
Application and causing a problem on the Desktop. If the IBMNULL
printer is not found, then user will be informed of it via a Message
Box and the structures that hold any Uninstalled Printer information
will be cleared and the memory freed.

8. The Restore of the Desktop Directory from the Desktop Menu item
could have worked incorrectly because the Desktop Directory could not
be found, but the user was not informed that an error had occurred.
This was caused by two problems, the first was a place in the code
where a check for an empty Desktop directory was not made and this
problem has been fixed. The second problem was that the IniClean
program would revert to the default directory when it was run without
any input parameters and this has also been fixed.

9. When the Restore Desktop Directory entry was selected from the
Desktop Menu, the CMD file that was built attempted to also unzip a
new copy of the INI files. The unzip was not successful, since the
INI files already existed, but there should not have been an attempt
to unzip them and the code to do this has been removed from the CMD
file.

10. An attempt to reset the Desktop Directory using the Desktop Menu
item would result in a SYS3175 error because of a difference in the
size of a structure that was caused by changing a system wide size
variable and not recompiling all modules. All of the modules have
been recompiled, and this fixed the problem.

11. The reset of the Desktop Directory from the Desktop Menu left two
zip file in the default directory. Additional code has been added to
insure that these files are erased once the restore and reset are
complete.

12. One additional situation was found where an attempt would be made
to delete a printer that was actually installed on the Desktop. The
problem occurs when a specific combination of Driver and Printer
names were used by the installed Printer. Additional code has been
added to identify the problem and prevent the printer from being
reported as not installed.

13. There are three places where WM_TIMER messages are processed, but
non of the code that handled these messages made a check to verify
that the Timer that issued the message was the expected one. The
effect of this was that the code would take some specific action
based on the assumption that a specific Timer event had occurred,
when it was possible that it had not occurred. The specific condition
that identified this problem was a user who had the initial dialog
turned on and had accidentally erased the INIMAINT.HLP file. The user
would get the message that the Help was not available and then,
sometimes, would get a Logic Error 610 and sometimes would have no
further problems. Which event occurred depended on whether there was
a Timer message received from an unexpected Timer while the problem
with the Help was being handled. Additional code has been added to
insure that Timer messages are ignored except when they have been
caused by the appropriate Timer.

14. There were a number of readability problems with the IniHelp.TXT
file, so some changes have been made to improve the readability. Most
of the changes involve adding extra blank lines between paragraphs,
indenting lists, making sure there are two spaces after the end of
each sentence and a few other minor changes.

******************************* V3.0h  *******************************

The items fixed in Version 3.0h are:

1. There were rare situations where the Repair Location entry in the
Repair Dialog would incorrectly identify a missing location, normally
it would report it as <>. This was caused by starting the search for
the location information too early in the Object data. The code has
been changed to start the search at the correct place and also to
ignore a location of <>.

2. There were situations where the Repair Uninstalled Printers Repair
entry in the Repair Dialog would get a logic error 1128 if some of
the required printer information entries had been manually removed
from the OS2SYS.INI file. The code has been changed so that the user
will now be informed via a message box that critical information is
missing, so this type of Repair cannot be done.

3. It was possible to get a Logic Error 1112 when attempting to do
several of the Repair functions because the Open of a Network drive
was successful, but the driver for the Network drives did not
support the DosDevIOCtl API causing an Error Not Supported return
from the API. Additional code has been inserted to handle this error
return along with a number of related errors.

4. There was a problem using the IniClean program when OS/2 was
booted from a floppy because this program needed the INIMTAPI.DLL and
it was normally not available because there was no active LIBPATH.
The compile parameters for IniClean have been changed so that the RTL
is linked statically instead of dynamically, this removes the need
for the API DLL.

5. It was not clear from the documentation that the Restore CMD file
generated by the menu item on the Desktop Menu was only intended to
be run when PM and WPS were not running. Additional documentation has
been added to make this more clear.

6. It was possible to get a 1501 Logic Error when asking for an
Explain of the contents of a folder that contained an Object ID for
an Object that did not exist. An extra check has been added to fix
the problem.

7. If an attempt was made to select a new Target File in the Compare
Files Dialog, the new File Dialog appeared underneath the Compare
Dialog. This was caused by a problem with the Owner and Parent
windows of the two windows. The Owner and Parent relationship has
been changed, so that the boxes will appear correctly.

8. I was possible to dismiss the Compare Files Dialog while the
Select New Target Dialog was active. A 1305 Logic error would then
occur when the Select New Target File dialog was dismissed.
Additional code has been added to prevent the Compare Files Dialog
from being dismissed while the Select New Target File Dialog is
active.

9. When comparing two INI Files on a Key Value Level and an entry was
found in both INI files with the same Application Name and Key Name
but with Values that had different lengths, the Compare would not
mark the Key Values as being unequal. Additional code has been added
to insure that this condition will now be handled correctly.

10. If the Target File selected for a Compare was a file that did not
exist, the file would be created and the Compare would identify the
entire contents of the Source File as not being in the Target File.
Since this is nonsense, additional code has been added to identify
this condition and tell the user that a new file cannot be the Target
for a Compare.

11. If a Logic Error 617 occurred, there was not sufficient
diagnostic information in the Dump Dialog to diagnose the problem.
Additional code has been added to put the appropriate printer
information into the supplemental error text field so that problems
in this area are easier to find.

12. Both the Groups and the Compare Listboxes allowed multiple
selection, but not extended selection, where the mouse button could
be held down and the pointer dragged down the entries. Both Listboxes
have been modified to allow extended selection.

13. If the Default Printer could not be found when an attempt was
made to Print the contents of a window, a Logic Error 617 would
occur. Additional code has been added so that the user will be
informed via a Message Box that the Printer cannot be found and the
Print will simply not be done.

14. One of the most common errors is that an attempt to write to an
INI file will fail. This causes a Logic Error of 704. Frequently, the
user will understand exactly what is going on when this error occurs
and would simply continue, were they to know the exact problem.
Therefore, the Error Handling code has been modified to look for this
error, report it to the user via a Message Box and give the user the
opportunity to continue processing.

15. A number of users have had problems making relatively minor
modifications to the Extended Attributes for a Directory or File.
They have pointed out that the procedure for doing this is not at all
clear. Therefore, an additional item has been added to the On-line
Help and to the IniHelp.TXT file that explains how to make such a
change.

16. For a number of Extended Attribute functions it was possible to
select the same directory or file as both the Source and the Target.
This is illegal and can result in unexpected, but invariably bad,
results. Code has been inserted to check for this condition and, if
it occurs, inform the user and terminate the selected function.

******************************* V3.0i  *******************************

The items fixed in Version 3.0i are:

1. When the Update INI File entry was selected from the Action Menu
and the Confirm Before Update Option was selected, no confirmation
was asked for. The user will now be asked to confirm the update, if
they have selected this Option.

2. When Replacing a Key Value, the user was not asked to verify the
change, even if the Ask Before Change Option was selected. The user
will now be asked if they have selected this Option.

3. When an Application or Key Name was changed and the Ask Before
Change Option was selected, the user was not asked to verify the
change. The user will now be asked if this Option is selected.

4. When the Confirm Before Change Option was selected, a change was
made to the INI file and Cancel selected in the Confirm Dialog, it
was possible for the Confirm Dialog to appear more than one time. The
reason was that the File Updated flag was not reset when the user
canceled the Confirm Dialog. The File Updated flag is now reset
before the Confirm Dialog appears, so it will not appear multiple
times for the same change.

5. The documentation states that the Rename or Duplicate Items on the
Action Menu will allow duplicate Application Names. However, it is
possible that a user will duplicate an Application Name without
realizing it and this could have serious and invariably bad results.
Therefore, additional code has been added to look for this condition
and, when found, the user will be informed via a message box and
given the option to terminate the operation at that point.

6. The Fast Copy Option is not needed for any version of OS/2 higher
than V2.0. However, the Options Dialog would still allow a user to
set this Option. Additional code has been placed in the Options
Dialog that will prevent this Option from being set for and Version
of OS/2 higher than 2.0 and will tell the user that the Option is not
needed for these versions.

7. The Add/Replace Key Dialog did not place the cursor in the ASCII
Text field when the Dialog was initialized, even though this was the
most likely place where information would be entered. The code has
been changed to place the cursor in the ASCII field when the Dialog
is initialized.

8. The Help for the Add or Replace Key Value Dialog only mentioned
that it was for the Replace function, not for the Add function,
therefore, all references have been changed to include a reference to
the Add function as well as Replace.

9. There was no Help entry for the Add Zero Terminator Checkbox in
the Add or Replace Key Dialog. The Help has been added.

10. The Help for the Select Group Dialog and Listing did not mention
that these items cannot be invoked directly, but are called
automatically when a Group needs to be selected. The Help has been
modified to include the additional information.

11. When displaying All Groups in the Groups Dialog, it was possible
to remove an Application from All Groups by deselecting it.
Sometimes, this is the desired action, however, it is sometimes an
error and could create a situation where the user did not remember
the groups to which the Application belonged. Therefore, the user
will now be asked to confirm that he wants to remove an Application
from All Groups if there is more than one Group. If there is only one
Group, the user will not be asked to confirm the removal, since
displaying All Groups is the same as displaying the single Group.

12. When copying the contents of one INI file to another, any
Application which already exists in the Target file will actually get
merged with the same Application in the Source file. This creates a
problem for the IniMaint Groups, so a special check has been added to
the copy code that will check for the IniMaint Group Application and
delete it from the Target file before the Source information is
copied.

13. If certain parts of the Group information got out of synch with
each other, it was possible to create an INI file that IniMaint and
SysMaint could not process. Additional checking has been added to the
code that handles the Group information to insure that any excessive
information is ignored.

14. The Repair Options Dialog did not get the focus when it initially
appeared because of how the initial dialog message was handled. The
Dialog will now get the focus correctly.

15. When the Select Repair Logging File Dialog was selected, the
Options Dialog was not large enough to contain the standard New File
Dialog, so the Options Dialog has been made wider, so it will
correctly contain the New File Dialog.

16. A Repeat Last Find entry has been added to the Find Menu. This
entry has also been added to the Popup Menus. In previous versions it
was necessary to go through a couple of steps to do a Repeat Find,
which is the most common selection.

17. The 'Global Find' entry in the Find Text Dialog has been changed
to 'Global Find Text' to make it more clear.

18. The 'Select New Desk Directory' has been changed to 'Select New
Desktop Dir.' in the Desktop Defaults Dialog.

19. A new version of the UNZIP program is now available. Since the
new version comes as a 16 bit version and a 32 bit version, the name
of the EXE file has been changed from UNZIP.EXE to UNZIP32.EXE for
the 32 bit version. Since UNZIP is used in a number of the SysMaint
Desktop functions, the code that searches for this program will now
first search for UNZIP32.EXE and, if that is not found, search for
UNZIP.EXE. The code will only fail if neither EXE is found.

20. A new Version of the ZIP program, V2.0.1, has just become
available. This version will not ZIP a file that has the System
Attribute set unless an additional parameter is supplied, -S. This is
a required parameter for OS/2 2.11, which is OS/2 2.1 with the
Service Pack, because both the OS2.INI and OS2SYS.INI files have this
Attribute turned on because they are always open. The previous
version of ZIP would ZIP files with the System Attribute on without
the -S parameter. In fact, the -S parameter is not valid for versions
of ZIP prior to V2.0.1. Therefore, it is necessary for SysMaint to
know the version of ZIP being used in order for it to know whether to
add the -S parameter to the line that runs the ZIP program. Since
there is no way to know this by looking at the program, whenever the
Backup Command file is being created, the user will be asked which
version of ZIP they are using.

******************************* V3.0j  *******************************

The items fixed in Version 3.0j are:

1. When making a Backup of the Desktop or creating the Backup CMD
file, the user is asked if they have a new or old version of the ZIP
program and one of the options is to cancel the action. If the action
is to make a Backup of the Desktop and Cancel is selected, the Backup
attempts to proceed anyway. This will no longer happen and Cancel
will actually Cancel the Action.

2. The Compare Files Dialog can be used to compare either INI files
or EA files. However, the text for the Source and Target files
specifically refer to INI files. The text has been modified to remove
the INI designation.

3. If the MultiMaint Portable Restore tried to restore certain WPS
WPProgram values with the original value set for the Object, the
Restore did not work because the original information had already
been freed. Additional code has been inserted to fix this problem.

4. When Restoring a WPProgram Object, the EXE Name and the Default
Directory would sometimes not be set. This was mostly true when the
Object was restored to a different machine, but could happen on the
same machine. Additional checks have been added to fix this problem.

5. The Message Box displayed to confirm that a Change should be made
always asked if the Key Value should be changed, even if that was not
the modified item. The text in the Message Box has been modified to
make it more general.

6. If the Copy or Move item is selected on the Extended Attribute
Menu and the Target File does not exist, the Dump Dialog will appear
with a Logic Error of 1 and a DOS Error of 206. This has been fixed.

7. When Comparing Extended Attributes, the parent of the Compare
Dialog was made to be the SysMaint Window. Therefore, if the window
was not large enough, now all of the Compare Dialog could be seen.
The Parent has been changed to the Desktop, so the entire dialog can
be seen, no matter how large the SysMaint window is.

8. In the Variable Data Entry Dialog, it was necessary to tab to the OK
Button and then hit Enter in order to dismiss the Dialog. Additional
code has been put in this dialog to check for the Enter Key and, if
the window with the focus is still the Entry Field, the Dialog will
act as if the Enter Button was selected.

9. There were a couple of situations where a Logic Error would set
the Error Code correctly, but the Dump Dialog would not appear. The
reason for this was that there were a few situations where some
windows were not cleaned up before an attempt was made to display the
Dump Dialog. Code has been inserted to insure that these windows are
cleaned up correctly.

10. The EA validation code would mark a text string EA as invalid if
it contained a CR or LF character. This is an error, since many names
of Objects on the Desktop are multiline entries and will contain on
or both of these characters. The problem has been fixed by adding
code to check for these two characters when examining a text string
and treating them as valid characters.

11. Many of the Dialogs did not have a Default Button that would be
executed when the Enter Key was pressed. This has been added to all
of the Dialogs for which it is appropriate.

12. If the MultiMaint Portable Backup found a Shadow Object and got a
valid pointer to the Object being Shadowed, but was not able to find
the original Object, a Logic Error 1737 would occur. Since this is a
possible condition and simply indicates that the Shadowed Object
does not exist, the code has been changed to treat this as an Orphan
Shadow.

13. There was a problem with the MultiMaint Portable backup where the
Real Name for the Desktop would be recorded in the *.WPS file twice,
once with the incorrect Application Name. This would cause a problem
when the Restore was attempted because the incorrect entry would not
have a Level Key Name and would cause an error while attempting to
load the Restore Window. The problem has been fixed.

******************************* V3.0k  *******************************

The items fixed in Version 3.0k are:

1. The Accelerator Keys were added for the MultiMaint items on the
Desktop Menu.

2. The Help for the Portable Backup and Restore was added to the Help
file.

3. There were conditions where selecting Cancel in the New File
Dialog while selecting a new Target File for the Compare would cause
a Protection Exception because the default filename was placed in a
structure even if the default filename was a NULL pointer. The
default will not be placed in the structure unless it is verified
that the user has actually selected a new file.

4. The Deskman/2 Setup code could leave a reference in
PM_Workplace:Location that did not exist in PM_Abstract:Objects. The
IniMaint Repair would flag this an invalid entry and remove it.
However, the entry would return because it is needed by Deskman/2.
Additional code has been added to the Repair WPS Entries routines to
look for this special entry and to treat it as a valid entry if the
user has turned on the Option to Bypass Known Errors in the Repair
Options Dialog.

5. There were situations where the variable dump would not contain
all of the required information for very large Desktops because the
number of lines of any one kind of data was terminated at 1,000
lines. This limit has been raised to 5,000 lines.

6. There was at least one condition where an Object that was restored
by MultiMaint would be positioned correctly on the Desktop, but the
position would not be correct after the Desktop was reset. Additional
code has been added to check for the condition and insure that the
Object Instance information is saved before the Desktop is reset.

7. Certain Objects were not Restored to the correct position by the
MultiMaint Restore. This was caused by the position information being
overwritten by the default position information. An additional check
has been added so that the valid position information will not get
overlaid.

8. If the Directory specified for the Portable Backup did not exist,
then the Portable Backup would report that the INI files could not be
copied and would then popup the Dump Dialog with a generic Logic
Error code of 1. The routine has been modified so that the user will
be informed, after the first copy does not succeed, that the Backup
cannot be done because the INI files could not be copied.

9. There was a condition where the EA information from a number of
the EA functions could end up in the incorrect file. Specifically,
the current INI file would end up with the EA information rather than
have it placed in a separate file. There were a number of things that
had to occur in order to make this happen. An additional check has
been added to the code that selects the Target file for these EA
functions so that the problem will not reoccur.

10. There were some situations where the Repair File Handles would
create a File Handle Structure that was not valid and this would
result in Desktop corruption upon rebooting OS/2. The problem only
occurred with HPFS Filenames and required that the Filename contain a
comma, be a file that did not exist and in a directory that did not
exist. The Repair code has been changed so that an invalid Directory
will force all Files and Subdirectories to be invalid. A side benefit
of this change is that the File Handle Structure is now loaded more
quickly, especially if there are a number of invalid Directories.

11. If an attempt was made to Restore an Object whose Class was not
one of the standard Classes, such as the Desktop when ExtendedDesktop
was being used, and the Object was not in the first group of Objects
being Restored, the Restore would not work because of a data error
10. The reason this occurred is because the structure that identified
the non-standard Classes was freed after the first set of Objects
were Restored. The code has been changed so the structure will only
get freed after all of the Restores are done.

12. There are a number of Classes of Objects that use unusual
identifiers to save instance information that is not normally saved
by the standard WPS methods. While some of these Classes were handled
correctly, unknown Classes were not handled. Additional code has been
added to handle these situations correctly.

13. When there were substitutions needed for the proper handling of
Restoring Instance information for non standard Classes, the
substitutions were not recorded in the WPS Logging file, thus
making it difficult to verify how these classes were handled.
Additional code has been added to log this information.

******************************* V3.0l  *******************************

The items fixed in Version 3.0l are:

1. There were situations where MultiMaint would reset the Desktop
when it was not necessary. The setting of the Reset flag has been
moved so that the reset will not occur unless it is necessary.

2. There was a condition where the Repair Dialog could get a SYS3175
error if the fully qualified name of a Directory and/or a File was
very close to the maximum number of characters. The size of the
variable that holds this data and all variables that hold similar
data were expanded, where necessary, in order that this problem will
not occur again.

3. The new version of ZIP will not ZIP files that have the System
Attribute on without a special parameter. The same parameter is
considered an error by a previous version of ZIP. This had been
handled by asking the user which version of ZIP they had each time
the Snapshot Backup CMD file was created. Many users found this
annoying. The creation of the Backup CMD file has now been changed so
that the System Attribute will simply be turned off before an attempt
is made to ZIP the OS2.INI or OS2SYS.INI files. The attribute will be
left off, since it does not cause any problems and will get reset at
the next Boot anyway.

4. Folders whose WPS Class was not the standard WPFolder Class would
not get their contents saved except for the very first time they were
encountered. The routine which identifies which objects are Folders
or have a WPS Class that is derived from WPFolder has been changed to
fix this problem.

5. Still another problem was found in the Repair Uninstalled Printers
routine and fixed.

6. There were a couple of places in the code where an Application/Key
Name combination with a one byte Key Value would be interpreted as a
missing Key Name. This was code that was left over from an old
problem with one of the Prf API's. All of the affected areas have
been updated so that only a true return of Zero from the appropriate
API will be interpreted as a missing Key Name/Value combination.

7. An additional Option has been added to the Desktop Default Dialog
that will allow the user to specify whether they want the System
Attribute reset whenever the Backup CMD File is rebuilt. This Option
only applies to OS/2 V2.1 with the SP and beyond. In order to insure
that the User makes a decision on this issue, the first time that a
Backup CMD file is created under the appropriate version of OS/2, the
user will be asked how they want to handle this area. Once this
question is answered a single time and the Option is set, based on
the answer, the user will not be asked the question a second time,
but can always modify the Option by using the Desktop Defaults
Dialog.

8. There was a problem with the position of Objects Restored to the
Desktop would not be preserved once the Desktop was reset. This
problem occurs on Desktops that have installed the OS/2 V2.1 SP and
beyond. In the process of working on this problem, it was discovered
that the Reset of the Desktop after Restoring Objects with the Safe
Restore Box unchecked was not necessary for this version of OS/2.
Therefore, the code has been modified so that the Reset of the
Desktop will not be done for OS/2 2.1 SP and beyond.

9. Solving the problem described in 8. above created a new problem for
the situations where an Object is Restored to the Desktop, the Class
of the Restored Object replaces an existing Class and the new Class
is not already registered.  In this case, the replacement will not be
effective until the Desktop is Shutdown and OS/2 is Rebooted.
Therefore, code has been added to identify when the Shutdown should
occur and will either do the Shutdown or ask the user if they want
the Shutdown to be done, based on a new Option in the Portable
Defaults Dialog.

10. The best thing to do after a number of Objects have been Restored
via the Portable Restore is to immediately Shutdown the Desktop and
Reboot OS/2. Additional code has been added to ask the user if they
want this done, assuming that the condition described in 9. above
does not exist. This feature can be turned off via a new Option in
the Portable Defaults Dialog.

11. For versions of OS/2 prior to 2.1 with the SP, the Desktop would
get Reset if certain kinds of Restores were done. The user had no
control over whether this was done or not. In order to give the user
additional control, a new Option has been added to the Portable
Backup Defaults Dialog that will allow the user to decide whether the
Reset should be done or not.

12. At least one situation has occurred where the Hidden Attribute
was left on the OS2SYS.INI file. In order to prevent this from
creating a problem with the Snapshot Desktop Backup, all of the lines
in the CMD files that remove the System Attribute have been changed
to also remove the Hidden Attribute. Since the Hidden Attribute is
virtually never set, this will have no effect except in those
situations where it is critically important.

13. Since it is easy to set file associations in OS/2 2.0 and beyond,
the entry on the File Menu to do this, which was included because of
problems with OS/2 V1.3, has been removed.

14. There were a number of places where warnings were issued to users
before various functions were performed. While these warnings are
important for most users, there are a number of experienced users who
are aware of the issues involved with some or all of the various
functions that were the subject of the warnings. In these cases, the
users felt that the warnings were in the way and an irritation. In
order to address this, additional options have been added to the
Options Dialog, the Repair Options Dialog and the Desktop Defaults
Dialog that will give the user the ability to turn off the
following warnings:
   1. Change the User and/or System INI file
   2. Repair the File Handles
   3. Destroy Desktop Objects
   4. Reset Desktop Directory
   5. Restore the Desktop INI Files
   6. Build the Desktop Restore CMD File
   7. Reset the Desktop WPS ID

******************************* V3.0m  *******************************

The items fixed in Version 3.0m are:

1. There was an additional place in the Repair File Handles and
Repair WPS Entries where a Not Ready Condition on a drive would
result in a logic error 1109 rather than the drive being marked as
not accessible. Code has been added to fix the condition.

2. In order to make it easier to handle the Defaults for the Portable
Restore, an additional button has been added to the bottom of the
dialog that will allow the user to bring up the Defaults Dialog while
the Portable Restore Dialog is active and change the defaults without
having to dismiss the Portable Restore Dialog, change the defaults
and then restart the Restore.

3. To aid in diagnosing problems a Dump button has been added to the
Portable Restore Defaults Dialog. This alone with the change above,
will make it possible to obtain a dump while the Portable Restore is
active.

4. One of the new Options in the Portable Defaults Dialog would get
set incorrectly because of an incorrect variable name. The code has
been corrected.

5. A new Option has been added to the Portable Defaults Dialog,
Select Lower Level. If this Option is checked, then selecting or
deselecting any entry in the Portable Restore Dialog will
automatically make all lower level entries have the same selection
state. For example, if this Option is checked and a Folder is
Selected for Restore, then all items in the Folder will also be
selected. This makes it much easier to Restore an Entire Folder and
its contents, since everything can be selected with one click of the
mouse.

6. The sequence of the entries in the Repair Dialog drop down list
has been changed to put the Repair Options in a sequence which more
closely reflects their probability of being selected by the user.

7. Two new Types of Repair have been added, Do All WPS, PM and File
Handle Repairs and Do All Individual INI File Repairs. Each of these
is a short hand way to do a group of Repairs with a single selection
and are designed to make it easier for the experienced user to use
the various Repair functions.

8. Additional text has been added to the Help entry for What does
Repair Do. The purpose of the additional explanation is to make a
better distinction between those kinds of Repairs that are System
level Repairs and will always do the same thing, no matter what is
the current INI file, and the Individual File Repairs that apply only
to the current INI file. Many users have been confused by this
difference and thought that it was necessary to have the OS2.INI file
as the current file when the WPS, PM or File Handle Repairs were
done. In addition, some users would do the System Level Repairs more
than one time, with different INI files as the current file. While
this did not do any damage, it was a waste of the user's time, so an
attempt has been made to make this area more clear.

9. In certain Network Printer situations, the Delete Unused Printers
Repair would attempt a compare using a NULL pointer, thus causing a
SYS3175 Abend. An additional check has been inserted to fix this
problem.

10. The various documentation files and the On-line Help were not
clear about the fact that IniMaint is a Shareware program, but the
other applications, SysMaint and MultiMaint, are not and can only be
tried by registering them. A number of changes have been made to all
the file affected to insure that this difference is as clear as
possible to all users.

11. The temporary files left by WPSBackup have been removed from the
code that bypasses standard errors. These references should be
removed from the File Handle Structure, since they do not exist at
the time the Repair is done.

12. There were some problems with the code that tested the User and
System INI files to see if they could be written to. One problem
would cause an immediate logic error if the user had already been
informed of the problem and had chosen not to do anything about it.
However, there were a couple of other combinations that could also
cause an error. The code has been substantially reworked so that it
will not operate as expected.

13. It was possible, although fairly hard, to get the window size
small enough that it would appear that the main window was not
visible. It was also possible to change the position of the window so
that it was not visible on the screen. Changes have been made so that
neither of these conditions can now be set.

14. A new entry has been added to the SysMaint Extended Attribute
Menu: Delete. Selecting this entry is exactly the same as Split in
that the Extended Attributes are deleted from the source
Directory/Files selected. However, the EA's are not saved in another
file so that they can be reattached at a later time. This item was
added for two reasons. First, it was not clear to many users that the
Extended Attributes could be deleted. Second, there are occasions
where all the user wants to do is delete the EAs and has no desire or
need to save them.

15. If there were a large number of Printers in the OS2SYS.INI file,
the Delete Unused Printers could have a problem with the reallocation
of a memory area causing a SYS3175 filling the Repair Window. The
code has been changed to increase the size of the memory area so the
error will no long occur.

16. Improvements have been made in the Repair Directory and File
Handle code so that it will handle Directories and Files on Network
Drives better. The changes will now still look for Directories and/or
Files on Network Drives that cannot be opened by the DosOpen API.

17. There were some VDISK devices which were not correctly recognized
since they appeared with a floppy drive type. An additional check has
been inserted in the code that handles the floppy drives so that
these drives will be correctly identified as VDISK drives.

18. A new Option has been added to the Desktop Defaults Dialog,
Do Restore CMD when Backup. If this Option is checked then the
Desktop Restore CMD file will always be generated whenever a Desktop
Backup is made.

19. The ability to Backup files that are not an integral part of the
Desktop, Supplemental Backup, has been added to the Desktop
capabilities of SysMaint. Adding this capability involves a number of
new entries on the Menu, including an item to manage the list of
files to be included in the Supplemental Backup, the ability to
Create the Backup and Restore CMD Files and the entries to do the
actual Supplemental Backup and Restore. In addition, an Option has
been added to the Desktop Defaults Dialog that will cause the
Supplemental Backup and Restore to be included with the standard
Desktop Backup and Restore.

20. The Desktop Restore CMD file has been changed to improve the
reliability of the Restore by adding a parameter to the UNZIP line
that will force the file to be Restored to the correct drive no
matter which drive is the default drive.

21. The Deleted Unused Printers code would not identify some printers
as not being installed if the information in the OS2SYS.INI file was
consistent. Code has been added to check the list of valid printers
against the Printer Object information that is in the INI files. Even
if the printer information is consistent, a printer will be marked as
uninstalled if there is no Printer Object information for the
Printer.

22. A additional check has been added to the Repair File Handles code
that will identify the situations where a drive letter for a specific
drive gets replaced with a filename. When this happens, all of the
files on the drive are identified by WPS as being in the Directory
and the File Handles cannot be used. This condition will be identified
as an Invalid Root NODE and can be fixed by the File Handle Repair
routine.

23. If a File Handle was correctly identified as being on a Network,
CDROM or VDISK drive and there was a WPS Object associated with the
File Handle, the WPS Repair code would mark the Object as being
invalid. The WPS Repair code has been changed so that it will no
longer treat File Handles as invalid locations for WPS Objects in
these situations.

******************************* V3.0n  *******************************

The items fixed in Version 3.0n are:

1. Since it can take sometime to process the Extended Attributes if a
large number of Directories and/or Files are selected, the name of
the Directory or File currently being worked on will not be displayed
in the Working Dialog.

2. The Portable Restore in V3.0m would not initialize unless there
was a file in the Backup Directory with the Portable Backup Root
filename, but with no extension. For example, PORTBK01. This was
caused by a problem in the routine that gets the generation the user
wants to use and has been fixed.

******************************* V3.0o  *******************************

The items fixed in Version 3.0o are:

1. The loading of the Portable Restore window was done as part of the
normal PM thread, but it takes too long to be in this thread, so it
has been moved to a secondary thread.

2. The in progress type Dialog Box that is displayed in a number of
situations has been modified to make it longer and to have it display
a second line of information showing what item is being worked on.
For example, the Processing EAs progress dialog will now list the
Path or Filename that it is currently working on. Even though the
list changes very quickly, it makes it clear to the user that
something is going on and allows the user to get an idea of how close
they are to being finished. This has also been extended to all of the
Portable Backup and Restore Dialogs, since some of these operations
can take a relatively long time.

3. When Display or Destroy Objects was selected in the Repair Dialog,
the list of Objects was inserted in the Window in the sequence that
they were found in the INI files. This made it difficult to find a
specific Object. In order to make this easier, the list of Objects
will not be sorted before the window is displayed.

4. If an attempt was made to create the Supplemental Backup or
Restore CMD files, but no Supplemental Files had been chosen, then
the generated CMD file did nothing other than update the existing
generations. The routines have been changed to test for any
Supplemental Files before the CMD file is generated and inform the
user that they must select at least one Supplemental File before the
CMD files can be generated.

5. If the user selected to have the Supplemental Backup and Restore
done at the same time as the normal Backup and Restore, but had not
yet build the Supplemental Backup and/or Restore CMD files. The
normal Backup and Restore CMD files would be built without the line
to call the Supplemental Backup and/or Restore CMD file. However, the
user was not informed of this. The code has been modified so the user
will be informed and will be given an opportunity to build the
Supplemental Backup and/or Restore CMD file at the time it is
discovered that it is missing.

******************************* V3.0p  *******************************

The items fixed in Version 3.0p are:

1. The MultiMaint Portable Restore would get a Logic Error 1701 if
the Desktop being Restored did not have any Objects on it that were
not standard Class Objects. This was caused by an attempt to allocate
a new class structure even though there were no new classes.

2. There was nothing in the Help that told the users that the
Condense was not necessary for OS/2 V2.1 and higher, so it has been
added.

3. Some additional Network error checks were added to the Repair
File Handles routines to fix a problem with some network situations.
Specifically, one user got a Logic Error 1109 with a Dos Error of 53,
which was not handled by the Repair routines.

4. The code in the WPS Repair routines to bypass the invalid entry
placed in the OS2.INI file for the Deskman/2 Setup was incorrect. The
code was looking for DMSetup and should have been looking for
DM2Setup.

5. The Restore CMD file generated by the Desktop Menu did not check
the return code from IniClean. Therefore, the Restore would not pause
if there was an error removing the current Desktop. Additional lines
have been added to the CMD file  to make this check, pause the
execution of the CMD file and give the user the option of continuing
or terminating the run at that point.

6. At least one user has installed a new version of VDISK that is not
being correctly identified by the File Handle Repair routines as a
VDISK, but is being identified as an Unknown Drive. In addition,
users who have Network File Handles and do a File Handle Repair will
have the Network entries identified as Invalid or as Unknown Drives.
In both of these cases, the user does not want the information
removed from the File Handle structure, but there was no way to do
this other than removed the Invalid File Handles on a selected basis.
In order to address both of these problems, two additional sets of
entries have been added to the Repair Options Dialog that will allow
the user to Ignore or only report these types of entries. This will
make it considerably easier to bypass these entries when the user
has either of these conditions.

7. The code to bypass the Deskman/2 Install entry that is incorrectly
placed in the PM_Workplace:Location application in the OS2.INI file
was incorrect. The code was looking for a Key Name with DMSetup and
the correct Key Name is DM2Setup. The code has been changed so that
it will look for the correct entry.

8. If the Restore CMD file included the Supplemental Restore, the
generation number the user wanted to use for the Restore was not
passed on to the Supplemental Restore CMD file. The creation of the
Restore CMD file has been modified to now pass along the generation.

9. There were some places where file names, which could contain
blanks, were not enclosed in quotes in the Restore CMD file. This has
been fixed.

10. If the Repair Item Window had the Focus and Help was requested
while the Repair Dialog was on the screen, a Logic Error 5106 would
occur with a Help Error of 2010. This was caused by the fact that
there was no Help written for the Item Window although a Help Panel
ID was defined. The Help for the Repair Item Window has been written
and placed in the file.

11. There were a number of situations where a SYS3175 could occur at
the end of the processing of a Backup or Restore function because
of a change in the INI files without closing the current INI file or
closing the current INI file without testing if there was an update
outstanding. All of these situations have been corrected and the
update routine has been modified so that it will check for an open
file before it attempts to write a change to the current file.

12. There were situations where the controls for one Dialog would
bleed through to a dialog that was overlaying it. This was most
common with the New Files Dialog when it overlaid things like the
Supplemental Files or Repair Options Dialogs. The problem was caused
by in incorrect Parent Window for the overlaying Dialog and all of
these conditions have been fixed.

13. The Add DOS entry in the Supplemental Backup Files Dialog would
add the AUTOEXEC.BAT type files for all of the Objects on the
Desktop, but would not add the default AUTOEXEC.BAT file, if it was
not there. Additional code has been added to the Add DOS routine to
insure that the default AUTOEXEC.BAT file is included, if it can be
found.

14. If Bypass Known Errors is selected in the Repair Options Dialog,
then any entry in PM_Workplace:Locations that has an Object Handle
that is in the WPTransient range, but does not have an Entry in the
PM_Abstract:Objects application will be treated as a generic
Transient Object. This condition occurs when an ObjectID is assigned
to a WPTransient Object or an Object derived from WPTransient.

15. Some code that was being used to test Drag and Drop situations,
but had not yet been fully tested was left active. This could cause a
number of different problems if something was dropped on one of the
windows. The code has been changed so it is no longer active.

******************************* V3.1  *******************************

The items fixed in Version 3.1 are:

1. If there were no Printers installed and the Repair Unused Printers was 
attempted, the message box that said that the Repair could not continue. 
The Printer Repair routine has been updated so that it will recognize the
situation where there is no printer installed and simply no Repair anything.
The message box text has also been changed so that it is clear that only the
Printer Repair cannot continue when the Printer Repair routine encounters 
an error.

2. When an attempt was made to switch the contents of the Portable Restore
Window, the Changing Contents Dialog was never removed from the screen
and would overlay the window contents. Code has been added to insure that
the Changing Contents Dialog is removed.

3. There were situations where the WPS method used to set the name of a
Printer Object would return a FALSE return code for unknown reasons. Since
the Name is not critical to the Object, but would terminate the Restore
for that Object at that point, the code has been changed to continue with
the Restore of the Object even if the Method does not give a good return.
If logging is active, the fact that the return was bad will be logged,
but the Restore of the Printer Object will continue in any case.

4. The Restore Objects code has been changed to add the Style information
to the string used to set the initial Object information. This was done to
address problems with Restoring certain Template Objects that would return
an error return code from the WPS method used to set this information.

5. The WPS method used to set the Icon information for certain Template
Objects returns an error return code even though the information is set
correctly. Therefore, the code has been changed to simply bypass this
error return and log it to the logging file, if it occurs.

6. When a new Backup Directory or a new name for one of the Backup
CMD files was chosen, it was often the case that the user really
wanted to change all of the CMD files to a new Directory. The only
way to do this was to do them one at a time. In order to make this
easier, a new Option has been added to the Desktop Defaults Dialog
that allows the user to specify that they want all of the Paths
changed when any of the Paths change.

7. The Icon used by all three applications has been changed in order
to avoid possible copyright problems.

8. There have been a few situations where there were too many
Applications, Key Names or User Data entries for the capacity of the
window control used to hold the information. When this occurred, a
logic error 607 would be reported. The fact that an error was
reported did not give the user the ability to do anything about the
problem, even when it was understood. In order to address this, the
user will now be informed that the problem has occurred and be given
the option of continuing with as much data as could be loaded into
the window in question.

9. The Supplemental Backup has been changed so that the user can
specify a User Backup and Restore CMD  file. If specified, the CMD
files will be run when the Supplemental Backup and Restore are run
assuming the CMD files can be found.

10. Wildcards  can now be used in the Filenames for the Supplemental
Backup and Restore, thus making it easier to specify a group of
files.

******************************* V3.1a *******************************

The items fixed in Version 3.1a are:

1. The code to check path and file names did not handle an Access
Denied error return correctly. This error is returned in some cases
in Network situations and the routine has been modified to handle it.

2. The maximum length for a Key Value that could be modified via the
Replace Key Value entry on the Action Menu was 2000 bytes. This turns
out to be too small, so the maximum value has been increased to 7000
bytes.

3. There were a number of places where a loop could occur trying to
post an error message if sending a message to a window failed. All of
these situations have been fixed.

4. The Folder Sort information will now be Saved and Restored by the
Portable Backup and Restore code even if the Safe Backup and Restore
Option is chosen.

5. A new feature has been added to MultiMaint that allows the user to
Display and/or Modify virtually all of the Object information for all
of the Objects on the Desktop. Although most of this can be done via
the Settings Notebook, it can only be done one Object at a time. The
MultiMaint feature allows the user to specify ranges of Objects that
they want to work with in a number of different ways, making it
extremely easy to Display and/or Modify all of the Objects in a very
short time and with little effort.

6. If a Shadow of a File Based Object, like a Folder, was created, a
Portable Backup of the Desktop made, the File Object the Deleted and
recreated and a Portable Restore was done. The Shadow was not
recreated even though it was destroyed when the original Object was
removed. The rules for recreating Shadows has been changed so that
this condition will not be handled correctly.

7. The Safe versions of SysMaint and MultiMaint would not correctly
set up the menu structure because they would not check for the
registration information. The check will now be made.

8. There were situations where the Open Size and Position for Folders
would use an old value in place of the current one because there were
two entries in the OS2.INI file and the wrong one was looked for
first. The sequence has been changed and the correct information will
now always be used.

9. One user got a logic Error 1720 while making a Portable Backup of the 
Desktop. The diagnostic information in the Dump File was not sufficient to 
adequately diagnose the problem and identify which Object was in the process 
of being processed when the error occurred. Additional code has been added to 
insure that this problem is adequately reported.

10. In reference to 9. above, the way the memory is handled for the 
wpQueryIconData method has been made even more conservative that it was 
before and should fix the 1720 Logic Error.

******************************* V3.1b *******************************

The items fixed in Version 3.1b are:

1. The MultiMaint Modify Settings for the Object Style has been changed from 
just a number to a different setting for each Style.

2. The necessary modifications for the Safe versions of the programs has been 
included.

3. When modifying the Object Settings in MultiMaint and the Ignore Remaining 
or Do Remaining checkboxes were checked. The flags were not reset before the 
next type of change was chosen. Therefore, the dialogs never appeared, but 
the action indicated by the checkboxes from the previous operation was 
automatically executed for every Object. Since everything was, by definition, 
unchanged, the net effect was that it was not possible to change anything.

4. Code has been added to interpret and correctly set the Default View 
information for the MultiMaint Modify Settings Dialog.

5. Code has been added to interpret and correctly set the Program Type 
information for the MulitMaint Modify Settings Dialog.

6. A couple of minor adjustments have been made to the Select New file 
routine to correct problems some users were having.

7. Some of the default menus in the MultiMaint Object Settings dialog did not 
have any default menu items. This caused the menus to only stay on the screen 
if the mouse button was held down. Default entries have been added, so that 
this is no longer necessary.

8. Some of the Settings information for the Drives Objects for the individual 
drives was not saved and restored correctly because the WPDisk Class was not 
included in the list of classes for which this information was needed. These 
Objects will now have all of the appropriate information saved and restored.

9. Because of 8. above the MultiMaint Settings Dialog would not Display or 
Modify the Always Maintain Sort Order flag for the individual Drive Objects, 
but will now do it correctly.

10. Some of the System Accelerator Keys Alt-Fx were used by various menu 
functions and this interfered with using the Keys for the standard OS/2 
system things. The Accelerator Key use has been changed to avoid Alt-F4 thru 
Alt-F10.

11. When any of the WPS Settings were displayed, the Dialog button to go back 
to the main Display or Modify Dialog had the text "Exit". This is confusing 
since it implies Exiting from the entire function. Therefore, the text has 
been changed to "OK".

12. The MultiMaint Display or Modify Object Settings Filter Menu did not 
identify which of the Class Type menu items was set by placing a checkmark 
next to the current filter setting. Code has been added to supply the 
checkmark for the current filter.

13. An option has been added to the MultiMaint Display or Modify Object 
Settings Filter Menu that allows the user to limit the contents of the window 
to only those Objects that pass the Class Include/Exclude Filter. This can be 
used to limit the number of Objects that are currently displayed.

14. An option has been added to the MultiMaint Display or Modify Object 
Settings Filter Menu that allows the user to cause the Filter Type setting 
information to be remembered from one use of the dialog to the next. This 
allows the user to control the initial contents of the window from the time 
that the dialog is initially invoked from the Main Menu. The only thing that 
will not be remembered from one time to the next is any Classes that were 
specifically Included or Excluded.

15. The SysMaint Desktop Backup and Restore code would not handle
Hidden Files correctly if they were in one of the Desktop
Directories. First, the Back CMD file would not include these files
in the ZIP of the Desktop Directory structure, since the -S parameter
was not included for ZIP. Second, the IniClean program would not find
Hidden files, therefore, would not delete them and would leave one or
more Directories in the old structure. Both of these problems have
been fixed.

16. The ability to select Objects by Name has been added to the
MultiMaint Object Settings Dialog Menu.

******************************* V3.1c *******************************

The items fixed in Version 3.1c are:

1. A number of improvements were made in the initialization of the
MultiMaint Agent Object.

2. The Folder Attributes will not be presented in interpreted form
rather than as a hex value.

3. The Title has been removed as one of the things that can be
changed in the MultiMaint Settings, since it is not something that can
be changed globally and changing the Title has many side effects that
are difficult to handle.

4. The code to correctly handle changing the type of Windows Program
between Enhanced and Standard has been added to the MultiMaint
Settings routines.

5. Code has been added to inform the user that the WIN_CLIPBOARD
setting cannot currently be changed, since we do not currently know
how to legally set this value.

6. When a Program Object is Restored via the Portable Restore and the EXE or 
Startup Directory cannot be found, an attempt is now made to find the file or 
directory anywhere on the HD. If they can be found, the name will be 
automatically adjusted to the new name. This algorithm will always handle 
situations where the files or directories have simply been moved from one 
drive to another preserving the directory structure.

7. There was sometimes problems doing a Shutdown after the AccessWPS Agent 
Object was used. This is because there were some objects left in a locked 
condition. The code has been changed so that this will no longer be the case.

8. There were a number of situations, including some on my own system, where 
the AccessWPS Agent would terminate with a 10209 error. This error indicates 
that the Agent Class has terminated. It appears that the problem was caused 
by the Class Uninit Data Method being called even though the Agent Object was 
still active. Code has been added in the Class Uninit Method to handle this 
situation.

******************************* V3.1d *******************************

The items fixed in Version 3.1d are:

1. The method for collecting the Objects in a Folder was changed back to the 
prior method with the addition of an Unlock of each Object. This was done 
because many users had problems with the new method and the only reason for 
the switch in the first place was a problem shutting down the Desktop and the 
Unlock fixes that problem.

2. Code was added to both AcsTest and MultiMaint to tell the user that the 
AcsAgent.DLL file was probably in the wrong directory if the user gets a 
10200 error code.

3. If there was a problem during the initialization or termination of the 
AccessWPS Object when working with the Object Settings item. The generic 
logic error code of 1 was reported, rather than the error code returned from 
AccessWPS. The Object Settings routine has been changed to report the error 
code correctly.

******************************* V3.1e *******************************

The items fixed in Version 3.1e are:

1. The code for the WPS Settings Dialog needs to collect detail Object data 
on Shadows in order to insure that all of the Shadow cross-reference 
information is displayed, when requested. This was being done at the same 
time that the basic information was collected. This was causing errors in a 
number of situations because of the placement of the Shadows relative to the 
Object being Shadowed. The code has been changed to go all the way through 
the collection of the basic information before the Shadow information is 
collected.

2. If the INIMAINT= entry was included in the CONFIG.SYS file and the 
OS2SYS.INI or OS2.INI files could not be written to, the user was not 
informed of the situation at startup time. Additional code has been added to 
insure that the user is informed no matter what is coded in the CONFIG.SYS 
file.

3. There were a number of places where very long real names or titles for WPS 
Objects would cause corruption of the Stack during any of the various WPS 
operations. This has been fixed by making the size of the variable dynamic 
and based on the max path length, moving the variable from the Stack to the 
Heap and increasing the size from 100 more than the maximum path to 10 times 
the maximum path.

******************************* V3.1f *******************************

The items fixed in Version 3.1f are:

1. MultiMaint was collecting WPS Instance information on Shadow Objects that 
is not valid for Shadows. This was not causing a problem on V2.11, but was 
causing a SYS3175 in SOM.DLL on later versions of OS/2. The code has been 
modified to no longer collect the inappropriate instance information for 
Shadow Objects.

******************************* V3.1g *******************************

The items fixed in Version 3.1g are:

1. MutliMaint was unlocking every Object for which it was collecting 
information because of a past problem with Shutdown. This was causing a 
SYS3175 in SOM.DLL. The code has been modified to no longer unlock the 
Objects. In other words, the fix above fixed the wrong thing.

******************************* V3.1h *******************************

The items fixed in Version 3.1h are:

1. The Object Settings Dialog would get a SYS3175 if any of the Settings for 
the Desktop were requested. This was caused by the fact that the Desktop is 
not contained in another Folder, so the Folder EAs cannot be found. 
Additional code has been added to avoid making these checks for the Desktop.

2. There were situations where Objects that were not one of the standard WPS 
Classes could have some of the instance information Restored incorrectly by 
the Portable Restore. Additional checks have been added to fix the problem.

3. The Portable Restore could get a SYS3171 error Restoring Objects for the 
Devcons Class, which is derived from WPShadow. This has been fixed.

4. The Unlock of the Objects that was causing a problem in previous versions 
has been moved to after all of the Object Instance information has been 
collected. This will avoid the SYS3175 in SOM.DLL that was caused by the WPS 
pointer to the Object becoming invalid.

5. In a number of Network situations, Network Drives, Directories and Files 
were treated as Access Denied by the Repair routines. This was especially 
true if the system was not currently logged onto the Network. This presented 
a problem because there was no option in the Repair Options Dialog that 
allows the user to bypass these entries. In order to address this problem, 
the Access Denied entries will not be included with the Not Ready entries. 
This will allow the bypassing of these entries by using the Ignore Not Ready 
entry in the Repair Options Dialog.

6. There were additional situations where the lock count for an Object count 
get reduced to zero before MultiMaint was finished with it or MultiMaint 
would not return the lock count to the correct level causing an extremely 
slow Shutdown process. The entire area of controlling the lock count has been 
upgraded so that a very positive control is kept over the number of times an 
Object has been locked by MultiMaint and the cleanup code insures that 
exactly the appropriate number of locks are removed.

7. The ability to add a description to each of the Desktop, Supplemental or 
Portable Backup Generations has been added. There is a new option in the 
Default Dialogs that will activate this feature. If the feature is turned on 
then the user will be asked for a description at the end of each of the 
Backup executions. The description will be stored as the .COMMENTS Extended 
Attribute for the appropriate file. When any of the Restore operations is 
requested, the descriptions of the current generations will be selected and 
the user can then choose the generation they wish to restore. A new Submenu 
has also been added to the Desktop Menu that allows the user to display the 
descriptions for each set of Backup Files.

******************************* V3.2 *******************************

The items fixed in Version 3.2 are:

1. A new diagnostic ability has been added that can only be activated while 
the About Dialog is on the screen and then only with specific key 
combinations. The specific diagnostic condition will only be used to debug 
specific situations, so the key combinations will be given out at that time.

2. An additional capability has been added to the Desktop Restore function. 
Since it is possible that a user might have information in their current 
OS2*.INI files that they would like to preserve and transfer to the Restored 
OS2*.INI files, it is now possible to specify that the Desktop Restore CMD 
file make a Backup copy of these files before replacing them. If this option 
in the Desktop Defaults Dialog is activated, then the OS2*.INI files will be 
copied to OS2*.PRV files in the same subdirectory before the Restore is done.

3. In the WPS Object Settings Dialog, there were some menu entries that would 
not normally be selected but would cause the dialog to be dismissed if they 
were. In addition, this would set up a situation where a SYS3175 would occur 
if the WPS Settings were requested a second time without the application 
being restarted. Even if the application was restarted, the WPS Agent would 
not correctly initialize. All of these have now been fixed.

******************************* V3.2a *******************************

The items fixed in Version 3.2a are:

1. When the Descriptions for the various Generations of the various Backup 
Files were displayed, there was no identification as to which generation 
matched which Description. The display has been changed so that both the 
Generation Number and the Description will be shown.

2. One more situation was found where a valid printer could get deleted as 
uninstalled and the problem has been fixed.

3. There was a memory problem with the wpQueryIconData Method for OS/2 V2.1 
GA Version without the Service Pack that caused the shared memory to become 
corrupted. Code has been added to make sure that the wpQueryIconData method 
uses its own memory, thus avoiding the problem.

4. When selecting a new Portable Backup Save Directory, then name in the 
Select Path Dialog was incorrect. The correct name will not be displayed.

5. If the Option to make a Backup copy of the INI files during the Desktop 
Restore was activated, the SYSRESTR.CMD file would have an error in it 
because a label in the CMD file had the colon at the end rather than at the 
front. This has been fixed.

******************************* V3.2b *******************************

The items fixed in Version 3.2b are:

1. Some users were getting a SYS3175 in PMWIN.DLL when trying to add a 
description to the Portable Backup. The dialog to get the information from 
the user was being called from the wrong thread. The dialog will now always 
be called by the primary thread so this will no long happen.

2. The Repair File Handles code did not correct handle the ERROR_BAD_COMMAND 
return for the DosQueryPathInfo API and has been fixed.

3. When a user attempted to delete a Group, they were not asked for 
confirmation even if the Confirm Delete Option was checked. The code has been 
changed so the user will now be asked before the current Group is deleted.

4. If a Portable Backup was not successful for some reason, but the various 
Backup files were created for a Generation, it was possible to attempt to do 
a Portable Restore with the incomplete files. Additional code has been added 
so that, effective with Backups made with the version and beyond, a special 
entry is placed in the Portable *.WPS file that indicates that en error was 
encountered. When a Portable Restore is started, a check is made for this 
information and the Restore will not continue if it is found.

5. If the default Description was added to one of the Backup files, an extra 
CR was appended to the file. The code has been changed so that this will no 
longer occur.

6. The code has been extensively modified so that it will run in Tools Mode. 
Tools mode allows the user to use the various functions directly be clicking 
on an Icon, rather than having to navigate the menus. Tools mode will not 
work with the Shareware version of the program, the application, including 
IniMaint must be registered before any of the Tools will operate.

7. The first version of the Install Program has been written and it will 
create and/or update the Tools Folder for any of the applications.

******************************* V3.3 *******************************

The items fixed in Version 3.3 are:

1. Some users reported that the Portable Backup was taking a very long time. 
It turned out that this was being caused by the wpLockObject WPS Method never 
returning on some OS/2 V2.1 systems. A method was found for accomplishing the 
same effect without using the wpLockObject Method.

2. The code that examined the PM_Abstract:Objects entry in the OS2.INI file 
looking for Printer information had a fixed offset built into the code that 
does not work for some situations. A set of general purpose routines to 
decode the Class Information have been developed and the Printer Repair 
routine will now use these subroutines.

3. The Install program would not change the size of the Listbox when the size 
of the Main Window was changed. This has been fixed.

4. The Install program would not find the MltMaint.EXE file because it was 
looking for MltMaint.EXE. The program will now look for the correct file.

5. The Install program was finished by adding code to actually unzip and/or 
copy the various files.

6. If any of the Tools that start with a Menu were selected and the user 
clicked anywhere on the screen other than the Tools Menu, the Menu would 
disappear, but the Tool would not end. Additional code has been added to check 
for this situation and insure that the Tool ends correctly.

7. If the Help Tool was selected and the Help could not get created, the 
Help Error messagebox would be displayed, but the Tool would not terminate. 
Additional code has been added to handle this situation.

8. When running one of the Tools, it was possible that the Initial Dialog 
would appear, depending on the user's settings. If this happened, the Tool 
would not terminate until the OK button was clicked in the Dialog. Since the 
Initial Dialog does not apply in Tools situations, the code has been changed 
so that it will never appear when a Tool is run.

9. If the Directory to be used for any of the Backups did not exist, the user 
was not informed properly. The message the user would see is that the Backup 
CMD file could not be opened. Additional code has been added so that the user 
will be informed that the Directory does not exist and will be asked if they 
would like to create the Directory.

******************************* V3.3a *******************************

The items fixed in Version 3.3a are:

1. V3.3 of IniMaint and SysMaint required the AccssWPS.DLL file because some 
new subroutines were placed in the incorrect file. The subroutines were moved 
to another source file and the AccssWPS.DLL file is no longer required.

2. Users who have replaced the CMD.EXE file with another command processor 
that has a different name could not do some of the Desktop Backup and 
Restore Functions because the name CMD.EXE was hardcoded into the 
application. This has been changed so that the CONFIG.SYS file will get 
searched for the correct name and that name will be used for all of the 
functions.

3. The various Message Boxes were not moveable because a parameter was left 
off of the API call. This has been fixed so that all Message Boxes can now be 
moved by the user.

******************************* V3.3b *******************************

The items fixed in Version 3.3b are:

1. The error recording in a couple of MultiMaint situations was improved.

2. The code that searches for the OS/2 Command Processor will use the COMSPEC 
Environment Variable rather than searching the CONFIG.SYS file.

3. An additional Option has been added to the Options dialog that will force 
the various Desktop Backup and Restore routines to use the value that is in 
the COMSPEC Environment Variable for the OS/2 Command Processor. If this 
Option is left in the default condition, which is Off, the routines will 
first search for CMD.EXE. If CMD.EXE is found, it will be used. If CMD.EXE is 
not found, then the COMSPEC entry will be used, no matter what the setting of 
this Option.

4. The Install Program Message Box would exceed the size of a VGA screen, so 
it has been changed to a Dialog with a Listbox.

5. All of the Tools now have an Object ID and the Install program will not 
completely remake the individual tools each time Setup is run. If a Tool 
already exists, it will be left alone or updated based on a new Checkbox in 
the Install Defaults Dialog.

6. Three new Tools will now be created. The new Tools will display the 
Descriptions of the various types of Backups: Desktop, Supplemental and 
Portable.

7. The default value for the DOS_AUTOEXEC setting for DOS programs would 
always default to C:\AUTOEXEC.BAT, even if drive C was not the boot drive. 
The code has been changed to change the drive letter to the correct boot 
drive, rather than just use drive C.

8. The Default for the DOS KBD_CTRL_BYPASS should be NONE, not CTRL_ESC and 
it has been changed.

9. In order to allow more room to display the Objects to be Restored in the 
Portable Restore Dialog a menu has been added to the Dialog in place of the 
various options that were displayed at the top of the dialog. This has 
allowed the window that holds the Objects to be expanded to nearly the size 
of the dialog window.

10. Zipstream Compressed Drives were not recognized correctly because 
Zipstream did not support DosOpen on the drive level. The code has been 
changed to use DosQueryFSAttach to look for drive types and to bypass the 
DosOpen when a valid HD drive type is found.

11. The PM_Workplace:PalettePos entry for the Warp Launch Pad was stored in a 
different manner than all other Objects store this information. This caused 
the Repair Code to treat the Launch Pad as an Invalid Object. The code has 
been changed so it will not handle data stored in both the old and the new 
format.

12. The Main Menu Bar was getting crowded, so it has been reorganized by 
taking the Options, Groups and Size items and putting them into a new 
Miscellaneous Menu. The Desktop Menu was also too long, so a new Menu, WPS, 
has been added and the MultiMaint stuff has been moved from the Desktop Menu 
to the WPS Menu. The sequence of the Menu items on the Desktop and WPS Menus 
has also been modified to make it easier to use.

13. A new item has been added to the WPS menu that will list all of the 
Registered WPS Classes and this item has also been added to the Tools Folder. 
This menu item will display all of the Registered WPS Classes and has the 
capability to Deregister any of the Classes.

14. If certain kinds of Objects that were derived from WPTransient existed 
on the Desktop when a Portable Backup was attempted a Logic Error 1709 would 
result because these Objects did not support some of the Data Collection 
Methods. Additional code has been added to handle these Objects by simply 
bypassing them as soon as sufficient information is collected to verify that 
they are derived from WPTransient.

15. Virtual drives defined as part of the Toronto Virtual File System had the 
same problem as the Zipstream Drives, so a check for these drives was added 
in the same place.

16. The Icons for the Tools Folder were updated to be more meaningful. 
Although it is hard to always convey the purpose of a Tool with an Icon, an 
effort was made to make them as meaningful as possible.

17. The Install program would not accept a lower case letter as the drive 
letter. The problem has been fixed.

******************************* V3.3c *******************************

The items fixed in Version 3.3c are:

1. Up to now it has only been possible to Drag file to any of the 
applications if the application was not running. If this was done, then the 
app: IniMaint, SysMaint or MultiMaint, would start with that file. Additional 
code has been added so that you can now drag a file to any of the 
applications while they are running and they will make the dragged file the 
current file.

2. The Install program would erase the unneeded files even if nothing was 
done during the Install. An additional check has been added so that the files 
will never be erased unless there has been a successful run of the Install 
thread.

3. An additional item has been added to the Install Instructions that 
discusses which of the applications the user needs to install or setup.

4. The Install program assumed the OS/2 Command Processor would be CMD.EXE, 
but this is not the case in situations where users are running an alternative 
Command Processor. Additional code has been added to use the file specified 
in the COMSPEC entry in the Environment as the Command Processor.

5. If a new version was installed over a previous version and the new install 
was an upgraded Application, MultiMaint over IniMaint, for example, the old 
EXE file was not erased and it was possible for the old EXE file to be 
specified as the EXE file in all of the Tools. Additional code has been added 
to erase any old copies before the new one is copied over so that this 
problem will not occur.

6. A fully user configurable Toolbar has been added.

7. Install did not have a provision for copying the Help file to a directory 
other than the install directory. An addition item has been added to the 
defaults Dialog so that a different install directory can be specified.

8. The drive for the DLL Directory in the Install was always drive C:, even 
though a different drive was used to boot. Additional code has been added to 
change this drive to the boot drive.

9. The Install program did not exclude Install.EXE when unzipping the files. 
This could cause the unzip to terminate without doing everything. The unzip 
has been changed so that it will never include the Install.EXE as one of the 
files to be unzipped.

10. If the user leaves the unzip checkbox checked while doing an Install and 
the files to be unzipped are INIDOC and INIEXE or MLTDOC and MLTEXE, the user 
will be asked to confirm that they want the unzip done. The reason for this 
is that the user had to unzip the XXXEXE.ZIP file in order to get the Install 
program, so it is very likely that the unzip is not needed.

11. When the Install program finished the Install or Setup, the user was not 
clearly informed as to whether the Install was successful or not and was not 
told what to do next. The code has been changed so that the user will now get 
a Message Box informing them if the Install was successful and telling them 
what to do next in either case.

12. The Install program will now check to see if there is a Safe Version of 
the appropriate Application in the directory where the Application was 
installed and, if it is there, it will create a Safe Tool in the Tools 
Folder.

13. The selection of Test for Non Write INI Files would always terminate the 
application after it was used. This was caused by the fact that the Tools 
Termination Flag was set even if the current execution was not a Tools 
execution. An additional check has been added so that the Tools Termination 
Flag will only be set when the execution is a Tools one.

14. The IniMaint Repair would not Repair File Handles on Network Drives if 
the return from the Query Path API was Invalid Password. This error has been 
added to the set of errors that will cause a Drive, Directory or File to not 
be accessible, therefore, it will not longer abend the Repair.

15. It was possible for the Desktop Backup to not work when run from the 
Tools Icon if the Desktop Backup Descriptions were not turned on. This was 
caused by the fact that the parent process would terminate before the child 
process was finished and the termination of the parent process would cause 
the child process to be terminated by OS/2.

******************************* V3.3d *******************************

The items fixed in Version 3.3d are:

1. There were still some situations where Install would have a problem 
creating Objects, so this part of the code was further modified to make it 
more robust.

2. When a Toolbar Icon was dragged over one of the data windows, OS/2 would 
get locked. The problem was caused by the normal Drag and Drop code not 
handling this condition correctly and has been fixed.

3. If an error occurred during a Drag and Drop operation, the Dump Dialog 
would correctly report the error, however, the application would not 
terminate, even if the Cancel option was selected. This was caused by the 
unique way that the return must be handled for Drag and Drop. Additional code 
has been added to insure that the application will terminate under these 
conditions.

4. If an attempt was made to make a Desktop Backup and a previous Backup was 
terminated early for some reason, it was possible that there would be some 
temporary files left from the unsuccessful Backup attempt. It was possible  
for these files to cause a problem with a subsequent Desktop Backup, so 
additional code has been added to the Desktop Backup CMD File to insure that 
the files are erased before the Desktop Backup is started.

5. There were situations where the user would be asked if they wanted to 
Repair a Network Drive entry even though they are being ignored or just 
Reported. This occurred in situations where the drive was in the form 
\\DRIVENAME and was caused by the fact that one place in the code was not 
recognizing this as a drive level entry. The code in this one area has been 
updated so this it will recognize this type of drive entry and the user will 
no longer be asked about this item.

6. If Help was requested for either of the Delete User CMD File entries in 
the Desktop Defaults Dialog, the general Help for the Dialog was displayed 
and there was no discussion of what these two entries did and why they were 
required for the User CMD Files and not the others. Help for these two 
entries has now been added.

7. There was no Help for the Always use COMSPEC Checkbox in the Options 
Dialog. The Help has not been written.

8. The Toolbar Help has been added with the Version.

9. The Move Icon on the Toolbar actually invoked the Compare Function. This 
has been fixed so that Move will work correctly.

10. I an attempt was made to do a Desktop Backup and there was no SET PATH 
entry in the CONFIG.SYS file, the routine that builds the Backup CMD File 
would get an error and the Backup would terminate. Additional code has been 
added to handle this problem and the Backup will still work as long as the 
appropriate EXE files can be found.

11. There were a number of references in the Help to the MLE, which is the 
window that contains the Key Value Information. There was no explanation of 
what an MLE was and this would be confusing to a user who is not familiar 
with this term. All references to the MLE have been changed to Key Value 
Window, so that all users will understand what is being referenced.

12. The Help File description of the Key Value Window did not say anything 
about the format of the information in the Window nor did it mention that a 
Key Value can be modified directly be overtyping the information in this 
Window. This information has now been added to the Help File.

13. The ShiftRun program was mentioned in a number of places in the Help, but 
the explanation was only available in a single location. The explanation was 
also a very brief one. ShiftRun has now been added to IniCopy and IniClean as 
separate programs and a separate and more detailed explanation has been 
included.

14. Changing the Classes to be Included and Excluded in the WPS Settings 
Dialog was difficult if the user wanted to Include or Exclude more than one. 
The reason was that the Exclude and Include was done via a menu and only one 
could be done at a time. The Exclude, Include and Reset Exclude/Include for 
the Settings Dialog has been changed to use a Dialog with a Listbox making it 
much easier to visualize what is Included and Excluded and making it easy to 
Exclude, Include or Reset multiple entries at one time.

******************************* V3.3e *******************************

The items fixed in Version 3.3e are:

1. When reloading the Portable Restore Window after switching between the INI 
File entries and the WPS Objects, the name of the Objects being loaded were 
not displayed. The display code has now been moved so the names will be 
displayed in both situations.

2. A new item has been added to the Portable Restore Menu, View. This item 
allows the user to switch the view of the WPS Objects in the window between 
the Text and Tree Views.

3. In many cases the time it takes to display the names of the Objects that 
are being worked on takes as much time and the actual work being done on the 
Objects. For those users who want speed in place of the names, there is a new 
Option in the Portable Defaults Dialog that allows for the displays to be 
turned off.

4. The code to add the Autoexec files for the various DOS Objects did not 
work because a pointer was set incorrectly. This has now been fixed and these 
files will be correctly added  to the list of Supplemental Backup Files.

5. If an Object had the Icon information embedded somewhere in the Object, 
thus not requiring an .ICON EA or an entry in the OS2.INI file, when the 
Object was Restored, the .ICON EA or the OS2.INI File Icon entry was created 
anyway. This made the size of the EAs and the OS2.INI File larger than they 
needed to be. Code has been added to identify this condition for all Objects 
and the Icon data will not be set for these Objects as long as it is what 
would already have been set.

6. The cleanup of things that might have been left over from previous uses of 
the AccssWPS Object has been made less sensitive to error and the collection 
of error information has been improved.

7. The Portable Backup will now add the Desktop Directory, System Color, and 
other System Value information to the Logging File if Logging is requested.

8. In order to enhance problem determination, the ability to interrupt a 
Portable Backup, create a Dump and then either end the Backup or Continue has 
been added.

9. The Portable Restore would not work correctly if the name of the Desktop 
was other than Desktop. Additional code has been added to fix the problem.

10. If an error was encountered during a Detail Save or Restore operation, 
the name of the Object that created the error was not saved for the Dump, so 
code has been added to save this information.

11. Some new type of Objects are attempting to save zero length Data Items 
and this was causing the Portable Backup to terminate. The Portable Backup 
will now note the fact that the length of the item is zero and simply ignore 
the piece of information.

******************************* V3.3f *******************************

The items fixed in Version 3.3f are:

1. The Repair code did not correctly handle a ERROR_NETWORK_ACCESS_DENIED 
from the DosQueryPath API. A check for this error return has been added to 
the code.

2. The message recording routine would record an excessive number of message 
from the UCMENUS Toolbar so some additional filters were added.

3. The ability to place the WPS Agent code into Diagnostic Mode was added to 
the MultiMaint Diagnostic Code routines.

4. The Help would not work in any Dialog that was created as a result of 
selecting a Toolbar Icon. The problem was a timing one and was solved by 
changing a WinSendMsg API to WinPostMsg.

5. Tools have been added to the main program, the Toolbar and the Install 
program to support all of the new functions.

6. A new Tool has been added to the Tools Folder and Toolbar that will allow 
for the Selection of the Supplemental Backup Files.

7. The WPS Settings Dialog for the WPS Styles had some entries where the 
defaults would be set backwards if more than one Object was being done. This 
has been fixed.

8. If Descriptions were not enabled for the Supplemental Backup, it could not 
be run from the Tools Folder because the main thread did not wait for the 
Backup to complete before terminating and automatically terminating the child 
thread. The main thread will now wait for the child thread to terminate 
whenever the Supplemental Backup is done from the Tools Folder.

9. The Install program would not install from the root directory on any 
drive, including the A:\ directory. The problem was an incorrect check in the 
Install routine that looks for valid directories and has been fixed.

10. The appropriate items on the Toolbar that should get disabled when using 
the Safe version of any of the Applications were not disabled because the 
routine that handles this process was not being called after the Toolbar was 
loaded. The call to the set menu routine has now been added to the code that 
creates the Toolbar.

******************************* V3.3g *******************************

The items fixed in Version 3.3g are:

1. The signature on the *.WPS File created during the Portable Backup 
prevented the file from being used as a normal INI file because it was 
identified as an EA File. The code has been changed so that the signature 
will now be correct.

2. There was a condition where a problem gathering information for a Palette 
could terminate the Portable Restore, which has been fixed.

3. There were situations where the Dump information would not be collected 
correctly during an execution that was initialed from an Object in the Tools 
Folder. The code has been changed to correctly collect the information.

4. It was possible, but very unlikely, that the Portable Backup would report 
an incorrect error code. The code has been changed so that the very first 
error will get reported, no matter what occurs after the first error.

5. The AccessWPS Diagnostic Reporting has been improved to add the contents 
of the passed structure to the diagnostic information each time a message is 
posted to the WPS Agent Object and when the processing of the message is 
completed.

6. There were a number of dialogs that did not process the DID_CANCEL 
WM_COMMAND Message because there was no CANCEL Button available. However, 
hitting the ESC Key while the Dialog has the focus causes the same effect and 
will eventually result in the Dialog window being destroyed. This caused 
serious problems in a number of places, so all of the Dialog routines that 
did not process the DID_CANCEL Message will now process the message and 
correctly do all of the appropriate termination functions.

7. There were situations where the code would report that the Desktop could 
not be found. This would occur in certain situations when the ESC key had 
been hit because the ESC Key Flag was not reset at the appropriate points. 
Additional code has been added to reset this flag in all situations where it 
needs to be initialized.

8. If the code to terminate the WPS Agent Object was called and the WPS 
Object had not been initialized, then a SYS3175 would occur in the 
AccssWPS.DLL file because a pointer had not been initialized. The WPS Agent 
termination code has been modified to always check for the validity of the 
various pointers before using them.

******************************* V3.3h *******************************

The items fixed in Version 3.3h are:

1. If a memory error occurred while trying to write to one of the files 
during a Portable Backup and WPS  Logging was not turned on, a Logic Error 
624 would occur because an attempt was made to write to a NULL File Pointer. 
An additional check has been added so that this will no longer happen.

2. There were situations where certain kinds of errors during the 
initialization of the WPS Agent Object would cause the generic Logic Error 
Code of 1 to be reported back to the user. This was caused by incomplete 
checking and processing of the error code in one of the routines and has been 
fixed.

3. The Repair Code has had a large number of problems because of unexpected 
returns from either the DosOpen or DosQueryPath API's. When an unexpected 
return was encountered, the Repair would terminate. Since all of the 
unexpected situations were simply ones that should be handled as unknown 
errors, the code has been changed to specifically identify situations where a 
drive could not be opened and when the query path failed and these have been 
added to the entries that will get ignored if the Ignore Unknown Default is 
set.

4. If an attempt was made to Restore a single Object into a Folder which did 
not exist, then a SYS3175 error would occur in SOM.DLL because an attempt was 
made to locate the Folder without verifying that the Object actually existed 
and the WPS Method being used could not handle this condition. The WPS 
Methods used for this have been changed so that a missing Object will be 
handled correctly.

5. A new Option has been added to the WPS Defaults, the maximum number of 
writes that can be done before the Portable Backup *.WPS File is closed and 
reopened. This was necessary to get around a problem in Warp that gets a 
Memory Allocation Error when a large number of entries are added to an INI 
file in a short period of time.

6. If a Portable Desktop Backup was made using one file system, such as a FAT 
volume,  and then the same Desktop was Restored using a different file 
system, such as HPFS, there were problems with finding Folders because the 
Real Names of the Folders would be different under different file systems. 
This has been fixed by getting the current Real Name of any File Object as 
soon as it is Restored and using the Restored Real Name as the location for 
Objects which are Restored to the Folder.

******************************* V3.3i *******************************

The items fixed in Version 3.3i are:

1. The Select Lower Levels in the WPS Dialog did not work under Warp because 
the keystrokes were not being passed from the internal Container to the 
Dialog Window. The Container has been subclassed so that this function will 
now work.

2. The code that generated the temporary filenames could check a different 
filename than the one actually generated because of how the Path Information 
was set up. The routine has been changed so that the same Path Information 
will be used for both the check and the actual filename.

3. The Tree View in the Portable Restore did not work because of the sequence 
of Applications in the WPS file could get changed around. A sort has been 
added so that the display will always be correct.

4. When asking for the WPS Diagnostic files, the first file will be used as 
the model for the second file so that it will be easy to select similar 
files.

5. There was a limit on the number of times the Portable Backup would attempt 
to close and open the WPS file in order to get past the INI File Write 
problem and the limit has been removed.

6. The code to open and close the *.WPS File during the Portable Backup would 
not work after the first time because the handle of the WPS File was not 
updated correctly after the first open and close sequence.

7. It was possible to have an empty entry in an Object Setup string and this 
would make the Setup string invalid. An additional check has been added so 
that this will no longer happen.

8. When there was a problem Restoring an Object, it was very possible that a 
SYS3175 would occur in SOM.DLL under Warp because the Object Pointer passed 
to the routine that Queried the WPS error was NULL. Under 2.11 this would 
cause a zero error return, but under Warp it is causing a SYS3175.

9. Even though it does not seem absolutely necessary, the code has been 
changed to always place the Object ID at the end of the Object Setup string.

10. The Portable Backup and Restore did not handle the Detail Data under Warp 
because the mechanism used to collect and restore this data no longer worked. 
The mechanism has been changed so that the collection will be done under all 
versions of OS/2.

******************************* V3.3j *******************************

The items fixed in Version 3.3j are:

1. In order to improve the quality the Portable Restore, especially when 
Folders are arranged a little differently on the Target Desktop, the ObjectID 
will be used to locate the Folder than contains an Object whenever it is 
available.

2. When doing the Portable Restore, the Icons would not always be placed in 
the original position because the routine that looked for the Icon Position 
information was using the incorrect filename, which could have been modified, 
this has now been fixed and the Icon Position routine will now use the 
correct name.

3. When doing the Portable Restore Object derived from WPTransient would be 
bypassed. However, they were not bypassed during the Portable Backup. Code 
has been added so that Objects derived from WPTransient will never be 
processed.

4. A new option has been added to the WPS Defaults, Portable Backup Update. 
When this option is checked and a Portable Backup is made, the most current      
generation, if it exists, is updated rather than a new generation started. 
This option is primarily designed to handle the condition where an error is 
encountered writing to the PORTBK01.WPS File during a Portable Backup. By 
turning on Update, it is possible to effectively pick up the Backup where it 
left off and only add the new information to the PORTBK01.WPS file.

5. There was still an error that could cause a SYS3175 in SOM.DLL when an 
attempt was made to do a Portable Restore to a Folder that did not exist on 
the Desktop. The method used to find the Folder would get the error in 
SOM.DLL when the Folder did not exist. The methods used to find the Folder 
have been changed to a set of methods that will simply report that the Folder 
cannot be found, so the Object cannot be Restored.

6. If an error was encountered updating certain INI File entries during the 
INI File Repair, the dump information was not sufficient to pin down the 
error. The diagnostic information provided by the routines has been improved 
to make problem determination easier.

7. When an attempt to Register a WPS Class during the Portable Restore 
failed, the user was not informed of the failure, therefore, the user would 
not know why the Objects of that Class were not Restored. Code has been added 
to popup a Message Box when a Class Registration Fails so that the user will 
know what is going on with the Object of this Class.

******************************* V3.3k *******************************

The items fixed in Version 3.3k are:

1. The Display Selected Objects was added.

2. The Uninstall functions were added.

3. The routines that handle the updating of the various control variables did 
not report sufficient diagnostic information when there was an error so 
additional code has been added.

4. An option has been added to the Desktop Defaults that will cause the 
Desktop Backup to run without the various OS/2 Windows being visible on the 
Desktop.

5. When the Option was set to automatically do the Supplemental Backup and 
Restore when the normal Desktop Backup and Restore were done and the Option 
was set to rebuild the Backup and Restore CMD files when a Backup is done. 
The Desktop Backup and Restore CMD files were rebuilt, but the Supplemental 
ones were not rebuilt if they already existed. The code has been changed so 
that this condition will cause both the Desktop and Supplemental CMD file to 
always be rebuilt.

6. The Select Lower Level did not work in the WPS Settings Window under Warp 
because the appropriate message was not sent to the Dialog Frame. Additional 
code has been added to make sure that this is now done correctly.

******************************* V3.3l *******************************

The items fixed in Version 3.3l are:

1. When the Uninstall was started, many users got an immediate SYS3175 
because a test was made using a NULL pointer. This has been fixed.

2. The Help Menu still used IniMaint when referring to the About Box. This 
has been changed to UniMaint.

3. When the Uninstall was started, the WPS Logging file would not get opened 
even if WPS Logging was turned on, so the WPS Logging would not occur. 
Additional code has been added so that the WPS and Uninstall Logging will 
both be done if both are turned on.

******************************* V3.3m *******************************

The items fixed in Version 3.3m are:

1. An option was added to the Default Dialog in the Install program to allow 
the user to specify that EPM.EXE be used in place of E.EXE for that Tools 
that involve displaying a text file.

2. The default reply for all of the Message Boxes was always the first 
button, even when this was not really the most logical choice. All of the 
Message Boxes have been examined and the appropriate button is now the 
default.

3. If there were blank lines in the CONFIG.SYS file, these lines were placed 
in the Uninstall Dialog that handles the updating of the CONFIG.SYS file. 
However, they should have been bypassed, since they are really the same as a 
REMark line. Code has been added to insure that the blank lines are ignored.

4. There was a typo in the install program and the Uninstall Tool would not 
work. This has been fixed.

5. The Uninstall did not allow the user to delete a Subdirectory of the 
Directory Structure that contained the EXE file to be Uninstalled. Only the 
top level Directory could be deleted. The code has now been made more 
flexible so that the user can start the Directory Deletion at any level.

6. When Uninstalling an Application, if the user did not choose to delete a 
Directory, there was no capability to delete only some of the files in the 
current Directory. Additional code has been added so that a user who selects 
to not delete a Directory will be given the chance to specify additional 
files in the Directory that contains the file to be Uninstalled.

7. When Copying or Moving Applications or Keys from one INI File to another 
any Application or Key Name that ended with a '\' would cause the IniCopy 
program to terminate with a Logic Error 16. This was caused by the fact that 
the '\' character followed immediately by a '"' character was treated as a 
special condition. The problem has been fixed by checking for the trailing 
'\' character and adding a second one, if it is found.

8. When Uninstalling a WPS Object and the EXE name was a default value, such 
as *, a SYS3175 would occur in the Uninstall. Code has been added to look for 
this condition and handle it correctly.

9. The Select Lower Levels Option in the Portable Restore Defaults did not 
work correctly because an index was off by one.

10. There were a number of places where a SYS3175 could result when the Write 
or Print button was chosen in a Dialog because an index was incorrect and 
there was not sufficient checking for invalid returns when getting records 
from the Container. Additional code has been added to make sure that all of 
the appropriate checks are made each time a record is extracted from a 
Container, even in situations where a error is theoretically impossible.

11. The titles of some of the Objects and the Tools Folder itself have been 
changed in order to make them easier to understand.

12. The Uninstall routine that deletes any Template Objects for Classes that 
are about to be Deregistered did not report which Class it was having a 
problem with if there was an error. The code has been changed so that this 
diagnostic information will now be reported.

13. If it was not possible to get a WPS Pointer to a Template Object for a 
Class that was going to be Deregistered, a Logic Error 1924 would result. 
Since there are a number of valid ways this can happen and the error simply 
means that the Handle in the OS2.INI file is not valid, the code has been 
changed to simply ignore this situation and move on to the next OS2.INI file 
entry.

14. Code has been added that will attempt to find files that are related to 
the EXE file that is being Uninstalled via a number of different mechanisms. 
When these files are found and they appear in any of the File Deletion 
Windows, they will be automatically selected, thus making it easy to delete 
them. If any files are automatically selected, at least one of them will be 
visible in the Delete File Window and the user will be presented with a 
Message Box telling them that this has occurred so they will be alerted to 
look for the files to verify that they should actually be deleted.

******************************* V3.3n *******************************

The items fixed in Version 3.3n are:

1. The check for related files would not be done in certain circumstances 
where the starting point for the Uninstall was a WPS Object, so the code has 
been changed to fix this.

2. If an error was encountered starting the WPS Agent Object the error was 
not reported correctly because the Agent Object Error code was not placed in 
the correct place. This has been fixed.

3. When the WPS Agent Object was started, it was actually started twice. This 
caused a significant delay and some other problems as well. One of the lines 
that start the WPS Agent Object has been removed.

4. The code to insure that the WPS logging was turned on whenever the 
Uninstall Logging was turned on was in the wrong place and has been moved.

5. It is often the case when Uninstalling all of the Objects in a Folder that 
one or more of the Objects will execute a standard program like e.exe or 
cmd.exe. Code had been added to attempt to bypass all of these files, but it 
became clear that this file is really a dynamic one. Therefore, a new item 
has been added to the Uninstall menu that will allow the user to specify the 
list of files that should never be deleted.

6. In order that the user is aware that they must review the list of files 
that cannot be deleted, code has been added to remind the user of this when 
they do the Uninstall for the first time and anytime that they have not done 
an Uninstall for 30 days.

7. There is a possibility that the Uninstall routines will attempt to delete 
a file for the second time and the routine that does the file deletion did 
not check to see if the file being deleted actually existed. The routine has 
been changed so that it will not try to delete a file unless the file exists.

8. If an attempt was made to Uninstall a Folder that had more than one WPS 
Program Object in it, it was possible to get a number of different and very 
bad conditions. In some cases, a SYS3175 would result and in other cases, it 
was possible for a number of files in an unexpected directory to get deleted.

9. The Uninstall code to display the additional files in the default 
directory that the user might want to display would not handle files on a LAN 
Drive. The code has been fixed so that both kinds of drives will be handled.

10. The Uninstall Additional Files code would get a Logic Error 1901 if the 
filename that was passed did not include a drive or directory. The code 
should have simply exited the dialog and has been modified to do just that.

******************************* V3.3o *******************************

The items fixed in Version 3.3o are:

1. The Uninstall procedure has been changed so that the initial pass through 
all of the functions will simply identify the steps needed to uninstall a 
particular Application, but nothing is actually done. Once everything is 
identified, then the user is presented with a list of things that will be 
done and has the option of changing the list in a couple of ways. Only after 
the user has reviewed the list are the actual changes made.

2. The logging of the events that occur during the Uninstall has been greatly 
improved. The Uninstall Window will now contain an entry for each action that 
the Uninstall code takes.

3. It is not clear exactly what to do once the Uninstall Window is on the 
Desktop. Therefore, the user will now see an initial Message Box telling them 
how to get the Uninstall Started for a particular item.

4. Even though the logging has been improved, it only adds the information to 
the Uninstall Window, but does not make a permanent record. It is possible to 
make a permanent record using the Print or Write Buttons, but users might not 
be aware of this. Therefore, if the user has dropped any item on the 
Uninstall Window and has not used the Write or Print buttons to make a 
permanent record, they will be informed of this when they attempt to exit 
from the Uninstall and will be given a chance to make a record, if they wish 
to.

5. Since experienced users may not want the instructions in 3. above or need 
the reminder in 4. above, a new option has been added to the Uninstall 
Defaults Dialog that allows the user to turn off the Instructions.

6. Once the Uninstall is complete, the Uninstall Window Listbox will be 
scrolled so that the ending information is visible in the Window. This makes 
it easier to see how things ended and whether there was an error.

7. The is a check in the Uninstall that insures that the Uninstall routine 
would never attempt to Uninstall the Desktop. However, the compare for the 
Desktop could fail if the volume is an HPFS volume and part of the name is 
lower case. This has been fixed by changing the compare to one that is 
independent of case.

8. If the user somehow managed to Drop the Desktop on the Uninstall Window, 
and I am not sure it is even possible, there was not check made for this. The 
Uninstall code would simply try to Uninstall the entire Desktop and all 
Objects on the Desktop. An additional check has been added to will not allow 
the Desktop to be Uninstalled.

9. It was possible that the incorrect logging file would be used for logging 
the WPS and Uninstall information during an Uninstall because the correct 
name had not been retrieved from the INI File.

10. Some of the defaults for the Desktop and Portable Backup and Restore have 
been changed so that the default is a safer way to operate.

11. If an EXE File was Dropped on the Uninstall Window and the EXE File name 
ended in E, it was possible the code that determines whether the file is 
associated with a WPS Object would determine that it was associated with an 
Object whose EXE file was E.EXE. Additional checks have been added to make 
sure that the filenames will compare exactly.

12. The Uninstall routine that looked for directories to delete did not log 
sufficient information to be able to diagnose problems, so the logging in 
this routine has been greatly improved.

13. I was possible to get a SYS3175 if the Uninstall routine that searches 
for directories did not find any. An additional check has been added to 
verify that at least one directory was found before any deletions are 
attempted.

14. If the Uninstall routine that searches for directories got a not found 
while searching for the first directory in a chain, the entire structure was 
made null, even though the problem did not necessarily occur on the first 
directory. An additional check has been added to insure that the entire 
structure is made null only when the problem occurs on the root directory.

15. It was possible to get a SYS3175 in SOM.DLL after any WPS Objects were 
deleted during the Uninstall because the Objects were destroyed before the 
lockcount in the internal WPS table was set to zero. This caused the routine 
which frees the WPS memory to attempt to call WPS methods for Objects which 
no longer existed and this will cause the reported error.

16. When the Uninstall Deregistered a WPS Class and then needed to delete the 
Class DLL, it was necessary to Reset WPS in order for the DLL to not be in 
use. Since the WPS Agent Object cannot survive across a Reset of the WPS, the 
Agent Object had to be Destroyed and Recreated after WPS was restarted. The 
recreation of the WPS Agent Object would get a Logic Error of 10200 because 
of Class Deregistration and Reregistration Problems. Special code has been 
added for this sort of Restart situation so this error will not occur.

17. When the Uninstall code attempted to delete an EXE File, a check was 
first made to see if the File existed and no attempt is made to delete a file 
that cannot be found. However, no record of this is placed in the Uninstall 
Window, so the user was not aware of it. Code has been added to record this 
situation.

18. If the user selects to Uninstall an entire Folder, it can take a while to 
collect all of the necessary WPS information for the Folder and it's 
contents. It is not obvious to the user what is going on during this period, 
so an additional dialog has been added to tell the user what is going on.

******************************* V3.3p *******************************

The items fixed in Version 3.3p are:

1. The Uninstall Menu and Dialog items that referred to Non Delete Files has 
been changed to Never Delete Files in order to make it more clear.

2. The Title on the Never Delete Files Dialog was Supplemental Files because 
the Template for the Supplemental Files was used as a starting point. The 
title has been changed to Never Delete Files.

3. All references to IniMaint, SysMaint and MultiMaint have been converted to 
UniMaint, all of the Registration things have been removed from the Menus, 
the About Dialog has been converted from Carry Associates to SofTouch, and 
the On-line Help has been modified to conform to all of the above.

4. The customization information for UniMaint was stored in the INI files 
with an Application Name of INI File Maintenance. This will automatically be 
converted to Uni Maintenance the first time this version is used.

5. The SET INIMAINT= entry in the CONFIG.SYS file will still work, but the 
documentation has been modified to say SET UNIMAINT= and this will now work 
also.

6. When the Portable Restore was finished, some of the INI files did not get 
closed correctly and there were some calls to close the INI Files that used a 
NULLHANDLE and the INI File Pointer. This would cause problems with any 
subsequent attempt to do a Restore without a reboot. In addition, there is 
some suspicion that this same error could have caused the INI File write 
problem that was occurring during the Portable Backup. Both of the problems 
have been fixed.

7. When a WPS Application was Uninstalled and the Application had registered 
new WPS Classes. It was possible to get a SYS3175 after the Uninstall Window 
had been destroyed because an attempt was made to Free a Pointer allocated on 
the Shared Heap that was no longer valid because the WPS Agent Object was 
shutdown and restarted because of the WPS Reset that occurred after the WPS 
Classes were Deregistered. Code has been added to make sure that all 
appropriate Pointers are freed before any WPS Reset is done.

8. It was possible to get a Logic Error 1933 when doing an Uninstall if the 
CONFIG.SYS File did not have a SET PATH= statement in it. Additional code has 
been added to handle the appropriate return in the Uninstall and the other 
UniMaint functions.

9. During the Uninstall, if a user responded Yes to the question about 
deleting additional files in the same Directory and any of the Files were 
found to be Related Files, then the Related files were deleted immediately 
instead of being added to the list of files to delete at the end. The code 
had been changed to just add the files to the list of file to be deleted.

10. It was possible to get a SYS3175 error trying to process the Uninstall 
Never Delete Files or while loading the list of Never Delete Files for an 
Uninstall of an application. The problem was caused by using the wrong index 
in the routine that fills the Never Delete File structure and has been fixed.

11. When an EXE file was Dropped on the Uninstall Window and an Abstract 
Object entry was found for the File, it turns out that it is possible that 
the WPS will not return a valid WPS Object Pointer. This case resulted in a 
Logic Error 1924. Additional code has been added to handle this situation, 
even though I cannot see how it is happening.

12. All of the Help was completed for the Uninstall.

13. Options were added at various places during the Uninstall to allow the 
user to Cancel the entire process at almost anytime.

14. Exception Handler code has been added to handle Protection Violation's and 
conditions where the Stack runs out of space.  The Handler will inform the 
user than the Exception has occurred and will write the dump information to a 
dump file so that the diagnosis of the problem will be easier.

******************************* V4.0 *******************************

The items fixed in Version 4.0 are:

1. The Exception Handler for the Main Thread was not Unset before the 
application terminated. This was causing a SYS3171 error under versions of 
OS/2 prior to Warp.

2. Code was added to correctly Backup and Restore the LaunchPad.

3. The recording of errors during the Detail Save phase of the Portable 
Backup was improved.

4. The Keys to control Listboxes would not work in the Main Window because 
the Focus was always forced to the User Data Window. The code has been 
changed so that the Focus will be forced to whatever window had the last 
keyboard or mouse action so that things like Page-Up and Home will now work 
for the various windows.

5. There were some situations where duplicate Folders were created when the 
Portable Restore was done. The code depended on the Create Object API to fail 
in order to identify that the Object already existed. This procedure does not 
seem to work in some cases, so the code has been changed to use a more 
positive method to determine if the Objects exist.

6. There were a number of situations where Message Boxes in Dialogs were set 
up so that it was possible to bring the Dialog to the foreground and push the 
Message Box into the Background without ever responding to the Message Box. 
This should not be possible and the code has been changed so it can no longer 
occur.

7. Some improvements were made in the logging of messages during the WPS Save 
and Restore Process.

8. Since there are a number of different things a user can do that will cause 
a potential problem with their Desktop, code has been added to remember 
whether a Desktop or Portable Backup of the Desktop has been made and, if it 
has not, the user is asked if they want to make a Backup before they do any 
of the critical functions.

******************************* V4.00.1 *****************************

The items fixed in Version 4.00.1 are:

1. When running under OS/2 V2.11 the renaming of the WPS Agent DLL's did not 
work correctly. The ACSAGTWP.DLL was renamed to ACSAGENT.DLL, but the 
ACSAGTNO.DLL file is the one that should have been renamed. The code has been 
changed to fix this problem.

2. I was not possible to modify the Program Settings information for 
WPProgram Objects if they did not have an EXE Name specified because the test 
only looked for certain non default values. An additional check has been 
added so that all WPProgram Objects will be included, even if all of the 
Program related items are in their default condition.

3. If the WPS Settings Modify Dialog Checkbox to do the Remaining Objects was 
checked but one or more of the remaining Objects that qualified based on 
Class and Selection criteria did not already have one or more of the values 
that were being modified, then that WPS Setting would not get changed because 
the flag that causes the specific WPS Setting to be updated was not turned 
on. Additional code has been added to insure that the flag will not be set 
correctly.

******************************* V4.00.2 *****************************

The items fixed in Version 4.00.2 are:

1. It was possible to get s SYS3175 while attempting to Uninstall an 
Application if Extended Program was installed on the Desktop because of a 
problem where a pointer was not correctly updated while searching the 
WPAbstract Object information. The code has been updated so that the pointer 
will get correctly set under all conditions.

2. If the SET HELP= or SET BOOKSHELF= entries were not in the CONFIG.SYS 
file, the Uninstall would get a SYS3175 because the code did not check for a 
NULL pointer after looking for these entries in the CONFIG.SYS. Additional 
code has been added to check for this condition.

******************************* V4.00.3 *****************************

The items fixed in Version 4.00.3 are:

1. The ability to do several types of individual repairs from the Command 
Line, in addition to just starting the Repair Dialog, have been added.

2. There is an extremely unusual case where the Printer Repair code will 
remove a Printer that is actually installed on the Desktop and this has been 
fixed.

******************************* V4.00.4 *****************************

The items fixed in Version 4.00.4 are:

1. If the Repair Logging was turned on, the setting would be saved from one 
run of UniMaint to the next. The effect of this could be that the Repair 
Logging could be left on for a long time and generate a very large logging 
file. The code to save the logging status across runs has been removed.

2. The Repair Logging function would only Log those items that were added to 
the Repair Window, it would not Log the items that were actually Repaired. 
Additional code has been added so that the Repair Logging will now Log both 
sets of information.

3. The Help did not work in the Selected WPS Object Settings Dialog because 
the correct value was not passed to the Help Manager. The Help Manager table 
has been modified to fix this problem.

4. The Help did not work in the WPS Settings Dialogs that modified the 
various WPS Settings because the incorrect window was made the active Help 
window. The code has been modified so that the active Help window now agrees 
with the Help Table used by the Help Manager.

5. It was possible for the Printer Repair code to miss the fact that the 
IBMNULL printer was installed under certain unusual circumstances. The check 
for this Printer has been modified so that it will now work in all known 
situations.

******************************* V4.00.5 *****************************

The items fixed in Version 4.00.5 are:

1. With certain default settings, an attempt to do a Portable Restore for the 
Desktop itself resulted in a SYS3175 in SOM.DLL because the WPS Pointer to 
the parent Object was NULL. Additional code has been added to check for the 
NULL Parent Pointer and correctly Restore the Object.

******************************* V4.00.6 *****************************

The items fixed in Version 4.00.6 are:

1. Certain WPS Classes respond to the WPS _wpPopulate method by attempting to 
do certain functions that might not work at that time. This causes problems 
with all of the various UniMaint functions that deal with WPS Objects. 
Additional code has been added to insure that these special Classes are 
handled correctly.

******************************* V4.00.7 *****************************

The items fixed in Version 4.00.7 are:

1. The WPNetgrp Class was added to the other classes as ones that should not 
get populated.

2. The Warp FixPak 10 did not fix the problem of writing large INI files, so 
a third modification to the Portable Backup has been implemented to get past 
this problem. Specifically, an option has been added to tell the Portable 
Backup to write a series of temporary small INI files in place of the one 
large PORTBK01.WPS File and then combine the temporary files into the actual 
PortBK01.WPS file at the end of the Backup.

******************************* V4.00.8 *****************************

The items fixed in Version 4.00.8 are:

1. Users have suddenly found that a single drive letter is duplicated in the 
File Handle Structure in the OS2SYS.INI file. Additional code has been added 
to the File Handle Repair to identify, report and fix this problem.

******************************* V4.00.9 *****************************

The items fixed in Version 4.00.9 are:

1. The Display WPS Objects Dialog will get a SYS3175 error if one of the 
Object Type Filters is being used, The Display Filtered Objects only Option 
is turned on and the Display Lower Levels Checkbox in the Defaults Dialog is 
checked. The reason is that an attempt is made to select an item that is not 
even displayed in the window, therefore, does not have a valid container 
object pointer. An additional check has been added to make sure that only 
objects that are actually in the window are selected.

2. The names for the four Portable Backup Files have been changed so that the 
names will not result in duplicate *.!!! files in the same directory when an 
attempt is made to open all of the files for a particular backup.

3. When doing a Repair on a HD where some partitions have been deleted, it is 
possible to get a Logic Error 634 with a Dos Error of 15 and this terminates 
the Repair. Additional code has been added to handle the situation.

4. The code that is designed to bypass calling the WPS _wpPopulate Folder for 
certain WPS Classes was not working because the wrong pointer was incremented 
while making the test thus making all but the first test invalid. Code has 
been added so that a temporary pointer will be used rather than the base 
pointer.

5. The are some classes of WPS Objects, such as Wipeout, which do not give a 
good return when an attempt is made to remove any of the WPS Locks that were 
created as a result of WPS Methods such as _wpPopulate and others. This would 
cause a Logic Error 1709 because WPS would not report an error. The routine 
involved has been changed so that it will simply assume an Object is Unlocked 
if the Unlock Method gives an error return but WPS does not report an 
outstanding error.

******************************* V4.00.10 *****************************

The items fixed in Version 4.00.10 are:

1. This version includes V1.0m of the WPS Agent Object which includes 
improved code for the registering of the WPS Agent Object Class.

2. The Logging code has been modified so that all of the logs will start with 
a line that gives the version that created that log.

3. When restoring an Object and logging is turned on, the WPS Class for each 
Object Restored will be included in the logging file.

4. The Class List Dialog will now include the name of the DLL that implements 
the Class so that it is easier to determine which Class to Deregister in 
order to be able to get rid of a specific DLL.

5. It was possible to have a problem Restoring a Object if it was necessary 
to Register a new WPS Class and the DLL that implements the Class is not in a 
Directory that is in the LIBPATH on the Target Desktop. This was caused by 
the way that the Portable Restore did the WPS Class Registration. The code 
removed the Path information from the name of the DLL before attempting the 
Registration. The code has now been changed so that an attempt will be made 
to Register the WPS Class using the full Path and Filename and the stripped 
name will only be used if the original Registration fails.

6. There are situations where a WPS Object cannot be created, the PM Error 
Code indicates that the Object already exists, but an attempt to get the WPS 
Handle for the Object fails. Sometimes it is still possible to create the 
Object by changing one of the parameters used for the WinCreateObject API and 
code has been added to try it in this specific case.

7. When Uninstalling an Application with the Uninstall Ask Option turned off 
a terminal Logic Error would occur if a File could not be deleted. The code 
has been changed so that the Uninstall will continue with a message in the 
Uninstall Window that the Deletion of the specific file was not successful.

8. If a Directory was removed from a line in the CONFIG.SYS file, it was the 
last Directory on the line and there was no trailing semicolon, then the New 
Line character was also removed from the line causing the following line to 
be added to this line. The CONFIG.SYS would still be processed correctly, but 
the appearance was certainly incorrect. Additional code has been added to 
test for the New Line character and leave it in the file.

******************************* V4.00.11 *****************************

The items fixed in Version 4.00.11 are:

1. If a filename in the OS2SYS.INI File Handle Structure was longer than 
300 characters, then it would cause the Stack to become corrupted. Even 
though 300 characters is long enough to contain all legal filenames, it turns 
out that it is possible to get names that are longer. The code has been 
modified to handle very long filenames.

******************************* V4.00.12 *****************************

The items fixed in Version 4.00.12 are:

1. If an entry in the OS2SYS.INI File Handle Structure had an invalid Root 
Node entry, but there were no files in the structure for the Drive, the Root 
Node error would not be displayed in the Repair Window because the root 
information is not displayed until the first file is found. Additional code 
has been added to check for an invalid root node condition and add the 
information to the Repair Display as soon as it is found.

2. If the Title on a Printer Object was more than one line, it was possible 
that the UniMaint Printer Repair code would believe that the Printer was not 
Installed and remove the information from the OS2SYS.INI file. Additional 
code has been added to fix this problem.

3. A Find capability was added to the Repair Window so that it will be easier 
to Find specific entries when the list is very long.

******************************* V4.00.13 *****************************

The items fixed in Version 4.00.13 are:

1. The repair Window Find did not remove the emphasis from a previously found 
item when a new Find was done. code has been added to make sure this is now 
done.

2. When making a Portable Backup of the Desktop the LaunchPad code was set up 
to bypass any Objects where the original Object could not be found. However, 
if it was not possible to find the WPS Handle for one of the Shadows on the 
LaunchPad, then a logic error 1709 would result. The code has been changed so 
that this condition will cause the Object to be skipped and not cause a logic 
error.

******************************* V4.00.14 *****************************

The items fixed in Version 4.00.14 are:

1. When the Uninstall code had certain types of problems trying to analyze an 
EXE file to find the DLL's used by the EXE, the Uninstall would terminate 
rather than simply accepting that the format of the EXE was an unknown one. 
The code has been changed so that the Uninstall will no longer terminate in 
this situation.

2. There are some situations where it is not possible to do the normal File 
Handle Repair on systems that are connected to Networks because calling the 
API used to check for the type of Drive will hang OS/2. This makes it 
impossible to get rid of these Network Drives even though the user knows they 
are invalid. To solve this problem a new type of Repair has been added, 
Delete All File Handles for Drive, that will display the Drives on the system 
without validating whether they are valid or not and give the user the 
opportunity to remove one or more of the drives.

3. Code has been added to the File Handle Repair to identify and display any 
Drives in the File Handle Structure that do not have any Directories or Files 
as sub entries. Since there is no reason to have a Drive Entry if there are 
no Directories or Files, these Drive entries now will be flagged for Repair.

4. It was possible to incorrectly Destroy WPS Objects with the Repair Dialog 
if some other type of Repair was selected, then the Do Repair Button selected 
and then the Destroy Objects type of Repair is chosen from the Combo Box drop 
down list. In order to prevent this, additional checks have been added to for 
the Type of Repair to Report Only when this sequence of actions occurs.

5. If there is no CONFIG.SYS file on the boot drive, UniMaint will get a 
Logic Error 640 when it is started. The error occurs while the code is 
looking for the AcsAgent.DLL file. Additional code has been added to cause the 
code to simply look in the root directory if no CONFIG.SYS file can be found.

6. If a user took advantage of the Warp capability to have more than one 
CONFIG.SYS File and to choose among them at boot time, UniMaint would get a 
logic error at startup if it did not find a CONFIG.SYS file on the Boot 
Drive. Additional code has now been added to ask the user the name of the 
file that they are using in place of the CONFIG.SYS and this information, 
once it is provided, is stored in the INI files so that it does not need to 
be provided after the first time.

******************************* V4.00.15 *****************************

The items fixed in Version 4.00.15 are:

1. The Dump of some of the tables was limited to only 5,000 entries and there 
can often be more than that, so the max was increased to 50,000 entries.

2. Some minor improvements were made to the Dump of the Repair variables by 
moving some static variables from the dialog procedure and making them 
external to all of the routines in the module so that they could be included 
in the dump.

3. For the sake of convenience, an item was added to the Recover Menu that 
will bring up the Repair Options Dialog Box. Previously, the Options could 
only be opened after the Repair Dialog was opened or from the Repair Options 
Tool.

4. The Find would not work if one of the items in the Find Text was a period. 
This problem has been fixed.

5. If one of the Toolbar items was selected while a Toolbar Popup Menu was 
displayed and the selected item would also Popup a Menu, then UniMaint would 
be locked. Additional code has been added to identify this situation and 
simply beep when a new menu is requested while a Menu is already present.

6. If one of the Menu Items was selected in the Selected WPS Object Settings 
Dialog before the window was filled with any Objects, a Logic Error would 
occur. The code has been modified so this will not longer happen.

******************************* V4.00.16 *****************************

The items fixed in Version 4.00.16 are:

1. There was a minor problem in the routine that adjusted filenames that 
could have wasted resources for files that are on Network Drives and this has 
been fixed.

2. The WINOS2 Setting for AUDIO_ADAPTER_SHARING was treated as an Off/On type 
of setting rather than the correct None/Optional/Required type of setting. 
The code has been modified to handle this setting correctly.

3. A new Repair Type has been added, Repair Invalid Objects, that will find 
and delete Program Objects that have either an Executable or Startup 
Directory that cannot be found.

4. In conjunction with the above, some new items have been added to the 
Repair Options Dialog to control whether the Program Object Repair should be 
part of the WPS Repair, whether to ask before the Desktop is Reset and 
whether to include the WPS Objects in the normal WPS Display.

******************************* V4.00.17 *****************************

The items fixed in Version 4.00.17 are:

1. The Invalid Objects code would not handle situations where is was passed 
the name of an executable with trailing blanks. Code has been added to remove 
any trailing blanks.

2. The WPS Logging code did not log the name assigned to the various WPS 
Objects when the information was collected on them. Additional code has been 
added to record this information.

3. It was possible for one standard WPS Class to be in the Class table two 
times because of the way the Class Structure was initialized. This has been 
fixed and will no longer occur.

4. It was possible that the Portable Restore of the LaunchPad would fail 
because none of the Objects in one of the Drawers could be found on the new 
Desktop thus causing a problem with the numbering of the Drawers on the new 
LaunchPad. Code has been added to make the numbering of the Drawers on the 
old and new LaunchPads independent of each other so that this will no longer 
occur.

******************************* V4.00.18 *****************************

The items fixed in Version 4.00.18 are:

1. In a couple of places where DosFindFirst was used to look for only 
Directories, the MUST_HAVE_DIRECTORY bit was set but the FILE_DIRECTORY bit 
was not set. According to the documentation, this should result in nothing 
being returned. However, the API appeared to be working fine without the 
FILE_DIRECTORY bit being set. However, at least one report of a problem where 
nothing was returned has been reported, so the code was modified to set both 
bits when only Directories and Subdirectories are needed.

2. There were situation where Directories can have the System and/or Hidden 
Attribute turned on. Some of the places where DosFindFirst was used to find 
Directories, the Flags for these Attributes was not set when looking for 
Directories because the Attribute had never been tuned on in the past. All of 
the code has been modified so that all of the appropriate Flags will be 
turned on.

3. The error text information supplied when an INI File error occurs while 
trying to do a Portable Restore for an Object has been improved to give more 
detail as to which of the INI File API's failed.

4. Two of the API calls to see if an entry was in an INI file and, if it was 
there, how large it was used the Prf... API instead of the special Ini... 
API. Therefore, a FALSE return would occur when the item was not found in the 
INI file rather than the expected zero length. The code has been changed so 
that all of the calls will use the Ini... API's.

5. When the current file is an EA File, a new item has been added to the 
Popup Menus that will allow the user to delete the EAs for the currently 
selected File or Directory.

6. The Parent of the File Dialog for the EA Items was changed in order to 
fix, hopefully, a problem at least one user is having with this dialog.

******************************* V4.00.19 *****************************

The items fixed in Version 4.00.19 are:

1. The EA Logging file logged the EA Type in decimal format and it is more 
usable in hexadecimal format, so the code has been changed to report it in 
the more appropriate format.

2. Certain EAs with German characters in them were identified as invalid by 
the EA Text validation code. This code has been modified so that these EAs 
will now be treated as valid.

3. The Default Printer was not always correctly identified. The code to find 
the Default Printer has been updated to use the newer API's for OS/2 V2.1 and 
higher so that this problem should not occur for these versions.

4. The first of the Wizards, for the Repair Options, has been added.

******************************* V4.10 *****************************

The items fixed in Version 4.10 are:

1. There was a problem in the Handles Repair for very large numbers of 
Handles that would cause a SYS3175 while filling the Handles Table. The way 
the Handles Structure is allocate has been changed so that this will no 
longer happen.

2. The Unloading and Freeing function for the Repair can take a long time. 
Since this was done in the Main PM thread, it was holding up the PM 
processing of messages. These cleanup functions have now been moved to a 
secondary thread so that the PM thread will be fine.

3. The code to Repair Invalid Objects would sometimes not find an EXE File 
that did not have the path information in the WPS Settings because a variable 
was reused when it should not have been. The code has been modified so that 
the variable will be preserved and the error will no longer occur.

4. The same change as in 2. above was also done for the Portable Restore and 
WPS Object Settings Dialogs.

5. After doing the Repair, it was possible to get a SYS3175 in the code to 
save the Save INI or Write File names because they were using the new code 
that is common to both the repair and the Wizards. This has been fixed.

******************************* V4.10.1 *****************************

The items fixed in Version 4.10.1 are:

1. The Automatic Desktop Backup Function has been implemented. This includes 
the Dialog to set the Defaults, the Wizard for this function and a new 
program, UniWatch, which watches for changes in the Desktop and actually 
causes the Backup to occur based on user set thresholds.

2. There were some routines that did not free the memory when getting the 
Desktop directory. All of the routines will not free the memory they have 
allocated.

3. In a number of places where the Desktop was reset, the code did not wait 
for the Reset to complete before attempting to continue. In order to fix this 
a routine has been added that will do the Desktop Reset and wait for it to 
complete.

4. An option was added to the Options Dialog that will allow the user to 
specify that they want the system rebooted whenever a desktop reset is called 
for.

5. The code to build and display the EXE/DLL Cross Reference was added.

6. A new Repair was added that allows the user to delete Valid File Handle 
entries.

******************************* V4.10.2 *****************************

The items fixed in Version 4.10.2 are:

1. The Automatic Backup Days were not stored correctly in the INI File so 
they were not picked up correctly by the UniWatch Program.

2. The Automatic Backup Wizard would inform UniWatch when any of the 
Automatic Backup parameters changed, however, the Automatic Backup Defaults 
Dialog did not. The update code has now been added to the Automatic Backup 
Defaults Dialog.

3. After a Desktop Backup was made by UniWatch, then name of the IniCopy 
program in the control file was enclosed in quotes and this would cause a 
logic error the next time UniWatch did a check because a return of 123 would 
be received from an attempt to run IniCopy when it's name was enclosed in 
quotes. IniCopy has been changed to be sure that the module name recorded in 
the Control File does not have quotes around it.

******************************* V4.10.3 *****************************

The items fixed in Version 4.10.3 are:

1. There was a problem with the timing of the Desktop Reset code when it was 
instructed to wait for the Reset to complete. Therefore, an automatic 10 
second delay was inserted between the actual Reset of the Desktop and the 
first test to see if it was completed.

2. I was not possible to do a Desktop Backup using UniMaint while UniWatch 
was running because both UniMaint and UniWatch used the same name for the DOS 
Execution Queue. This has been fixed by changing the name that UniWatch uses 
for the Queue.

3. If a change was made to the Repair Logging Filename using the Repair 
Options Dialog a SYS3175 would occur at exit time because one of the routines 
that set up this information was referencing the wrong variables, so the 
correct variable was not initialized.

4. The remaining Wizards have been completed.

5. A number of new options have been added to the Automatic Backup.

6. A couple of problems in the WPS Agent Object were fixed and V1.0p is 
the current version for this version of UniMaint.

******************************* V4.10.4 *****************************

The items fixed in Version 4.10.4 are:

1. If the Xref Display Window was opened, dismissed and  the Dump routines 
were called, a SYS3175 would occur in the Dump routines because one of the 
Xref indexes was not reset to zero.

2. Not all of the new options were implemented so that they could be placed 
on the command line. The remaining new options have now been added to both 
the code and to the Help.

3. Some of the new features were not on the Toolbar, so they have been added.

4. Some of the new Menu items did not have Accelerator Keys assigned to them. 
The keys have now been assigned and the Help has been updated to reflect the 
new Accelerator Keys.

5. The Help for the Automatic Backup Settings, Cross Reference Display, Cross 
Reference Defaults and the UniWatch program were all added to the Help file.

6. If a variable was not one that was saved in the INI file, it would not get 
set by the Wizard code. The code has been changed so that the variables will 
now be set.

7. All of the Help for all of the current features has been completed.

8. An update capability has been added to the Cross Reference so that 
creating the Cross Reference will not take so long.

9. A number of menu items have been added to the Cross Reference Display so 
that the user can Display portions of the Cross Reference information. The 
main reason for this is that displaying all of the information simply took 
too long, especially when the dialog was dismissed.

10 Code has been added to the Uninstall so that when an Application is being 
archived, all of the WPS information on the Objects will be saved.

11. The code to Archive an Application has been added so that this feature 
should work completely.

12. When removing a directory from a line in the config.sys file and the 
directory was the only thing on the line, the stub was left in the config.sys 
file in error. Additional code has been added so that this will no longer 
happen.

13. When removing directories from lines in the config.sys file the check 
stopped after the first found item was removed. This is an error because a 
directory with subdirectories could easily be in the same line in the 
config.sys multiple times. The code has been changed so that items will 
continue to be removed until there are no more to remove.

14. UniMaint will find a private INI file if either UNIMAINT= or INIMAINT= is 
in the config.sys file. However, UniWatch would only look for UNIMAINT=. 
UniWatch has been changed so that it will look for either if the entries.

15. Both UniMaint and UniWatch have been changed so that they will look for a 
private INI file with the name UNIMAINT.INI in the default directory if 
neither INIMAINT= nor UNIMAINT= is set in the CONFIG.SYS. This will allow 
users to have a private INI file for UniMaint without having to place an 
entry in the config.sys file.

16. There was a problem in the way the Cross Reference determined the levels 
of directories if there were two directories next to each other and the names 
were very similar. The code to determine the level could bypass the backslash 
at the end of the second directory name in certain cases. This has been fixed 
by changing the starting offset when checking for the backslash character.

17. It was possible to have more than one copy of UniWatch running at any one 
time. This is an error so code has been added to UniWatch to check for this 
condition, inform the user and automatically terminate the second copy.

18. An additional check has been added to the analysis of the 
PM_Workplace:Startup Application in the OS2.INI file when a WPS Repair is 
done. This check will identify any Object which is not a WPS Startup Folder 
as being an Invalid Startup Object.

19. A new Repair has been added that will fix the problem of having duplicate 
Create Another menu entries.

20. It was possible for the Minimum Days between Auto Backups to be larger 
than the Maximum Days and this is obviously incorrect. Code has been added to 
check for this condition and not allow the user to dismiss the dialog until 
it is fixed.

21. There were cases when the code to remove entries from the CONFIG.SYS file 
would not work correctly because the directory name had a trailing backslash. 
Additional code has been added that will insure that the trailing backslash 
is removed before and of the tests are done.

22. A SYS3175 would occur when certain dialogs, like the Repair Dialog, were 
dismissed if the Options or Defaults Dialog was called from the main Dialog. 
This was caused by the fact that both dialogs initialized and freed the same 
set of Wizard pointers. Code has been modified so that the Options and 
Defaults will know if they are called from the main dialog and not initialize 
or free the pointers.

******************************* V4.10.5 *****************************

The items fixed in Version 4.10.5 are:

1. Some typos in the Options Wizard have been fixed.

2. The Automatic Backup Wizard terminates with a logic error of 2203 after 
General Modifications. The problem is that a resource was not defined and has 
been fixed.

3. Some punctuation errors in the Repair Wizard descriptions for the settings 
for the various types of drives, CD-ROM etc. has been corrected.

4. The text next to the checkbox for the Desktop Backup Wizard panel for 
naming the backup file was incorrect because the initialization routine was 
referencing the wrong resource and has been fixed.

5. The length of the entry field that displays the Dump File name was too 
short and has been increased to be long enough to hold any valid filename.

6. The Cross Reference would terminate with a Logic Error 2206 if it was run 
with Force Rebuild off and there was not an existing Cross Reference File. 
Code has been added so that this will no longer happen.

7. Code has been added to remember the location of the Wizard Dialog if the 
user has moved it to a new location by dragging the Title Bar. Until moved 
again, the new position will be used for all Wizard Dialogs.

8. The code to select a new Directory which is used by both the Wizards and 
the normal Dialogs would not change the Directory because the wrong pointer 
was used for the new name. The code has been changed to use the correct 
pointer.

9. The sequence of the Repairs in the Repair drop down list has been modified 
so that it is better organized and the Repairs that are included in another 
Repair have been indented so that the relationships are easier to see.

10. A new setting has been added to the Automatic Backup Settings Dialog that 
allows the user to specify a specific hour of the day that the Auto Back 
Check should be made.

11. The UniWatch Display has been changed so that if a trigger value is zero, 
which means it will not be used, the word None is displayed in the window 
rather than just a value of zero.

12. All of the Bitmaps used for the various Wizards have been changed so that 
the Wizard will use the same Bitmap as is used for the corresponding dialog 
on the Toolbar.

13. When the Uninstall or Archiving was collecting the WPS information on a 
Folder with a number of Objects, the collection could take a minute or so but 
the user had no indications as to what was going on, therefore, the code to 
display the progress dialog has been moved so that it will be displayed while 
all of this is happening.

14. When an Application was Archived, but not Uninstalled it was possible to 
get blank entries in the Action Listbox and entries in the Uninstall window 
that simply said Doing Action without identifying the Action. This was caused 
by two different problems, one concerning the Desktop Reset and the other 
concerning Deregistering or Archiving WPS Classes. Both have been fixed so 
that the first case will not even be added, since it is not necessary, and 
the second will be formatted differently in the case of just Archiving the 
Application.

15. The title bar of all of the Wizard Dialogs has been modified so that it 
will display the current dialog number and the total number of dialogs in the 
Wizard, (x of y), immediately after the word Wizard.

16. Code has been added to the UniWatch program that will check to see if a 
Desktop Check needs to be run when UniWatch first starts based on the Daily 
Check Hour. If a Check is indicated, the user will be asked if they want to 
run the Check or bypass it, since the Check would be running at boot time, 
which is a very busy time.

17. There were circumstances where Actions in the Uninstall/Archive structure 
would be duplicated or unnecessary. Additional code has been added to the 
routine that builds the Action Structure entries to check for these 
conditions and not add the duplicate or unneeded Actions.

18. There were a number of places where there could be a problem with the 
progress dialog in the Uninstall/Archive code. A new subroutine has been added 
to handle this area so that it will be consistent.

19. A new Options has been added to the Options Dialog and the Options 
Wizard, Auto Start of WPS Agent. If this Option is on, and the default is On, 
then UniMaint will automatically start the WPS Agent Object during 
initialization. The Object is started in a separate thread, so it does not 
interfere with the normal initialization and has the advantage of having the 
Agent Object running if and when it is needed. This Option will not take 
effect when a Tool is run because many of the Tools take less time to run 
than it takes to initialize the WPS Agent Object.

20. The Application Reinstall has been finished and a large number of 
modifications were made to the Archiving because there turned out to be 
necessary in order for the Reinstall to work.

21. The WPS Repair for the error Objects in the Startup Folder did not work 
in situations where the Startup Folder did not have the standard name. 
Therefore, the test for these Object has been changed to a test to see if the 
Object belongs to the WPStartup Class or a Class derived from the WPStartup 
Class.

22. Some users had a number of Windows Programs that the Cross Reference 
indicated needed a DLL in the TCP Directory called ADVUSER.DLL. It turns out 
that this was caused by two different problems. First, many if not all 
Windows programs reference a USER File in the EXE or DLL. However, it turns 
out that this file, like the KERNEL File, is not really a DLL or Driver, but 
a file that is internal to Win31. Therefore, code has been added to bypass 
all of the references to USER. However, even with that, USER should not have 
been identified as equal to ADVUSER and the code that makes the comparisons 
has been modified so that this sort of thing will not happen with another 
file.

******************************* V4.10.6 *****************************

The items fixed in Version 4.10.6 are:

1. A change made in V4.10.1 to fix a problem where the Repair would bypass 
certain types of VDISK or Floppy drives created a problem with TVFS and 
ZipStream File systems because an attempt was made to call DosOpen on the 
Drive and this does not work because the drive is locked. Code has been added 
to bypass the Drive level DosOpen for these File Systems, since it is not 
needed to further identify the type of Drive in any case.

2. If a problem occurred during the purge of modified files during the 
EXE/DLL Cross Reference Update, the diagnostic information was not adequate 
to determine the problem so this area has been enhanced to make diagnosis 
easier.

3. A number of syntax and window size errors in the Wizards were fixed.

4. In the Desktop Backup Wizard, the name used in panel 10 was never deleted, 
so it would show up in all of the other panels. The resource ID in the 
routine that destroys the names has been corrected for this panel so that the 
name is destroyed after it is used.

5. In order to make the names in the documentation and the actual program 
more consistent and to conform to the names used for INI files in general, 
the name for the User Data Window has been changed to Key Value.

6. If the DLL that implemented a non standard WPS Class was registered in a 
way that the name of the implementing DLL was saved without the Path 
information, then the Archive for the Application would fail with a logic 
error of 1939 because the zipping of the DLL would fail. Code has been added 
to insure that the full path and filename is obtained for all Class DLL's 
before an attempt is made to zip it.

7. An attempt to do a second Uninstall or Archive without dismissing the 
Dialog would cause UniMaint to attempt to Uninstall or Archive the first 
Application a second time because some memory items were not freed between 
attempts. Code has been added to insure that each Uninstall or Archive will 
start with new memory.

8. There were a few places in the code where MultiMaint was still referenced. 
All of these have been changed to UniMaint.

9. An attempt to Reinstall a second Application without dismissing the Dialog 
would result in a Logic Error 2310 because the wrong handle was used as the 
Parent for the Reinstall Action Dialog and it was not a NULLHANDLE the second 
time through. The code has been changed so that the correct handle will be 
used for the Reinstall Action Dialog.

10. The Reinstall would not handle a File that was dropped on the Reinstall 
Window from Drives because the dropped item was identified as a WPS Object 
rather than a File. Additional code has been added so that drops from Drives 
will not be accepted as long as the Object represents a Data File.

11. Many users have had problems with the code that Resets the Desktop and 
then waits for the Reset to be completed. The problem was caused by the fact 
that the code would only wait a fixed period before trying to execute an API 
that required that the WPS be present. In order to fix this problem, the code 
has been changed so that waiting for the Reset to be completed is done using 
API's that are not dependent on WPS.

12. If a user is having a problem with UniWatch, it is possible that a lot of 
temporary Check files could be kept on their HD. Code has been added so that 
these files will automatically get deleted the next time a UniWatch Check is 
run.

13. The first time UniWatch is run after setting a specific time that a Check 
should be run, the message that a Check was missed because UniWatch was not 
running would appear. This was caused by the fact that the last day a check 
was run was still zero. Code has been added to look for this condition and to 
simply update the date of last check to the current day so that the message 
will not appear unless UniWatch is actually not running at the chosen hour.

14. The Auto Backup Defaults were on the Toolbar twice and one of the entries 
did not work. The duplicate entry has been removed.

15. When the Options Wizard was implemented, the code to add or remove the 
Toolbar when the appropriate option was changed was accidentally removed. This 
code has been added back so that the Toolbar will appear or disappear as soon 
as the Options Dialog is dismissed, assuming the Toolbar option was modified.

16. There was a potential conflict between the timer ID used by UniWatch and 
other timers in the system, so the UniWatch Timer ID was changed to be a much 
higher and very unusual value.

17. The Uninstall and Archive code has been modified to use the EXE/DLL Cross 
Reference, if it exists.

18. It was possible for the Uninstall/Archive to miss some DLL's when only a 
single file was being Uninstalled or Archived because the DLL's in the same 
directory that the file itself was in were not included in the list of DLL's. 
The code has been fixed so that the directory of the file being Uninstalled 
or Archived will always be included.

19. There were a number of places where the Cross reference Build could get a 
logic error because it was trying to remove something which had already been 
removed. The logic error codes were 2203, 2202 and a few others. Additional 
checks have been added in a number of areas so that this will no longer 
happen. The logging and error diagnostics in these areas have also been 
improved so that any future problem will be easier to diagnose.

20. There was a problem in the code that did the internal analysis for Win95 
and WinNT modules that caused the DLL's to not be found for these types of 
files. The problem has been fixed so that these modules will not be analyzed 
correctly.

21. The Class List Dialog on the WPS Menu has been improved in two areas. 
First, before a WPS Class is added to the Class List Window, a search is made 
to insure that the Class DLL can actually be found. If the Class DLL cannot 
be found, then the line in the Class List Window will inform the user of this 
situation. Second, a Force Delete Button has been added at the bottom of the 
Dialog. This Button will remove a WPS Class from the Class Table in the 
OS2SYS.INI file even if the Class cannot be Deregistered using the standard 
WPS Deregistration API. This will allow a user to get rid of any Class that 
is causing a problem, even those that WPS will not Deregister.

22. A new item has been added to the Recover Menu that allows the User to 
Locate and, optionally, modify all occurrences of a specific string in any INI 
file. This feature will make it easy to make global changes, like changing 
a drive letter, in any INI file.

23. The UniWatch program would not start the Timer if a Daily Check Hours was 
specified, but the Hours Between Checks was not specified. Code has been 
added so that the Timer will be started if either value is specified.

******************************* V4.10.7 *****************************

The items fixed in Version 4.10.7 are:

1. There was a potential problem in the WPS Restore code if something was not 
found in the WPS INI file. The code would jump to the wrong while loop and 
the results of this are unpredictable. The code has been fixed so that they 
jump will go to the correct place.

2. If the Repair was run from the Tools Icon using V4.10.6 it would fail with 
a Logic Error 10209 because the Repair code did not insure that the WPS Agent 
Object was running. This has been fixed by adding the necessary code to the 
Repair Dialog so that the WPS Agent Object is always started when the Execute 
button is selected.

3. If the Auto Start WPS Agent checkbox was checked in the Options Dialog, 
but the start of the WPS Agent Object failed, the Option was automatically 
turned off, as it should be, however, the user was not informed that the 
problem has occurred and given the option to produce a dump at that point. 
Code has not been added to the thread that starts the WPS Agent Object to 
make sure the user is aware that there is a problem getting the Object 
started.

4. The WIN_ATM Setting has been added to the Windows Settings in the Object 
Settings code.

5. The Collection and Setting of the Minimize Window Button has been added to 
the collection of the Detail WPS Data for all Objects.

6. The Minimize Window Button setting has been added to the WPS Object 
Display and Settings Miscellaneous Dialogs.

7. The Auto Close Window setting has been added to the WPS Object 
Display and Settings Miscellaneous Dialogs.

8. When UniWatch turned Logging on or off, the message Box was titled 
UniWatch Error and should have said UniWatch Message. This has been fixed.

9. The logging in UniWatch has been changed so that each line will have a 
date and time stamp on it.

10. The Save Restore structure was not included in the WPS or Uninstall 
Variable dumps and has now been included.

11. The Class List Dialog would list every DLL that had a full path and 
filename as not found. Code has been added to check for a full name and use a 
different method to see if these DLL's exist.

12. Because a subroutine was being used from more than one basic purpose it 
was possible that the search string would have a trailing backslash removed 
when used by the INI File Locate/Translate Dialog. The result was that a 
search for E:\ would also find all instances of E:, which was incorrect. The 
code has been changed so that the trailing backslash will no longer be 
removed.

13. If the Automatic Backup Daily Hour was set and the number of Check Hours 
was set to zero. UniWatch would run a check every minute because of an error 
in how the triggers were compared to the current values. The code has been 
changed so that this will no longer happen.

14. The INI File Translate was not sufficiently flexible in that it would 
only do all of the changes if the user asked for any of them. Since there are 
clearly situations where the user will Locate all of the instances of 
something in an INI file and then only want to Translate some of them, a set 
of buttons has been added to the Locate/Translate Dialog that will allow the 
user, after doing a Locate, to select some of the items in the window and 
then either do just the selected items or do all but the selected items.

15. When Uninstalling an Object, it was possible to get a logic error of 1925 
because certain types of objects would have an invalid handle constructed for 
them. The routine that does the WPS check has been modified so that this will 
no longer happen.

16. There were a couple of places where the selection of a new logging file 
for an functional area would cause the name of the file to be placed in the 
wrong string variable. These have been fixed.

17. It was possible for Logging to be turned on for some areas but the actual 
logging to not occur because the logging file was never opened. Code has been 
added to all of the default dialogs so that a logging file will be opened by 
that dialog as soon as the logging flag is turned on.

18. If the sequence of the Applications and Keys in the main UniMaint window 
was changed to or from alpha sequence, the windows were not automatically 
refreshed. Code has been added to the options dialog to insure that this will 
now happen.

19. There were some situations where the wizard memory areas were not freed 
after being used by some of the Default Dialogs. The necessary code has been 
added to all of the dialogs to free all Wizard memory areas.

******************************* V4.10.8 *****************************

The items fixed in Version 4.10.8 are:

1. It was possible that dropping a WPS Object that represented a Program 
Object on the Uninstall Window would cause the checks for related entries 
for the EXE to be bypassed because the flags were not set correctly when the 
actual EXE was added to the Uninstall Structure. Code has been added to 
insure that the appropriate checks are now done.

2. If the Uninstall or Archive was canceled by the user the 'Completed 
Successfully' message was still added at the end of the canceled message. 
The code has been changed so that this will no longer be the case.

3. The time that the Desktop Reset will wait for the Desktop to be closed 
down and then restarted have been made variable by adding two items to the 
Options Dialog that allows these values to be controlled by the user.

4. The Uninstall, Archive and Reinstall have been upgraded to include a 
number of Windows items including finding files in the same directory as the 
WIN.INI file and handling Windows format INI Files.

******************************* V4.10.9 *****************************

The items fixed in Version 4.10.9 are:

1. The dump of the Xref Table, if it was filled, would always dump only the 
first entry and would dump that entry the max number of times because an 
index was not getting incremented. Code has been added to increment the index 
so the table will now be printed correctly.

2. When the Uninstall Files code was working on all of the files in a 
directory, only the first file was displayed in the progress dialog because 
the message updating the name of the file was only in one of the two places 
where it was needed. The code has now been added to the second place.

3. The code to return references for a file could cause a Logic Error 1 if 
there we no references of a particular type because the wrong exit was used 
from the routine. The correct exit will now be taken.

4. There were a number of places where the same Logging file could be opened 
more than one time using the same file pointer. Code has been added to make 
additional checks to insure that no file is opening more than one time.

5. The Uninstall Archive file must have an extension of zip, but the code did 
not enforce this. The code has been changed to insure that the name of the 
Archive File has an extension of zip.

6. If a WPS Object that represents a WPProgram Object was dropped on the 
Uninstall or Archive window, the appropriate checks for various kinds of 
related files and INI information were not made because the type of EXE file 
was not set and many of the checks depend on the type of file. The code that 
sets the file type has been moved so that all EXE files will have it set 
before the collection of information is started.

7. The name of the zip file that contains an Application that is to be copied 
from the WIN.INI file was stored in the archive with the path information. 
This is incorrect since the Reinstall code would not be able to find it. The 
routine that is used to zip this information has been updated so that the 
name of the zip file will be stored without the path information.

8. There were situations where the Uninstall, Archive or Reinstall would 
terminate because it hit a condition it could not handle or was canceled by 
the user but the termination message would say that it was successful. All of 
these have been fixed.

9. The routine to copy an Application from a Windows INI File to another file 
actually copied all of the Windows INI File except the Application that 
should be copied. The line of code that made the invalid compare has been 
fixed.

10. The routine to replace an Application in a Windows INI File would 
completely replace the entire INI File with the Application, thus eliminating 
all other Applications. The routine has been fixed so this will no longer 
happen.

11. When files were restored to the WIN.INI directory, it was possible that 
there could be a subdirectory involved as well as the WIN.INI directory. In 
order to insure that this possibility is taken care of code was added to the 
Archive to save the path of the WIN.INI file in the Archive control file and 
this information is then used by the Reinstall to make sure that the target 
path is adjusted correctly.

12. The Toolbar submenus will no longer have a question mark where the bitmap 
should be.

13. The logging when a SYS3175 has been upgraded so that all of the 
subroutine calls that are stored on the Stack for the failing thread will be 
traced and reported.

******************************* V5.0 *********************************

The items fixed in Version 5.0 are:

1. The name for Orphan DLL's in the Cross Reference Display has been changed 
to Unreferenced DLL's, a warning has been added to insure that users 
understand what they are looking at and an option has been added to the Cross 
Reference Defaults Dialog that will allow experienced users to turn off the 
warning.

2. The Clear button in the Cross Reference Display was not implemented and 
would cause the Dialog to be dismissed. The code to implement this function 
has now been added.

3. If the ESC Key was hit while the Cross Reference Display Dialog was on the 
screen the Dialog would be dismissed without freeing the memory for the lines 
in the Cross Reference Window. Code has been added to insure that the memory 
is always freed before the dialog is dismissed.

4. Code has been added to the Uninstall and Archive routines to check all 
DLL's and Drivers that are in the Cross Reference file to see if they are 
referenced by files other than the ones being deleted and if they are, they 
are not even considered as candidates for deletion. On the other hand, if a 
DLL or a Driver is only referenced by the files being deleted, then it will 
always be deleted and archived.

5. The default for the initial Desktop Reset and Wait period was changed from 
5 seconds to 10 seconds.

6. If the EXE file for an Object that was being Uninstalled or Archived did 
not exist and the user responded yes to the question about whether they want 
to delete other files in the same directory, the Uninstall or Archive would 
terminate saying that it was canceled by the user. If the EXE cannot be 
found, then the question should not even be asked and the code has been 
changed to handle it this way.

7. The Desktop Reset with Wait routine that was used by such things as the 
INI File Repair would not run at all if the WPS Agent Object could not be 
started. The routines have been changed so that the Desktop Reset can be done 
without a problem even if the WPS Agent Object cannot be terminated or 
started.

******************************* V5.00.1 *********************************

The items fixed in Version 5.00.1 are:

1. The WinSetWindowPos API was changed to remove the SWP_ACTIVATE in order to 
fix a focus interaction problem with Object Desktop.

******************************* V5.00.2 *********************************

The items fixed in Version 5.00.2 are:

1. The Exception Logging file did not have a date and time stamp in it so it 
was sometimes difficult to correlate this file with the corresponding 
UniMaint Dump or Logging file. The routine which logs the version will now 
use the standard logging routine which already adds the date and time stamp.

2. The Repair Termination code was modified in V5.0 to not report an error 
when there was a problem shutting down the WPS Agent Object. However, there is 
one situation where an error could still be reported and this code has been 
changed to fix this condition.

3. A number of problems involve coordination between UniMaint and the WPS 
Agent Object. When these problems result in a situation where the WPS Object 
is not responding, the diagnostic dump does not give any information that 
could be used to verify the version of AcsAgent.DLL being used. Code has been 
added to obtain the size of the AcsAgent.DLL in use and record this 
information in a variable that will be included in the diagnostic dump so 
that problems with old versions of the DLL will be more obvious.

******************************* V5.00.3 *********************************

The items fixed in Version 5.00.3 are:

1. The code in UniWatch that checked for another running copy could cause a 
SYS3175 in PMMERGE.DLL if the Window Handle stored in the INI file was not a 
running window. Code has been added to validate that the Window Handle is 
valid and to assume that a second copy is not running if it is not.

2. The error logging routine could cause lines to be double spaced because 
the passed line already had a new line character and the logging routine 
added a second one. Code has been added to the logging routine to make sure 
there is only one new line character.

3. The Cross Reference Tools did not work because the wrong compare API was 
used in the Tools code. The code has been modified to use the correct API.

4. The Cross Reference and a couple of other functions would not terminate 
correctly when run as Tools because the error reporting routine was not 
called when a thread was going to return a good return. Since it is the error 
reporting routine that checks to see if the Tools run should be terminated, 
all of the threads have been changed to insure that the error reporting 
routine is called even if a good is going to be returned.

5. The code that allows for all of the Path information in all of the WPS 
Objects and all of the INI files on a Desktop to be modified has been added 
to the Corporate version.

6. When the Options Dialog Tool was used, the Icon would stay cross hatched 
because the dialog window was destroyed but the actual Application did not 
terminate. The standard dialog termination code has been added to the Options 
dialog.

7. When using the Options Tool and the window was dismissed while the Show 
Toolbar box checked, the Toolbar would appear at the top of the Desktop 
window because the code that creates the Toolbar did not check to see if the 
run was a Tools run or a standard run. The necessary check has now been added 
so that the Toolbar will only be created when there is a main UniMaint 
window.

8. The Repair would get various 102xx errors after a Repair was run because 
the entry in PM_Workplace:Location for the UniMaint WPS Agent Object was 
being deleted because the Class is derived from WPTransient so the Object 
Handle was less than 0x20000 and there was no entry in the 
PM_Abstract:Objects Application. Code has been added to the appropriate 
routines to handle Objects in WPS Classes derived from WPTransient in a 
different way so valid entries will no longer be deleted.

******************************* V5.00.4 *********************************

The items fixed in Version 5.00.4 are:

1. In order to address a problem with Object Desktop, the code that adjusts 
the visibility, size and positions of the windows has been modified so that it 
will check the visibility state of the window and only turn on the SWP_SHOW 
flag for the WinSetWindowPos API when it is necessary to modify the 
visibility state.

2. Code has been added that will allow for logging of the initialization of 
the WPS Agent Object and the setting of the initial window positions. The 
initialization logging will be turned off automatically as soon as the first 
user command is entered.

3. Certain kinds of format errors in the command line parameters would cause 
UniMaint to terminate with a logic error of 65535 rather than report that the 
parameter was in error. The routine that analyzes the command line has been 
changed so that all format errors will be reported as such.

4. If the UniWatch program got certain kinds of errors accessing one of the 
INI files, the error text field would not get filled in so the error message 
that was reported was useless. Code has been added to the appropriate 
routines so that these errors will be reported correctly.

5. When the Automatic Desktop Backup Option was turned on via the Desktop 
defaults Wizard or Dialog, the Desktop Backup CMD file was not rebuilt. If 
the user then attempted to run UniWatch without doing a Desktop Backup from 
UniMaint, the Desktop backup CMD file would never contain the lines needed to 
create the Automatic Backup Control File. Both the Wizard and the Dialog have 
been changed so that the Desktop Backup CMD file will always be rebuilt when 
Automatic Backup is turned on.

6. If the user attempted to run UniWatch without first setting the Automatic 
Backup Defaults in UniMaint, UniWatch would terminate with a logic error. 
Code has now been added to UniWatch to check for this condition and to tell 
the user to run the Automatic Backup Wizard or set the defaults via the 
Automatic Backup Defaults Dialog.

7. If the user ran UniWatch without turning on the Automatic Backup Option in 
the Desktop Backup Wizard or Defaults Dialog, then UniWatch would terminate 
with a logic error. UniWatch has been modified so that it will check for this 
condition and tell the user that they need to go back to UniMaint, set the 
Option correctly...which will automatically rebuild the Desktop Backup CMD 
File...and then rerun UniWatch.

8. If the user ran UniWatch without first making a Desktop Backup with the 
Automatic Backup Option turned on, UniWatch would terminate with a logic 
error code. Code has been added to UniWatch to recognize this condition and 
to ask the user if they want the initial Desktop Backup done by UniWatch. If 
the user answers yes, then UniWatch will make the Backup and then run 
normally.

******************************* V5.00.5 *********************************

The items fixed in Version 5.00.5 are:

1. When the Bypass Known Errors checkbox was checked or unchecked in the 
Repair Options Wizard or Dialog, the Save Deleted Items flag got set rather 
than the Known Errors Flag. The appropriate routines have been modified so 
that they will set the correct flag.

2. It was not possible to delete the User Backup and Restore CMD Files in the 
Desktop Defaults Dialog. The routine has been updated so that the delete for 
these two entries will now work correctly.

3. The checkbox for Use Backup Descriptions does not get checked correctly 
when the Desktop defaults Dialog is started. The initialization routine has 
been fixed so that this checkbox will work correctly.

4. Additional code has been added so that even if there is a problem starting 
the WPS Agent Object and even if the Agent Running flag is incorrect, it will 
not cause a problem with the Repair.

5. There was one remaining place where it was possible for the 
WinSetWindowPos API could be called with SWP_ACTIVATE and SWP_SHOW when it 
was not necessary, thus causing a problem with OD. This last routine has been 
fixed so the problem should not occur.

******************************* V5.00.6 *********************************

The items fixed in Version 5.00.6 are:

1. When the changes for OD were made, one of the calls to one of the routines 
that service the data MLE did not get changed correctly and selecting an time 
in one of the Listboxes will cause the MLE to disappear.

2. The Archive Tool did not work because a break was left out of a case 
statement.

******************************* V5.00.7 *********************************

The items fixed in Version 5.00.7 are:

1. It was possible to get a logic error 2202 when doing the Cross Reference 
in update mode because one of the routines did not check for a zero length 
buffer before attempting to allocate memory to hold INI File key values. Code 
has been added so that the zero length buffer will not be recognized and 
handled correctly.

2. When the Options Dialog was invoked via the Tools Icons and the Cancel 
Button was used to dismiss the dialog, the tool would not terminate because 
the dialog dismiss code was not called with the proper window handle. The 
dialog termination code has been changed so that the Options Tool will 
terminate when either the OK or the Cancel button is used.

3. The code that told the user that the cause of the 10200 logic error was 
that AcsAgent.DLL could not be found has been removed because there is other 
code in the initialization that verifies that AcsAgent.DLL exists.

4. There were ways that UniMaint could be shutdown where the position and 
other information was not saved. Code has been added to insure that 
everything is saved for all shutdown conditions the are handled by PM.

5. When the Cross Reference Display got certain errors, such as the Cross 
reference File not found, it still displayed the Cross Reference Display 
Dialog and this is incorrect. The code has been changed so that the dialog 
will terminate immediately after the user dismisses the error message box.

6. When an INI file was dropped on the UniMaint Icon, then main UniMaint 
window would come up, but the subwindows that display the Applications and 
Keys would not be visible. The code that handles the dropped items did not 
use the standard code to set the position of the windows, so the sub windows 
were never made visible. This has been fixed.

7. There were a few places where the diagnostic information was not 
sufficient to determine why a problem occurred and these areas have been 
improved.

8. The logging during the repair of Printers was greatly enhanced in order to 
make it easier to debug problems.

9. When the UniMaint main window was first made visible, it did not have the 
focus because the SWP_ACTIVATE flag was not included in the WinSetWindowPos 
API because of the changes made for Object Desktop. The flag is valid for the 
very first time this API is called and has been added to this one call to the 
API.

10. A number of additional logging entries were added to the Cross Reference 
code in order to improve the diagnostic capabilities in this area.

11. One more rare but possible combination of Printer information was found 
that would caused the Repair to incorrectly identify a Printer as not being 
installed. The problem was fixed by adding an additional search of the valid 
printer name table when examining certain applications from the OS2SYS.INI 
file.

12. If an ASCII Format EA ended with two null characters rather than the 
expected single null or no null, the EA was flagged as an Invalid EA. An 
additional test has been added to this portion of the EA code so that strings 
ending with double null characters will be considered valid.

******************************* V5.00.8 *********************************

The items fixed in Version 5.00.8 are:

1. The message put out by UniWatch when the Check Time was missed because the 
computer was not running at that time has been modified to make it a little 
bit more clear.

2. Code has been added so that the initial type of Repair can be controlled 
using a command line parameter by coding 
SETREPAIRINITTYPE=REPORT/ASK/ALL/SELECTED to set the initial type to Report 
Only, Ask, Do Repair, Do Selected respectively.

3. The initialization messages for the Reinstall have been modified to 
include the default directory in order to improve the ability to diagnose 
problems.

4. Code has been added in front of all of the places where the 
Uninstall/Archive/Reinstall executes an external program such as 
Zip/Unzip/IniCopy to record the exact parameter line passed to the program in 
order to improve the diagnostics.

5. Additional logging code has been added to the routine that extracts a file 
from a Zip file in order to improve the diagnostic capabilities.

6. A number of other routines involved in the Uninstall/Archive/Reinstall 
were modified to add additional logging capability so that diagnosing 
problems would be easier.

******************************* V5.00.9 *********************************

The items fixed in Version 5.00.9 are:

1. Because of a UniMaint startup problem, additional error reporting has been 
added to the routines involved in the startup procedure.

2. It was possible to get a Logic Error 624 when starting UniMaint with 
/SETOPTINITLOG=YES on the parameter line because a file pointer was NULL and 
was not tested before it was used. The routine has been updated so that it 
will not use a NULL File Pointer.

3. When the Toolbar was active at startup time a SYS3171 would occur when an 
attempt was made to set the window position of the Toolbar just after the 
frame window was made visible. The problem was fixed by modifying the code 
that sets the position to only set the position of the Toolbar and letting 
the toolbar code control the visibility.

******************************* V5.00.10 *********************************

The items fixed in Version 5.00.10 are:

1. This version includes V1.10.1 of the WPS Agent Object code that fixes the 
SYS3175 in SOM.DLL that a number of users were seeing.

2. It turns out that there are some situations where having the File Handles 
for just the drive with no directories or files are valid. Specifically, if 
there are WPS Objects that have the root directory as the Startup Directory 
then it is necessary to have a Handle for the Drive in the File Handle 
structure in order to have a Handle to put into these Objects. Therefore, 
additional code has been added so that the Drives that only have Drive 
entries in the File Handle Structure and the Drive is the Startup Directory 
for at least one Object, then these Handles will not be flagged as invalid by 
the File Handle Repair code.

3. Files with extensions of ADD and SYS were added to the Cross Reference in 
order to reduce the number of unreferenced DLL's.

4. Yet another condition in the Printer support was found where a Printer 
could be assigned to more than one queue. The code has been updated so that 
it will handle this situation.

******************************* V5.00.11 *********************************

The items fixed in Version 5.00.11 are:

1. It was possible for UniWatch to get an error when adjusting the priority 
of the various threads so the code has been changed to insure that the error 
is recognized and the proper adjustment is made.

2. The code that does the Reset of the Desktop at the end of the Repair has 
been changed so that UniMaint will not hang when the resetting of the Desktop 
is slow. This will insure that the successful continuation of UniMaint is not 
tied to the speed of the Desktop Reset.

******************************* V5.00.12 *********************************

The items fixed in Version 5.00.12 are:

1. The default delays for the Desktop Reset were changed from 10 and 5 to 30 
and 10.

2. There was one very unlikely situation where the Repair Dialog could report 
a Logic Error code of 1 rather than the actual error returned by a thread.

3. The code to make global changes in WPS Objects and OS/2 INI files for the 
Corporate Version would abend if a Read Only INI file was encountered. The 
code has been updated to look for Read Only INI files, add a line to the log 
whenever a Read Only file is found and to not attempt to write to an INI file 
that is Read Only.

4. A number of initialization and diagnostic reporting improvements were 
added to the WPS Agent Object code to bring this code to V1.10.4.

5. If the Desktop was Reset during an Uninstall/Archive operation and the WPS 
Agent Object could not be restarted, then the code would attempt to continue 
with Actions that could not be completed without the Object. Additional code 
has been added to make sure that no Actions that need the Object are 
attempted if the Object is not running.

6. A new item was added to the Options Dialog that allows the user to control 
whether the Restart Flag is used when the Desktop Reset and Wait function is 
invoked. The default is for this option to be ON and it should be left at 
this value unless there is some sort of a problem.

7. The Reset and Wait code in UniMaint was changed to be the same as that 
implemented in V1.10.4 of AcsTest.

8. Some changes were made in the Portable Backup to reduce the size of the 
copy of the OS2.INI file by eliminating unnecessary entries.

9. A New item was added to the Options Dialog, New INI File Processing. If 
this Option is left in the default condition, ON, then UniMaint will use it's 
own API's to access those INI files which are not already opened by another 
application, such as the OS2.INI and OS2SYS.INI. The primary advantages of 
these APIs are that they are faster than the standard Prf APIs and they will 
avoid the problem in PMMERGE.DLL when the total size of the open INI files 
exceed a certain size.

10. Code was added to the AcsTest program so that it can now be used to test 
the various Desktop Reset conditions without having to run UniMaint.

11. The way that UniMaint verifies that a new file is a valid INI file has 
been changed to improve performance.

******************************* V5.00.13 *********************************

The items fixed in Version 5.00.13 are:

1. When the New INI File processing Option was being used, no description was 
added to the Portable Backup files because the PORT01WP.WPS file did not 
exist when the attempt was made to add the description EA. The code to add 
the description has been moved so that this will now work correctly.

2. With the additional item on the menu for the Portable Restore, the Dialog 
was not wide enough so it was made wider.

3. When the Portable Restore could not find the old desktop name in the 
Portable Backup file it reported a logic error 1733. However, this indicates 
that the Portable Backup files being used are not valid so the code has been 
changed to popup a message box informing the user that they are using invalid 
files.

4. The Build Cross Reference required that the drives to be bypassed be 
entered as upper case. The code has been changed so it will accept either 
upper or lower case drive letters.

5. If there was an entry in the CONFIG.SYS file that ended with an equal 
sign the Uninstall routine would remove this entry under the assumption that 
everything other than the line identifier had been deleted. This code has 
been changed so that the Uninstall routine will only make this check on those 
lines that is has modified.

6. If a line in the CONFIG.SYS file contained a '%' character the character 
would be removed from the line by the Uninstall routine because of the way 
the line was being written to the updated CONFIG.SYS file. In C the '%' 
character is a formatting character and the library function being used was 
removing the character because of the way the arguments were specified. The 
function call has been modified so that the line will not be checked for 
formatting characters.

7. When temporary files were specified for the Portable Backup, it was 
possible to get a Logic Error 1704 because the Dialog informing the user 
that the Open Close sequence was underway could not be created. The code has 
been change to use the existing progress dialog box so that this problem will 
not happen again.

8. The code to retry the start of the WPS Agent Object has been changed so 
that it will use the Restart mode the second time around.

9. The Portable Restore routines did not check to see if the WPS Class of an 
Object that is going to update an existing Object is the same Class. Code has 
been added to make this check and a new menu item has been added to the 
Portable Restore menu bar that will allow the user to specify the action that 
should be taken when this condition is encountered.

10. The OS/2 Version has been added to the Portable Backup *.WPS file so that 
it will be easy to determine when a restore is being done to a different 
version of OS/2.

11. When creating a Portable Backup with Warp 4 the FTP Host Template Object 
would get opened because an attempt was made to gather information on the 
contents of the Folder, which contains a hidden object. The code to find the 
contents of Folders has been modified so that it will not attempt to 
enumerate the contents of Template Folders.

12. If an EXE file was dropped on the Uninstall or Archive window and the 
file was also a WPS Object, the code would do a WPS Object Uninstall or 
Archive when it really should do an EXE File Uninstall or Archive. Code has 
been added to the routines that handle the drop of the object to check to see 
if the Object is descended from WPDataFile. If this is the case, then the EXE 
File Uninstall or Archive is done.

13. Some of the standard Prf API's were not replaced in the UniWatch program 
so the AUTOCTRL.INI file would always have the RO Attribute set and the 
UNICKxxx.INI files would never get deleted. This has been fixed so that 
UniWatch will not function correctly.

14. The default value for the WPS Restore Desktop menu items were incorrect. 
The items would be correct once the user set them one time but the initial 
values were not correct and have now been fixed.

15. When going from page 6 to page 7 of the Main Options Wizard a Logic Error 
2003 would occur because an entry was left out of the string table. The entry 
has been added to the table so that this problem will not longer occur.

16. If the Cross Reference Build routines encounter a drive that they cannot 
identify, such as a NTFS drive, then a Logic Error 1313 occurs. Code has been 
added to identify this condition and to bypass these drives.

17. It was possible to get a SYS3175 if one of the profile write routines was 
passed a NULL pointer for the Value because an attempt was made to get the 
length of a NULL string pointer. Additional checks have been added to insure 
that this will not happen.

******************************* V5.00.14 *********************************

The items fixed in Version 5.00.14 are:

1. The version number for all of the modules, including the WPS Agent Object 
modules were modified so that they would all be the same, V5.00.14 in this 
case.

2. The special handling for the EA type of INI files was not being done 
correctly when the New INI File APIs were used because some required checking 
was not being done. The additional checking has been added to the code.

3. Code has been added to always determine the OS/2 version for the Desktop 
that was used to produce a particular Portable Backup file so that it will be 
possible to know when the source and target desktops are different versions.

4. Code has been added that will check the WPS Class of each Object before it 
is Restored to a specific Desktop. If the Object is not appropriate for the 
version of OS/2 used by the Target Desktop, then the Object will not be 
restored.

5. The default value for the Portable Restore Existing Object Option has been 
changed from Ask to Ignore.

6. In past versions it was possible to have a invalid value for some of the 
Portable Restore Options so code has been added to insure that the values are 
all valid.

7. If a Portable Restore is done to a Desktop, the OS/2 version of the source 
and target Desktops are different and the Portable Restore Option for 
Existing Object is not set to Ignore, the user is informed that this Option 
should be set to Ignore and asked it they want it set before the Portable 
Restore is done.

8. If a Portable Restore is done to a Desktop, the OS/2 version of the source 
and target Desktops are different and the user asks that a System Type Object 
be restored, then the user is informed that it is not a good idea to restore 
System Type Objects across versions of OS/2 and given the option of skipping 
all of these Objects.

9. It was possible to get a 1940 Logic Error trying to Reinstall an 
Application because a directory name that was forced to upper case during the 
Archiving process was not forced to upper case in the reinstall process. The 
code to make sure that both sides of the process handle the names in a 
consistent way has been added.

10. If a Find was done, then an entry was deleted from one of the windows and 
Repeat Find attempted, a Logic Error 803 would result because the Repeat Find 
could not start with the item that had been deleted. Code has been added to 
reset the Find indicator anytime something is deleted so that a Repeat Find 
will inform the user that there is no Find in progress.

11. Because of the way the New INI File processing is implemented, there were 
a number of situations where the RO Attribute would not get removed from a 
file because the file was never closed by UniMaint or UniWatch. This problem 
has been addressed in UniWatch by forcing the RO attribute on the Automatic 
Backup Control file off before it is opened by UniWatch. The problem has been 
addressed in UniMaint by recording the names of all files opened by UniMaint 
using the New INI file processing in the UniMaint control information file. 
When UniMaint is started, any file which were left open by the previous run 
of UniMaint will still be in the file and UniMaint will remove the RO 
attribute from all of these files during the initialization process.

12. When the New INI File clean was done after some sort of a problem, it was 
possible for the resetting of the attributes and the removal of the 
information from the INI file to be done twice. While this does not create a 
problem, it does slow down the termination so code has been added to insure 
that the clean up is only done one time.

13. Since the Warp 4 Toolbar is the same thing as the Warp 3 LaunchPad except 
for where the Object is located and the Title of the Object, code has been 
added to automatically convert the Warp 3 LaunchPad to the Warp 4 Toolbar and 
vice versa when a Portable Restore is done where the source and target 
versions of OS/2 are different.

******************************* V5.00.15 *********************************

The items fixed in Version 5.00.15 are:

1. A Logic Error 308 would result if an attempt was made to delete the 
Desktop Backup User Backup or Restore CMD file and there was no current CMD 
file specified. Code has been added to check for the specific condition and 
to ignore the request if there is nothing to delete.

2. A minor change was made to how the WPS Agent Object is started and 
terminated that should avoid a rare situation where UniMaint was hung for the 
five minute time-out period.

******************************* V5.00.16 *********************************

The items fixed in Version 5.00.16 are:

1. An option was added to the Repair Options dialog that allow the user to 
specify that they do not want the Desktop Reset after a Repair.

2. The New INI file processing code did not check for a value that is longer 
than 64k which would cause a length error when the time came to write the INI 
file. Additional code has been added to make this check.

******************************* V5.00.17 *********************************

The items fixed in Version 5.00.17 are:

1. It was possible to get a number of different logic errors in the 102xx 
range if the User or System INI files could not be written because the 
Desktop reset would be done at the same time that the initialization code was 
trying to start the WPS Agent Object. Code has been added to insure that this 
conflict will no longer occur.

2. There were some situations with the Uninstall, Archive and Reinstall where 
the Icon would not get closed down for a number of reasons. The code has been 
changed so that these functions will terminate appropriately when run from an 
Icon.

3. The Portable Backup would sometimes not complete when run from an Icon 
because a call to the error routine would cause the tools run to terminate 
before the PORT01WP.WPS file could be written or the description added to the 
file.

4. It was possible to get a logic error 10211 which indicates that the WPS 
Agent Object Heap is corrupted when restoring objects because a variable was 
not initialized to zero when a search of one of the WPS tables did not find a 
hit in the table. This would cause a random number of bytes of data to be 
allocated. Code was added to insure that the variable is correctly 
initialized.

******************************* V5.00.18 *********************************

The items fixed in Version 5.00.18 are:

1. The Repair would not remove invalid entries from PM_Workplace:FolderPos if 
the Objects were Transient Objects. The code has been changed so that these 
entries will now be removed.

2. The Repair would not identify a Shadow Object as being invalid if it was a 
Shadow of an Object that no longer existed. Code has been added so that this 
check will be made for Shadow Objects.

3. The Repair would make the appropriate checks for WPS Objects that were 
either WPProgram or WPShadow. However, the same check would not be made for 
Objects that were derived from these WPS classes. If the WPS Agent Object is 
running, then derived WPS classes will be included in the Repair.

4. Because of problems with the populating of Folders, especially the 
Templates Folder in Warp 4, an option has been added to allow the user to 
bypass failures to populate a Folder and go with however many objects are in 
the partially populated Folder.

5. The Repair code that checked the PM_Workplace:Location entries did not 
cross reference the ObjectID in the application with the ObjectID that the 
target Object claimed to have. Code has been added to do this. If the target 
Object claims to have a different ObjectID then the entry in 
PM_Workplace:Location is deleted. If the target Object does not have an 
ObjectID then the ObjectID specified in the application will be assigned to 
the target Object.

6. There were situations where UniWatch would either make a Desktop Backup or 
check to see if one needed to be made that were not appropriate if the user 
set up UniWatch to make a backup at a specific time of the day.

7. Some of the times used by UniWatch were not adjusted for the time zone 
that the user was using. Additional code has been added to adjust for the 
local time zone if it is set.

8. The New INI File processing code would get a Logic Error is an attempt was 
made to process an existing file that was zero length. Additional code has 
been added to make sure this no longer happens.

9. There were a number of conditions where the Repair would have problems 
with the Save INI file, which is not really needed now that users make 
Desktop backups. Therefore, code has been added to simply ask the user if 
they want to forget using the Save INI file if there is any sort of problem.

10. The code that opens an INI file has been modified so that it will check 
to see if a new INI file can actually be created based on the passed path and 
filenames. If there is a problem with the path or filenames that will prevent 
the file from being created then the user will be informed rather than just 
have UniMaint terminate with a logic error.

11. When Uninstalling an application with a WPS class that was registered 
with just the name of the class DLL and the class is selected for Archiving 
then a logic error 1939 would occur because the full name of the DLL was 
obtained too late in the processing. The code has been modified so that the 
full DLL name is developed earlier in the process so that this problem will 
no longer happen.

12. The list of standard classes has been updated to include the new classes 
from Warp 4 so that these classes will not be shown as candidates for 
deregistration.

******************************* V5.00.19 *********************************

The items fixed in Version 5.00.19 are:

1. The Logging in some of the Uninstall/Archive areas was upgraded to improve 
the ability to diagnose problems in additional areas.

2. The zero length Repair routine would remove zero length key values but 
would not remove applications that had zero keys or zero length applications 
so this code was added to the routine and the help has been updated.

3. If there were application or key names in an INI file that were zero 
length then the code that fills the application and key name windows would 
stop as soon as they encountered the zero length entry. Code has been added 
to make sure that these entries, even though they are not valid, are now 
displayed and that the code does not stop when it sees the zero length entry.

4. The Repair Objects code could get a SYS3175 when running under Warp 4 
because some of the entries in PM_Abstract Objects are padded at the end with 
extra data. Additional checks have been added to make sure that the pad 
information is bypassed.

5. The standard Prf APIs will simply bypass any application or key name that 
is zero length. That means that any INI file with this condition will 
continue to have it without the user's knowledge. The New INI file processing 
code has been upgraded so that it will display these applications and keys.

6. There were a couple of ways that the path information used in the Add Mult 
function of both the Supplemental Backup and Uninstall would be invalid. Code 
has been added to insure that there are no blanks in the path information and 
that the current directory is used if the path is just a single '.'.

7. Logging has been added to the Add Mult functions of both the Supplemental 
Backup and the Uninstall in order to better diagnose any problems with this 
area.

8. There were some areas where the Portable Backup and Portable Restore code 
would not terminate correctly after an error has occurred. Sometimes the code 
would go into a loop and other times a SYS3175 would result. Code has been 
added to fix all of these situations.

9. The Portable Restore routines that did the Restore of the Detail 
information would go to the incorrect exit when certain errors were 
encountered and would incorrectly set the original data flag to no when in 
fact the original data was being used. All of these problems have been fixed 
by modifying the three Portable Restore Detail Restore routines.

******************************* V5.00.20 *********************************

The items fixed in Version 5.00.20 are:

1. There were situations where the Add Multiple Files would not work 
correctly for both the Desktop Supplemental Backup and the Uninstall Never 
Delete Files. This was caused by a random byte in the stack getting clobbered 
and has been fixed by increasing the size of two variables that are allocated 
on the stack.

2. A logging capability and a way to bypass errors has been added to 
IniClean. The default for IniClean is to bypass any errors.

3. If a Find was done on All Key Names and the string that is being used for 
the Find occurred twice in the same application the Find would simply cycle 
through that application rather than finding all of the instances and then 
going on to the next application. An additional check has been added to fix 
this problem.

******************************* V5.00.21 *********************************

The items fixed in Version 5.00.21 are:

1. When the Uninstall attempted to remove a directory that was the default 
directory for the drive, the delete would fail. Code has been added to check 
for this condition and to change the default directory to the root directory 
and then retry the removal of the directory.

2. Some users have experienced a problem where the WPS _wpSaveImmediate 
method failed while collecting detail information on Objects. An option has 
been added to the Portable Backup Defaults that will allow the user to bypass 
this.

3. Additional information has been added to the UniWatch dump routines to 
improve the diagnosis of problems with the New INI File processing.

4. The New INI File processing dump routines have been upgraded so that 
certain information that would normally be allocated on the stack and thus 
not available to be included in the dump will now be included because 
routines have been added to collect the information when an error occurs.

5. At least two users have had problems where the Cross Reference has stalled 
either near the end of the reprocessing or at the very end of the 
reprocessing. Additional logging code has been added in this area to improve 
the ability to diagnose these kinds of errors.

******************************* V5.00.22 *********************************

The items fixed in Version 5.00.22 are:

1. If a directory that was not part of the Desktop directory structure was 
dropped on the Uninstall or Archive windows, the WPS Object to be deleted, if 
there is one, is incorrectly identified. Additional code has been added to 
fix this problem so that an Uninstall or Archive can start with a directory.

2. When the Cross Reference Build had a problem decoding a file and generated 
a DLL name that was zero length the reporcessing code would go into a loop. 
Code has been added to check for the zero length entry, tell the user that 
that DLL was not handled correctly and ask them to zip and send us the file 
in question.

3. It was possible for the code that did the Reset of the Desktop to use an 
Anchor Block that was not correct for the thread that was doing the Reset and 
this could cause any number of problems with the Reset API. All of the 
routines involved in Resetting the Desktop and controlling the WPS Agent 
Object have been modified, if necessary, so that the Anchor Block for the 
thread doing the work will be used at all times.

4. Additional diagnostic code was added to the area that does the 
reset of the Desktop in order to better understand any problem that might 
occur in this area.

5. The Cross Reference had a problem with a very unusual Win95 DLL that 
appears to have no imported DLL's. However, the code to find the imported 
DLL's did not recognize the invalid DLL names. The routine that processes 
these files has been changed so that it will recognize when it has 
encountered this kind of file and will exit as soon as the code realizes that 
there are no imported DLL's.

6. The Portable Restore would always convert a Warp 3 LaunchPad Object to a 
Warp 4 Toolbar when a Warp 3 Desktop was Restored to a Warp 4 system. 
However, somce users want the LaunchPad on their Warp 4 Desktop so an option 
was added to the Portable Restore dialog that would allow users to specify 
this.

7. In order to better diagnose certain problems a line has been added to the 
error dump that will identify the current directory at the time of the dump.

8. A couple of system error codes have been added to the error dump.

9. The Selected Object Settings and a couple of other WPS functions could not 
be run a second time during the same execution of UniMaint because some areas 
were not initialized correctly the second time and either the wrong objects 
would be displayed or a SYS3175 would result.

10. Some of the Repair functions would attempt to write entries to the Repair 
save ini file even if the flag that says to not save the information is set. 
Additional checks have been added to the incorrect routines so that this will 
no longer happen.

11. Code has been added to the New INI File routines to record the new OS/2 
error code when certain errors occur and the close INI file code has been 
changed so that it will record the INI File handle that it was trying to 
close if it get an error.

12. There were a few places in the Repair where it was not possible to cancel 
the processing by hitting the ESC key and these have been fixed.

13. When the dump information was written to a file then buffer was not 
flushed after each line. Therefore, it was possible to get a problem during 
the production of the dump but not know exactly where the problem occurred. 
Code has been added to flush the write buffer after each line is written to 
the dump file so that these sorts of problems will be easier to diagnose.

14. When the Reinstall attempted to update an OS/2 INI file but the INI file 
had been restored to a different directory a logic error 2311 would result 
because the INI File update routine would look for the file in the incorrect 
directory. The routine has been updated so that it will now look in the 
correct place.

******************************* V5.00.23 *********************************

The items fixed in Version 5.00.23 are:

1. When the Desktop was reset and the code waited for the Desktop to return a 
small area of memory was not freed. Code has been added to insure that the 
memory is freed before the function terminates.

2. The code to reset the desktop and wait for it to be completed still had a 
bug  in it. When the WPS Agent object was terminated the flag that indicates 
that the Agent object is running was set to NO too early in the routine 
because there was a call ot another routine that could set it back on. The 
result of this was that the Agent object would not get initialized after the 
reset of the Desktop and a logic error 1709 would result because there was no 
heap.

3. There were two places in the Uinistall/Reinstall code where the root 
pointer for the file directory tree would not be made null after the memory 
for the tree was freed. This would cause a SYS3175 in the routines that 
formatted the dump information because they would attempt to use a pointer 
that was no long valid. Code has been added to the appropriate routines to 
insure that this will no longer happen.

4. The Popup Menu for the Application Listbox incorrectly identified Ctrl-N 
as the accelerator to copy the application. The correct accelerator key is 
Ctrl-A. The menu has been corrected.

5. An additional check was added to the routine that does the fixup for OS/2 
INI files during the reinstall in order to insure that the file will be found 
in the correct directory and that a 2311 Logic Error will not occur.

******************************* V5.00.24 *********************************

The items fixed in Version 5.00.24 are:

1. It turns out that it is possible to have files associated with Templates 
that are larger than 64k. This means that these files cannot be saved in the 
Portable Backup *.WPS file because this is an INI file. Therefore, this 
information will have to be saved in supplemental files. The changes to 
accomplish this have been added to this version.

2. Because of a problem with one OS/2 DLL code has been added to validate 
that the import information in the DLL is valid and the DLL will be bypassed 
if it is not.

3. Code has been added so that the Title bar and the About box will both 
reference UniSafe as opposed to UniMaint when the safe version is being run.

4. The Repair would report a logic error if the setting of the Object ID for 
an object failed. This has been changed so that the Repair of just that 
object will be reported as having failed.

5. Since it is now possible for the Repair of a specific item to fail, a 
count of failures has been added to the Repair variables and any failure will 
result in a message box to the user when the repair is completed.

6. Since a failure when unlocking a WPS object is not really a serious 
problem the code has been changed to ignore the failure of this WPS method.

7. The Portable Backup routines have been changed so that a failure to get 
the Default Help Panel for an Object will not cause a logic error.

8. OS/2 V2.1 had a problem when the splitpath API was used on just a drive 
and directory. Therefore, code has been added to insure that these situations 
are always handled correctly.

9. In certain situations where a file to be Uninstalled or Archived was in 
the Root Directory for a drive, the Archive would get a 1938 logic error 
because the routines did not correctly set the default directory when the 
directory was the root directory. The routines have been changed to correctly 
handle the root directory situation.

******************************* V5.00.25 *********************************

The items fixed in Version 5.00.25 are:

1. Code was added to the Portable Backup and Restore to handle the WarpCenter 
Trays.

2. The Desktop Restore CMD file still referenced ShiftRun even though it is 
not needed with Warp. The code has been changed so that the file will 
reference using Alt-F1 in place of ShiftRun.

3. The Selected Object Settings would cause a Warp 4 FTP-Host Object to open 
when the detail information was collected. Code has been added to insure that 
this will no longer happen.

4. It was possible to get a logic error of 2711 when resetting the read only 
INI files because the reset routine attempted to write something to the INI 
files that were being reset before the reset was finished. The code has been 
changed so that a logic error will not occur when this condition is 
encountered.

5. Code has been added to the Desktop Backup and Restore routines to backup 
and restore the WarpCenter configuration files if the backup is made on a 
Warp 4 system.

6. The error message in IniClean when it cannot delete a directory has been 
changed so that it no longer says logic error and tells the user that the 
processing is continuing.

7. There was a possible condition in the Reinstall code where the reinstalled 
files would get copied into the default directory, normally the UniMaint 
directory, rather than into the correct target directory. This occurred in 
OS/2 V2.1 and was caused by a problem in how one of the api's handled names 
that did not have a file specified. This function has now been transferred to 
a subroutine that will check for and fix the error introduced by the problem 
api.

8. An option has been added to the EA defaults that allows users to ignore 
errors in thew DosFindFirst/Next API's. This will allow users to identify any 
directories or files that have problems with the EAs so that they can delete 
or move the information. If logging is turned on the errors will be logged to 
the log file.

******************************* V5.00.26 *********************************

The items fixed in Version 5.00.26 are:

1. The code that is in UniCheck to check the WarpCenter Config Files has been 
added to UniWatch so that users using UniWatch at boot time do not need to 
use UniCheck.

2. There were a couple of places in the Restore WarpCenter routine where 
additional logging was required in order to identify where a problem 
occurred.

3. It was possible to not get a dump file when a SYS3175 occured because a 
dump file had not been selected or because the current dump file could not be 
opened. The code has been modified so that a default dump file name will be 
used if either of these conditions occur. This means that the dump will not 
get recorded only if a fila by the name of unimaint.dmp cannot be opened in 
the default directory.

4. If one of the WarpCenter CFG files had the Read Only Attribute turned on 
when UniMaint tried to Restore it a logic error 1769 would result because the 
file could not be opened for write. Code has been added to check for this 
and remove the Read Only Attribute before an attempt is made to write to the 
file.

5. If the Exists menu in the Portable Restore window was set to anything 
other than Update when the WarpCenter was restored problems would result. If 
the setting was Replace, a SYS3175 would occur in SOM.DLL. This has been 
fixed by forcing the Exists Setting to Update when the WarpCenter is 
restored.

6. When certain file related library api's such as fopen, fclose, fread and 
fwrite are called and OS/2 encounters some sort of error the api will not 
return the OS/2 error code it returns a generic error code that simply says 
that OS/2 had a problem. Code has been added in a number of places to be sure 
to capture the OS/2 error code in these case so that the actual error 
condition can be determined.

7. There were situations where objects would not get restored because the 
incorrect index was used to determine how many Objects were in the Portable 
Restore window. This was not a problem before the WarpCenter because the 
count of objects and the count of lines in the window were the same. However, 
since some of the WarpCenter objects are not placed in the window using the 
count of lines would cause the last few objects in the table to not be 
processed.

8. It was possible to get duplicate DOS queue names when multiple runs of 
UniMaint were done and certain kinds of functions are done. The code has been 
changed to add the thread id to the queue name so that each time will be 
unique. Code has also been added to the termination routine to close any open 
DOS Queue before the program ends.

9. If the Desktop Restore CMD file could not find the generation the user 
specified the user was notified. However, after hitting any key to get out, 
the user simply saw the same message again. It was necessary to hit 
Ctrl-Break to get out of the CMD file. The code has been changed so that the 
Desktop Restore will simply exit after the user has been told about the error 
and hits any key.

10. It turns out that the TCPIP WPS Class DLL's often get registered with a 
double backslash in the path information. This creates a problem in a number 
of areas so code has been added to look for the condition and remove the 
second backslash.

11. In order to improve the logging of problems the subroutine that splits 
path and filenames will now log both the original information and the 
results.

12. IniCopy could get a SYS3175 at termination time because a memory area was 
freed twice. This has been fixed.

13. Additional logging has been added to UniWatch to log out the exact 
parameters used when the OS/2 Command Processor or IniCopy are run.

14. If the New INI File Processing flag is set in UniMaint then UniWatch will 
now add the item to the IniCopy parameter line that will insure that IniCopy 
also use the New INI File processing routines.

15. There was a bug in the routine that initialized the WPS Settings 
Structure that did not surface until the V3.0 compiler was installed. The 
problem would cause a SYS3175 when the structure was being initialized 
because an attempt was made to modify a constant string. The code has been 
changed to insure that the string being changed is not in constant storage.

16. The WPS Setting structure was not getting completely dumped when the 
variable dump was written to a file because of a problem in corrdination 
between the actual dump routine and the write routine. The dump routine was 
changed so that all of the information will now get dumped.

17. The WPS Settings structure was getting completely dumped even when it had 
not been used so code was added to insure that it is only dumped when 
something has been changed.

18. It was possible to get a SYS3175 in the WPS Settings routine because an 
area of memory was freed twice. One of the routines have been changed so that 
the memory will only be freed a single time.

19. Because so many users were attempting to turn things like logging on 
using the Tools Icons...which does not work because these settings do not 
persist from one run of UniMaint to the next...code has been added to warn 
the user anytime they do this.

******************************* V5.00.27 *********************************

The items fixed in Version 5.00.27 are:

1. There was a problem introduced in V5.00.26 that caused a logic error 626 
when UniMaint attempted to run an external program, such as IniCopy. This was 
caused by an inconsistent DOS Queue Name and the code has been modified so 
that this problem will no longer occur.

2. The code that saves Shadow information was treating the WarpCenter Tray 
objects as normal shadows. This code was changed so that the object being
shadowed is not informed that this shadow exists so that the shadow will not 
get restored when the base object is restored. The reason for this is that we 
only want to restore the Warpcenter Shadow Objects when we are actually 
resotring the Warpcenter itself.

3. The code that assigns Object ID's always added the Object ID Assigned 
message because an 'else' was missing and has been added.

4. If one of the DOCK.CFG files was missing from the WarpCenter directory the 
Restore of the WarpCenter would fail because the restore code could not reset 
the read only attribute on a file which does not exist. The code has been 
changed to ignore a file not found return from the API that resets the read 
only attribute.

5. Once a type of tool was specified on the UniMaint parameter line it was 
not possible to use and of the /SET options because the code checked for a 
tool being set before it checked for the /SET string. The code has been 
modified so that parameters can now be set after a toll has been defined.

6. There were some problems in the area of Shadows that were caused by the 
changes necessary for the WarpCenter and these have been fixed.

******************************* V5.00.28 *********************************

The items fixed in Version 5.00.28 are:

1. The restore of the Desktop and a few other things would fail with a logic 
error of 65635 because a function call inserted in V5.00.25 had it's return 
code checked incorrectly. The return code check has been modified so that 
this error will no longer occur.

2. New code that was introduced to improve the way that the Portable Restore 
found the WPS Pointer and Handle for an object would fail before the Restore 
attempted to create the Object with FAIL_IF_EXISTS. The code has been changed 
to not report an error but to continue to process the Object and only fail if 
all attempts to create the Object fail.

3. The logging for the Portable Backup and Restore was upgraded to insure 
that both a start and completed messages is logged for each of the major 
backup and restore functions. This will make it easier to determine whether 
the backup or restore code was completely finished with a particular object.

4. The logging for the Portable Restore was upgraded to log each of the 
pieces of information as it is being restored so that it will be easier to 
determine exactly which piece of information caused a problem in case of some 
sort of problem.

5. It was possible to set the Portable Restore menu items in a way that the 
user could be asked if they wanted each of the entries in the WarpCenter 
Trays restored because it was possible that the object already existed. Since 
all of the entries in the Trays should be restored when the WarpCenter is 
restored, the user should never be asked this question. Code has been added 
to bypass this question when restoring the entries in the WarpCenter Trays.

6. Code was added to set a default diagnostic filename when diagnostic mode 
is turned on.

7. Many users were confused by the two sets of radio buttons in the dialogs 
to modify some of the settings which had only two values. Users would try to 
use the Current radio buttons to change the settings rather than the correct 
Changed radio buttons. When the Current radio buttons did not change anything 
many of the users would simply give up. Code has been added to popup a 
message box anytime the user clicks on the Current radiobuttons telling the 
user that they need to use the Changed radio buttons to actually modify the 
data.

8. The code used to detect whether UniWatch is running has been upgraded to 
check the process id and thread id as well as the window handle in order to 
insure that the information in the UniMaint control file is correct.

9. Since the Desktop Backup will fail when it attempts to update the UniWatch 
control file if UniWatch is running, since UniWatch will have the read only 
attribute set for the file, code has been added to the Desktop Backup routine 
to check to see if UniWatch is actually running and to warn the user to 
either close UniWatch or do the Desktop Backup from the UniWatch menu.

10. The Portable Backup of the WarpCenter would not save the second and 
subsequent copies of the information on Objects that were on more than one 
WarpCenter tray. Therefore, Objects would be missing on some of the trays 
when the restore was done. This has been fixed.

******************************* V5.00.29 *********************************

The items fixed in Version 5.00.29 are:

1. Doing the size calcualtion and creating the container lines for the Cross 
Reference can sometimes take more than a minute and there is no evidence 
that progress is being made. Code has been added to the routines involved so 
that the user will see progress information as the various functions are 
performed.

2. The Portable Restore of objects in the WarpCenter trays and the general 
restore of shadow objects could have a problem if there is more than one 
shadow of a specific object so code has been added to check for this 
condition and make sure shadows and WarpCenter tray objects are restored 
correctly.

3. The Portable Backup Defaults Dialog was incorrect becasue the Restore Warp 
4 Launchpad item was on top of the Ask If Populate Fails item because the 
dialog definition was incorrect. The dialog definition has been corrected.

4. Warp 4 will not allow the Templates directory to be deleted therefore the 
Desktop Restore has been changed so that it will take this into account and 
correctly restore all of the directories and files along with their Extended 
Attributes.

******************************* V5.00.30 *********************************

The items fixed in Version 5.00.30 are:

1. There are situations where one of the routines in IniCopy will return a 
non zero return code if an application is found with no keys or a key is 
found with no values. However, this was also generating an IniCopy error log 
and this is incorrect. The code has been modified so that the error log will 
no longer get created.

2. The Change All Paths checkbox in the Desktop Defaults did not work. This 
problem started when the Wizards were introduced and additional code has now 
been added to insure that all of the appropriate fields and controls are 
updated when this box is checked.

3. The Printer Repair would sometimes not find a Printer because the test 
that was inserted to identify entries in PM_Abstract:Objects was looking for 
a 4 byte binary value in a situation where there was only a 2 byte value. The 
code has been changed so that the test will now use the correct length.

4. The Portable Backup would not backup more than 4 LaunchPad Drawers because 
that was set as the maximum number of drawers. This maximum number has been 
increased so that all LaunchPad drawers will get backed up.

5. The detail restore routines in the Portable Restore could cause a problem 
with the LaunchPad because WPS handles from the source Desktop could get 
restored and these handles do not apply to the target Desktop. Checks have 
been added to insure that this does not occur.

6. When the LaunchPad is restored it is possible for objects to be placed in 
the wrong drawer if there is an empty drawer. An additional check has been 
added to insure that this will not happen.

******************************* V5.00.31 *********************************

The items fixed in Version 5.00.31 are:

1. If the user had the New INI File processing activated for UniMaint this 
setting was not set for the run of IniCopy that is used for the Desktop 
Backup because the appropriate parameter was not added to the IniCopy 
parameter line. Code has been added to fix this.

2. It was not possible to use the Copy menu items if the current INI file was 
an EA type of file because the standard API's cannot process it and it would 
not get opened using the new INI file API's because the read only attribute 
was on. Code has been added to close the current INI file during the Copy or 
Move operation so that the file can be opened correctly by IniCopy.

3. The logging of drag and drop information was not adequate for problems 
with windows such as the Uninstall window and others so this facility has 
been upgraded to insure that adequate diagnostics are collected.

4. Object with WPS Class of WPProgramGroup were not treated as Folders by the 
Portable Backup and Restore. This was fixed by increasing the range of 
classes considered Folders by one.

******************************* V5.00.32 *********************************

The items fixed in Version 5.00.32 are:

1. There were a number of problems in the logging of drag and drop 
information and messages that made it impossible to coordinate the 
information between the two files. Code has been added to add date and time 
stamps to the drag drop logging file and a sequence number to all of the logs 
so that it will be easy to see the sequence of events across different 
logging files.

******************************* V5.00.33 *********************************

The items fixed in Version 5.00.33 are:

1. The Drag and Drop routines would always report an item count of 1 no 
matter what the actual count was. The code has been changed to report the 
actual count of items.

2. The Drag and Drop code would not allow a drop if the item count was not 1. 
This has been changed to allow any drop where the item count is more than 
zero. However, only the first item is actually processed.

3. Additional checks have been added to the Portable Restore because at least 
one situation has been found where an attempt was made to restore sort 
information to a program object. The original problem was caused by a problem 
in the Portable Backup file but the fix needs to be inserted in the restore 
so that older files can be used.

******************************* V5.00.34 *********************************

The items fixed in Version 5.00.34 are:

1. It turns out in Warp 4 it is possible to have two WPS Objects with the 
same title in the same Folder as long as the two objects are not the same WPS 
class. This creates a problem for the Portable Backup because the name of the 
Folder along with the Title of the Object is used as the Application name in 
the Portable Backup *.WPS file. Additional code has been added to handle this 
possibility.

2. An option was added that will allow the user to specify that the WPS Agent 
Object should not be started under any circumstance. This is needed in 
situations where a Repair is needed by WPS either will not run or is 
seriously corrupted.

******************************* V5.00.35 *********************************

The items fixed in Version 5.00.35 are:

1. It was possible to get a Logic Error 1709 when attempting to do a Portable 
Restore on a DOS or Windows Object because code to log some information was 
placed so that the result of a compare would be affected by whether the 
logging was active or not. The log code has been moved so that these objects 
will get Restored correctly.

******************************* V5.00.36 *********************************

The items fixed in Version 5.00.36 are:

1. The Reinstall routines would modify all of the DEVICE=, BASEDEV=, DEVINFO= 
and a few others in the CONFIG.SYS file if one of these lines was removed 
from the CONFIG.SYS. This is clearly incorrect and the correct action is to 
simply add the full line to the CONFIG.SYS and the routines have been 
modified to do that.

2. The Uninstall would attempt to delete a file or directory that was on a 
CD-ROM device and this is clearly not possible. An additional check has been 
added to insure that this is not attempted.

3. The Reinstall would allow the user to specify a new directory that was on 
a CD-ROM drive and this is incorrect because it is not possible to write to a 
CD-ROM drive. Additional code has been added to check for this and the user 
will now be informed and given a chance to select a new directory.

4. The Portable Restore would sometimes remove the Backup Description from the 
Portable Restore generation being used because the EAs were not preserved 
when the file was updated. Code has been added to the New INI File processing 
close routines to insure that any EAs on an existing INI file are preserved.

5. The Repair would get a logic error 1109 if a DLL had a name that was 
greater than 8.3 and it did not have any path information associated with it 
because the ERROR_FILENAME_EXCED_RANGE error code was not included in the 
format error list. The code has been modified to handle this error.

******************************* V5.00.37 *********************************

The items fixed in Version 5.00.37 are:

1. Code was added to allow for the Tools error message to contain additional 
information unique to the tool being invoked so that the error would be more 
clear.

2. There was no dump routine for the EA Control structure so one was added.

3. Code was added to allow all of the EA functions to be done from the 
parameter line by adding the parameters /EASUB, /EASOURCE@, /EATARGET@ and 
/EAAUTO.

4. An option was added to the EA Defaults which will allow the date and time 
information for files and directories to be saved and restored when the EAs 
are saved and restored.

******************************* V5.00.38 *********************************

The items fixed in Version 5.00.38 are:

1. There were a number of areas where the EAs were obtained for a file or 
directory but the EA information would not get logged to the EA Log file. New 
routines have been added so that the logging will now get done in all cases.

2. If the Portable Restore attempts to Restore an Object that is in a 
different location on the target Desktop than it was on the source Desktop 
and the Object has an ObjectID the Bypass Existing Objects setting does not 
work and the existing Object is replaced rather than bypassed. An additional 
check has been added to the Portable Restore to fix this problem.

******************************* V5.00.39 *********************************

The items fixed in Version 5.00.39 are:

1. The Dump of the WPS Object structure was modified to make it more 
complete.

2. There was a problem in the Windows INI File processing where an area of 
memory could get released and then an attempt would be made to use it. This 
would normally cause a logic error of 2604 but could cause others. The code 
has been modified so that the memory will not be used after it is released.

3. The error reporting in the AcsPostMessage routine was improved.

4. The ability to delete an Object was added to the Desktop and Selected 
Object Settings.

5. The dump of the structures for the New INI File processing would only dump 
the last one because some break commands were missing. The break commands 
have been added so that all of the information will get dumped.

6. When the New INI File processing code opened an existing INI file it did 
not check for certain types of corruption and would therefore open an invalid 
INI file which could not be updated. Additional checks have been added to the 
New INI File processing open routines to fix this problem.

7. An item would get duplicated on the Key Value Popup Menu for EA files. 
Additional checks have been added to fix this problem.

8. The accelerator keys had a conflict between some of the popup menus and 
the standard menus. A few of the keys, all of them are Alt-Ctrl combinations, 
have been changed to remove the conflict.

9. An item has been added to the Key Name and Key Value popup menus that will 
decode the structures for PM_Abstract:Objects and the .CLASSINFO EA. This is 
designed primarily to help with diagnosing INI file and EA problems.

10. There was a problem in the modifications to the Uninstall code to check 
for a CD-ROM drive. There was one place where the check was reversed. The 
code has been changed so that the check is correct.

******************************* V5.00.40 *********************************

The items fixed in Version 5.00.40 are:

1. There were some situations where dialogs would stay visible long enough 
for a user to terminate them twice. This could cause a number of problems so 
code has been added to be sure that this does not happen.

2. Code was added so that the stack information recorded to the uniexcpt.log 
file will also be written to the dump file so that users will not have to 
send two files when they get a SYS3175 error.

3. There was one place where it was possible for UniMaint to go into a loop 
at startup time while trying unsuccessfully to start the WPS Agent Object. 
Code has been added to insure that the maximum delay will be 15 seconds.

4. If UniMaint was closed while in a minimized or maximized state it would 
not come up in this state when it was restarted. Code has been added so that 
UniMaint will always come back up the same way it was closed.

5. There were some problems during the initialization of UniMaint on Warp 4 
using FP3. Some of the API's in the initialization were changed from 
WinSendMsg to WinPostMsg in order to address this problem.

******************************* V5.00.41 *********************************

The items fixed in Version 5.00.41 are:

1. If a timeout occurred waiting for a WPS method to complete it was not 
logged to the diagnostic file even if diagnostics were enabled. Code has been 
added to be sure this event is logged.

2. The code that creates the Portable Backup did not disable hard DOS errors 
and could therefore get hung up on something like a drive that was not ready. 
Code has been added to be sure that these popup messages are disabled during 
the Portable Backup.

******************************* V5.00.42 *********************************

The items fixed in Version 5.00.42 are:

1. It is possible for one or more of the Portable Backup files to have the 
read only attribute left on if there is a problem with the backup. This will 
cause future attempts to run the Portable Backup to fail with Logic Error 
1705 because these files cannot be renamed. Code has been added to remove the 
read only attribute from these files before the rename is attempted.

2. The dump of the Find Structures did not identify which Find the various 
entries were used for so the name of each structure has been added.

3. There was no logging during the startup activities for the Repair Execute 
so it was not possible to determine where an error was occurring when 
something went wrong in this area. Additional logging lines have been added 
to record the various startup activities.

******************************* V5.00.43 *********************************

The items fixed in Version 5.00.43 are:

1. There was one place where it was possible, although extrememly unlikely, 
that an attempt would be made to open the Repair Logging file when the name 
of the file had not been filled in.

2. Code was added to the routine that logs lines to a logging file that will 
allow this routine to also display a message box for each line. This is 
activated by passing UniMaint a commnad line parameter of /#.

******************************* V5.00.44 *********************************

The items fixed in Version 5.00.44 are:

1. Code was added to allow the WPS diagnostic mode to be activated via the 
passed parameter line using /( followed by the full filename without the 
extension. The code adds DIA and AGT as the two extensions.

2. Code was added to allow the Repair routines to report the hard errors that 
are normally bypassed. This is designed to help diagnose problems that do 
things such as clobber the Repair Logging file.

******************************* V5.00.45 *********************************

The items fixed in Version 5.00.45 are:

1. Code has been added to the Repair Options to allow the user to force 
specific drive letters to Network, CD-Rom, Virtual or Removable drives so 
that they will be treated as this type of drive by the Repair even if the 
drive is not in use or not ready.

2. In order to get past certain problems with OS/2 API's which will not work 
correctly under specific conditions a new Repair, Delete Ignored File 
Handles, has been added to allow the user to delete bad File Handles without 
having the problem API's called against the problem drives, directories and 
files.

3. The help for the individual Repair entries would always display the 
general Repair Help instead of the Help for the specific Repair. The code has 
been modified so the Help for the specific Repair will be displayed when that 
is the selected Repair and the drop down list has the focus.

4. The Desktop and Portable Backup and Restore for Warp 4 has been modified 
so that it will run without having the WarpCenter installed. Previously this 
condition would cause a logic error 1773.This fix had to be applied to 
UniMaint, UniCheck and UniWatch because UniCheck and UniWatch insure that the 
WarpCenter files are usable.

5. If the name of the DLL that supports the WarpCenter had lower case letters 
in it then the DLL would not be found because the name was being compared 
with an all upper case name. This would cause a logic error 1773 in previous 
versions and would have caused this version to bypass the WarpCenter. Code 
has been added to insure that both the source and target strings are upper 
case then the compare is made. This fix had to be applied to both UniMaint 
and UniWatch.

******************************* V5.00.46 *********************************

The items fixed in Version 5.00.46 are:

1. Code was added to AcsTest to record and report the OS/2 Version.

2. Added Acs_SOMFree call to AccssWPS so that certain things can be freed.

3. Code was added to allow the WPS Agent to return it's WPS Class and Object 
Pointer.

4. AcsTest and AcsMaint were modified so that the first calll to a WPS method 
would be done against the WPS Agent Object and be a very simply method in 
order to establish that the basic WPS stuff is working.

******************************* V5.00.47 *********************************

The items fixed in Version 5.00.47 are:

1. AcsTest was modified in a minor way to make it more like AcsMaint in order 
to diagnose a very unusual WPS/SOM problem that one user is having.

******************************* V5.00.48 *********************************

The items fixed in Version 5.00.48 are:

1. Additional code was added to the exception processing routines to list all 
of the loaded modules when an exception occurs.

2. Some logging was added to the routine that finds the Desktop.

3. The routine that finds the Desktop was modified so that it will remember 
the Desktop once it finds it so the search will not be done twice and code 
was added to look for and use the SET DESKTOP= entry in the CONFIG.SYS file 
if it is there.

4. The startup of the WPS Agent in AcsTest was changed to use a restart 
setting of ON rather than OFF.

******************************* V5.00.49 *********************************

The items fixed in Version 5.00.49 are:

1. The code that starts the WPS Agent Object was modified to make an 
immediate test to be sure that basic WPS things can be done. This was done in 
response to a problem where an attempt to get the WPObject somID would fail. 
Since AcsTest was working the extra things that AcsTest did at startup were 
duplicated in UniMaint.

******************************* V5.00.50 *********************************

The items fixed in Version 5.00.50 are:

1. A minor change was added to the Repair code to make the handling of 
MMShadow and SCShadow objects a little faster.

2. Code was added to AcsTest to allow it to test the OS/2 API's for finding 
files using the PATH, DPATH and LIBPATH.

******************************* V5.00.51 *********************************

The items fixed in Version 5.00.51 are:

1. The code to check for the EXE and startup directories in the Repair 
Objects routines did not first check to see if the drive for the EXE or 
directory was set to be ignored or report only. This caused some API's to be 
called against drives that caused the same problem described in 1. for 
V5.00.45.

******************************* V5.00.52 *********************************

The items fixed in Version 5.00.52 are:

1. The diagnostic message created when the WPS class deregistration failed 
did not include the PM error so it has been updated.

2. It was possible to get into a loop if inconsistent information was 
returned from some OS/2 API's in the WPS Agent Object common code so 
additional checks were added to insure that this does not happen.

3. The version was added to the UniWatch initialization logging message.

4. The logging in the UniWatch routines that check to see if the daily 
triggers have been exceeded has been upgraded.

******************************* V5.00.53 *********************************

The items fixed in Version 5.00.53 are:

1. Code has been added to display the individual items the Repair is working 
on as it fills the tables.

2. Code was added to display the identity of each of the Repair items as it 
is examined to be placed in the various tables.

3. It was possible that UniWatch would not do the daily hour check once the 
user got past the end of a year. This has been fixed by adding a check for 
end of year conditions.

4. AcsTest was changed back to using restart of NO because YES caused a 
problem when the AcsAgent Class was not registered at all.

5. Code was added to AcsTest to allow the initial restart to be set to NO.

6. AcsTest was changed so that if the initial attempt to create the Object 
failed it would be tried again with restart set to the opposite setting.

************************* V5.00.54 - 1 Oct 97 ***************************

The items fixed in Version 5.00.54 are:

1. A number of the Selected Object Settings Set menu items would fail with a 
SYS3175 if a display had not been done before the Set item because an attempt 
would be made to modify an area of constant storage. This problem had been 
fixed for the Display menu items but was not fixed for the Set menu items. 
The Display fix has now been implmented in the Set routines as well.

************************* V5.00.55 - 29 Oct 97 ***************************

The items fixed in Version 5.00.55 are:

1. Additional logging code was added to the routine that tests whether a 
specific object responds to a specific method. Since the expected result is 
that the object does respond any results where the object does not respond 
will be logged.

2. Additional tests have been added to insure that objects respond to 
specific methods even some of the methods for the WPObject class.

************************* V5.00.56 - 4 Nov 97 ***************************

The items fixed in Version 5.00.56 are:

1. Code was added to support the ">" parameter which allows the user to 
specify a method and, optionally, as many object titles as needed that should 
bypass the method.

************************* V5.00.57 - 4 Nov 97 ***************************

The items fixed in Version 5.00.57 are:

1. When doing an Uninstall and a WPS Object that was associated with a file 
to be deleted could not be deleted a logic error 1926 would occur. However, 
this should be handled that same way that a problem deleting the file is 
handled ie., the user is informed and the Uninstall continues. Code has been 
added to do this.

************************* V5.00.58 - 12 Jan 98 ***************************

The items fixed in Version 5.00.58 are:

1. The Explain did not correctly explain the PM_SystemFonts entry in the 
OS2.INI file and has been corrected.

2. There was a place in the Repair where an 1108 logic error could happen 
while repairing the wps stuff. An additional check has been added so this 
will no longer happen.

************************* V5.00.59 - 25 Apr 98 ****************************

The items fixed in Version 5.00.59 are:

1. If the Repair was using test files in place of the normal System and User 
INI files then the files would not get closed even if they were changed. 

2. If the PM API that is supposed to find file based WPS objects does not 
find an object but the Portable Restore does find it and the Object is the 
parent folder for an Object being restored the restore will fail. In theory 
this should never happen but it does. Since the folder can be found an extra 
check was added for just this situation so that the folder and the objects in 
the folder will get restored.

************************* V5.00.60 - 26 Apr 98 ****************************

The items fixed in Version 5.00.60 are:

1. It was possible for the Repair File Handles code to attempt to write an 
entry into the OS2SYS.INI file that was exactly 64k bytes. This will cause an 
error because of how the length is kept. The code has been modified so that 
the maximum size that any of the code will attempt to write is 64k - 1.

************************* V5.00.61 - 11 May 98 ****************************

The items fixed in Version 5.00.61 are:

1. When UniWatch logging was turned on it still did not log the difference 
counts that it found at the end of each check cycle so one of the logging 
lines was moved so that this information will become a part of the normal 
logging rather than just logged when a problem has occurred.

2. The Find had a bug where it would get a not found if the key name that was 
found at one point in the search was a name that was a sub string of another 
earlier key name because the search included a parameter that said that 
substrings were okay. The substring parameter has been removed so this will 
no longer happen.

************************* V5.00.62 - 11 May 98 ****************************

The items fixed in Version 5.00.62 are:

1. There was at least one situation where the Uninstall could not terminate 
because the working flag was incorrectly set to true.

2. Code was added to allow the flag that bypasses errors for save immediate 
to also bypass errors posted during the detail save operations.

************************* V5.00.63 - 26 Sep 98 ****************************

The items fixed in Version 5.00.63 are:

1. The Cross Reference was not correctly decoding some of the NT 32 bit EXE 
and DLL files.

************************* V5.00.64 - 07 Nov 98 ****************************

The items fixed in Version 5.00.64 are:

1. It was possible to get a sys3175 when selecting write after a second 
uninstall because a static variable was freed but the pointer was not made 
null causing the second uninstall to attempt to use memory that had been 
freed.

************************* V5.00.65 - 4 Feb 99 ****************************

The items fixed in Version 5.00.65 are:

1. WPS has started to stored the handles of shadowed objects in the os2.ini 
file using a handle that is actually a transient object handle. The code that 
looks for shadowed objects was changed so that when it gets one of these 
handles it will try it in both the abstract object and file object ranges and 
only mark the shadowed object as not found when both of these fail.

2. In the code to Repair the WPS entries there was one place where it was 
possible for a pointer to be null and the code to load the information into 
the Repair Display window did not check for the null value.

************************* V5.10.00 - 22 Aug 99 ****************************

The items fixed in Version 5.10.00 are:

1. The copy Group did not work because an attempt was made to use an ini file 
after it was closed.

2. Changes were made to reflect that Jim Read now owns UniMaint.

************************* V5.10.01 - 30 Aug 99 ****************************

The items fixed in Version 5.10.01 are:

1. There was a problem with starting UniWatch when the window was minimized 
so the sequence of events was changed.

************************* V5.10.02 - 20 Sep 99 ****************************

The items fixed in Version 5.10.02 are:

1. There was still a problem with UniWatch and saving the size to the INI 
file so additional code was added to make sure the save was done anytime the 
size was different from the saved size.

2. The Automatic Backup Wizard was changed to make sure that the user knows 
that they need to set Automatic Backup Option on in the Desktop Backup and do 
an initial Desktop Backup from UniMaint to create the initial AutoCtrl.INI 
file.

************************* V5.10.03 - 10 Oct 99 ****************************

The items fixed in Version 5.10.03 are:

1. It was possible to delete objects in UniSafe so code was added to prevent 
it.

2. There was one rare condition that would result in a Timer not being 
stopped when using one of the Copy or Move items on the Action menu and this 
has been fixed.

3. The default error log filename in IniCopy was changed to IniCopy.err so 
that the default for this file would be the same whether it was run on it's 
own or by UniMaint.

4. Code was added to eliminate the logic errors that occur when an attempt is 
made to allocate a block of memory that is zero bytes long.

5. When an error occurred during the switching of the User and/or System INI 
files an error message was displayed but there was no way to cause a dump of 
the variables so code was added to supply this facility.

************************* V5.10.04 - 23 Dec 99 ****************************

The items fixed in Version 5.10.04 are:

1. When the Desktop Backup was run from the UniMaint menu, UniMaint was 
installed on a FAT drive and OS/2 was installed on an HPFS drive then the 
backup did not actually backup the Desktop directory but did not give an 
error message.

************************* V5.10.05 - 21 Jan 00 ****************************

The items fixed in Version 5.10.05 are:

1. DeskMan/2 has started to create objects in the 0x50000 range which is 
illegal but a number of things had to be adjusted to handle these objects.

2. Because the invalid DM/2 object can be used as the desktop, additional 
code has been added to use the WPS methods to find the Desktop if we can get 
the Agent Object started.

3. There were a couple of places in the repair where a loop could occur if 
there were certain very rare types of errors.

4. A default value will now be added to the Desktop Backup Description.

************************* V5.10.06 - 24 Jan 00 ****************************

The items fixed in Version 5.10.06 are:

1. Desktops with the invalid DM/2 Objects still had a Repair problem because 
Shadowed object could not be found.

2. Desktops with DM/2 Objects did not have Startup Objects identified 
correctly.

3. There was a potential problem with the Open File that would cause a 
sys3175.

************************* V5.10.07 - 27 Jan 00 ****************************

The items fixed in Version 5.10.07 are:

1. The code to assign Object ID's did not work correctly on Desktops with the 
invalid DM/2 WPS objects.

2. There was a bug in the code to find the Desktop using the WPS methods 
because a memory area was freed twice.

************************* V5.10.08 - 1 Feb 00 *****************************

The items fixed in Version 5.10.08 are:

1. There was a problem that caused a sys3175 when an attempt was made to 
write the results of an ini filecompare.

2. A second write when using the Compare INI files would get a 1010 logic 
error.

3. If the Uninstall Defaults was opened and then an Uninstall attempted the 
dialog that said you cannot do the uninstall until the current function is 
completed was displayed.

4. Even thought the OK button would effectively cancel the Uninstall, a 
Cancel button was added to the dialog so that the user could be sure they 
were ending the Uninstall without changing anything.

************************* V5.10.09 - 1 Feb 00 *****************************

The items fixed in Version 5.10.09 are:

1. There were situations during the Uninstall, Archive and Reinstall where 
the Cancel would cause a logic error.

************************* V5.10.10 - 6 Feb 00 *****************************

The items fixed in Version 5.10.10 are:

1. Code was added in a number of places to make sure that the user could get 
control of the desktop during functions that used a lot of cpu cycles.

************************* V5.10.11 - 10 Feb 00 *****************************

The items fixed in Version 5.10.11 are:

1. The code to allow the user to gain control of the desktop was placed in 
too many locations and some of the functions started taking too much time to 
complete.

2. There was a place in the Uninstall where it was possible to lock up the PM 
processing thread while the cross reference table was being built. The code 
was moved to another thread so this will no longer happen.

3. The default for the Loop Delay was changed from 1 to 0.

4. Code was added to insure that the WinWait api is not even called when the 
Loop Delay is zero.

5. There was a problem in the Wizard validate loops in several dialogs that 
could cause a sys3175 abend.

6. Code was added to each dialog to record messages if we are writing them to 
a file so it will be easier to diagnose message related problems.

7. The routine in the Cross Reference which does the qsort compare was 
modified so that it will give up the processor every 1000 compares so that 
messages can be processed.

************************* V5.10.12 - 27 Feb 00 *****************************

The items fixed in Version 5.10.12 are:

1. In order to preserve the ability to delay thing enough to allow the user 
to get control and also not make some of the functions take too long 
intervals were created that control how many times a loop needs to execute 
before the wait api is called.

2. There was still a problem with the Wizard Validate. If it got called 
during the execution of a Wizard rather than at the end of a dialog then the 
same variable was used for loop control and the results of the validation and 
this could cause an endless loop.

3. The routine that looks for a file that does not contain drive and path 
information should treat a general failure as a file not found rather than a 
logic error.

4. Additional diagnostic code was added to the routine that renames or 
duplicates ini file applications or keys.

5. The New INI File read and write routines were changed to allow zero length 
reads and writes.

6. There were still some problems with the loop delay counts so some of the 
delays were removed and the defaults were changed.

************************* V5.10.13 - 20 Apr 00 *****************************

The items fixed in Version 5.10.13 are:

1. The supplemental information was improved in some of the uninstall 
routines.

2. The function that executes the command processor has to be modified so 
that the environment needed can be selected by the caller.

3. A warning was added if and when a user changed and of the delay 
parameters.

************************* V5.10.14 - 23 Apr 00 *****************************

The items fixed in Version 5.10.14 are:

1. The Loop Defaults were reset to 1000 for both the option and the xref 
counts and the delay was set to zero.

2. Code was added to force the delay to 1 during the Uninstall and the xref 
count was divided by 200 for the Uninstall except that it cannto go below 5.

3. Code was added warning users if they make any changes to the counts or 
delay that it could have very serious performance considerations.

4. One of the controls in the Cross Reference Defaults dialog could not be 
selected using the mouse because of a problem in the length of the text field 
that contained the header information.

************************* V5.10.15 - 24 Apr 00 *****************************

The items fixed in Version 5.10.15 are:

1. Not all of the places that needed to have the delay stuff adjusted we 
changed so the adjustment did not normally work.

2. Code was added to log and dump the old and new values when the delay 
information was adjusted.

************************* V5.10.16 - 5 Jul 00 *****************************

The items fixed in Version 5.10.16 are:

1. When the Repair was done using one of the Tools objects the Desktop was 
not reset even if the option to do the reset was set to yes.

2. When there was a problem switching the System and User INI files one of 
the OS2*.INI files could be opened using New INI File Processing and that is 
invalid.

3. If a value that appears in one of the wizards had a validation routine it 
was not validated correctly when the wizard was run because the validation 
was done after the dialog in question was dismissed.

4. Code was added so that the first run of the version would force the Do Not 
Save Repaired Items flag to ON.

5. The logging of the New INI File processing structures was improved so that 
it would bbe easier to diagnose problems.

6. Additional controls were added to insure that the User and System INI 
files are never opened using New INI File Porcessing.

************************* V5.10.17 - 6 Jul 00 *****************************

The items fixed in Version 5.10.17 are:

1. Additional diagnostic code was added to the routine that updates the file 
handle entries in the OS2SYS.INI file.

2. There was a possibility of the repair handles trying to write a zero 
length BLOCKxx entry which would cause an INI Write error.

************************* V5.10.18 - 05 Sep 00 *****************************

The items fixed in Version 5.10.18 are:

1. An item was added to the Options Dailog that will force safe mode.

2. Additional diagnostic code was placed in the Portable Restore 
Initialization.

************************* V5.10.19 - 11 Oct 00 *****************************

The items fixed in Version 5.10.19 are:

1. Code was added for the Agressive Handle Repair.

************************* V5.10.20 - 20 Oct 00 *****************************

The items fixed in Version 5.10.20 are:

1. Code was added to UniWatch to capture system abends so that diagnostic 
information could be logged.

************************* V5.10.21 - 4 Nov 00 *****************************

The items fixed in Version 5.10.21 are:

1. It was possible for the hwndFrame value to be null during the 
initialization which could cause a sys3175 error.

************************* V5.10.22 - 26 Dec 00 *****************************

The items fixed in Version 5.10.22 are:

1. The sequence of how things are dump when we get an exception was changed 
to insure that we get as much data as possible.

2. Code was added to UniWatch to track a couple additional messages.

3. Additional logging was added to UniWatch in an attempt to diagnose an 
intermittent startup problem.

4. There was a bug in the routine that checks the size of a New INI File when 
both the application and key names were null. A 1 was returned and the return 
should be zero.

5. When UniWatch was started without an existing control file the resulting 
window was not correctly painted and some of the triggers were not reset.

6. If UniWatch could not find the UniMaint INI file then it would not report 
an error but would attempt to use a null INI file handle.

7. Code was added to the New INI File Processing routines to do logging.

8. Code was added to the routines that toggle the various diagnostic modes 
from the about dialog to allow for more user control.

************************* V5.10.23 - 31 Dec 00 *****************************

The items fixed in Version 5.10.23 are:

1. There were some routines that called the error termination routine without 
filling in the message area.

2. One of the UniWatch routines would not set the return to good when testing 
the timers and not finding a problem.

3. If there was a parameter error in UniWatch it was not reported correctly.

4. A number of changes were made to the logging in UniWatch to improve the 
intialization logging and improve the identification of the failing routine.

************************* V5.10.24 - 01 Nov 01 *****************************

The items fixed in Version 5.10.24 are:

1. UniWatch would not run without either a unimaint.ini file or an entry in
the config.sys file because of a problem introduced in V5.10.22. The problem
was fixed by setting the default unimaint ini file to the handle of the
os2.ini file.

2. A new Repair that allows users to delete valid Templates was added.

3. The name of the file to use to write the contents of the Uninstall/Archive
Application listbox was incorrect.

4. The WPS repair was modified to add code to delete any entry in the
templates section of the os2.ini file if the referenced file is not on the
current desktop.

************************* V5.10.25 - 25 Nov 01 *****************************

The items fixed in Version 5.10.25 are:

1. The code for the delete templates repair was removed because what was
needed was added to the normal WPS repair.

2. Code was added to allow all of the directories for all of the file and
directories to be changed with a single transaction which was added to the
file menu.

3. If there is a unimaint= entry in the config.sys file then the directory
from that entry will be used as the default directory for all files and
directories.

************************* V5.10.26 - 15 Feb 02 *****************************

The items fixed in Version 5.10.26 are:

1. The routine to modify the master directory incorrectly added the new
directory to the root name for the portable backup.

2. The dump of the repair reason for some of the repairs was incorrect.

3. When all of the local repairs were done some of the repair structures were
getting reset prematurely.

4. Code was added to always force a refill of the structures when a repair
all local is done because one section of the repair can affect other
sections.

************************* V5.10.27 - 23 Dec 03 *****************************

The items fixed in Version 5.10.27 are:

1. Some additional exception types were added to the handleException routine.

2. If one of the WarpCenter DOCKxx files were zero length the Portable Backup
would not complete.

3. The restore of the WarpCenter was adjusted to handle a tray with no
objects.

4. The agressive repair would delete valid entries when it was run more than
one time without exiting from the Repair dialog.


************************* V5.10.28 - 25 Dec 03 *****************************

The items fixed in Version 5.10.28 are:

1. When the Agressive Repair is done more than one time with a Repair Type of
Do Selected either the list of items in the Repair window is bad or an Access
Viloation occurs.


************************* V5.10.32 - 12 Feb 04 *****************************

The items fixed in Version 5.10.32 are:

1. Fixed a hang in portable backup. It was hanging on long strings in
e/xCenter objects. These objects are now bypassed in a portable backup.


