Application Compatibility Toolkit

The Application Compatibility Toolkit for Windows XP contains documents and tools to help Windows customers diagnose and resolve application compatibility issues. Below are links to the resources available on this toolkit.

Documents Included in the Application Compatibility Toolkit

Designed for Windows XP Specification

This specification helps software developers by defining the minimum requirements for applications to operate on Windows XP. Microsoft developed this specification to identify applications that run successfully and provide a quality user experience on the Windows XP Professional and Windows XP Home Edition operating systems.

Common Application Compatibility Issues

This white paper explains the most common compatibility issues applications encounter when installing and running on Windows XP.

Technology Overview

This article describes some of the application compatibility technologies, such as Compatibility Modes, Application Help and Compatibility Fixes, and how to use them to adapt applications to run better on Windows XP.

Windows Applications Exploratory Test Procedure

This document describes a procedure for testing the functionality and stability of a software application for the purpose of verifying that it runs on Windows XP or Windows 2000.

Windows Compatibility Checklist

This document describes a series of tests to verify application compatibility for applications on Windows XP and Windows 2000. The list is not comprehensive and is intended as a starting point for testing applications.

Tools Included in the Application Compatibility Toolkit Version 2.0

The following tools are included:

  • Application Verifier (AppVerifier)
  • Compatibility Administration Tool (CompatAdmin)
  • Global Flags Editor (GFlags)
  • Page Heap (PageHeap)
  • Quick Fix Application (QFixApp)

Note

  • This is a preliminary document and may be changed substantially prior to final commercial release. This document is provided for informational purposes only and Microsoft makes no warranties, either express or implied, in this document. Information in this document, including URL and other Internet Web site references, is subject to change without notice. The entire risk of the use or the results of the use of this document remains with the user.

This documentation assumes you are already familiar with the Windows operating system. For more general information about Windows, including keyboard equivalents to menu and mouse actions, see Windows Help.

Printing topics

When you print from HTML Help, a dialog box opens asking whether you want to print the selected topic or to print the selected heading and all subtopics. Printing the selected topic is recommended. If you print a heading and subtopics, you may encounter error messages and special formatting will be lost, but the topics will still print.


Appverif.exe: Application Verifier
Overview | Notes | UI

This GUI tool aids developers and IT managers in testing applications on the Windows XP Professional platform. AppVerifier focuses on two specific categories of tests: tests difficult to perform due to vendor system limitations and subtle problems difficult to diagnose on Windows XP Professional. Its purpose is to help vendors write stable applications on Windows XP Professional and future versions of the Windows operating system.

Important

  • Many of the tests in AppVerifier are designed to crash the application being tested because AppVerifier creates an environment where bugs are more likely to be discovered. When a bug occurs, the application generates an exception and exits. This is a sign that the developer needs to run the application under a debugger with AppVerifier enabled in order to get more information about what is happening to cause the problem.

Corresponding UI

AppVerifier provides its own user interface.

Concepts

Applications that worked on earlier versions of Windows may fail to function properly on Windows XP. There are several reasons that this may happen:

  • The application refuses to run when Windows reports new, higher operating system version numbers. Often the application will work well on the new version of Windows if the user can get past this block in the application.
  • The application calls older versions of Win32 API functions that return unexpected values on computers with large amounts of resources such as disk free space.
  • The application expects older formats of Windows data.
  • The application expects user information, such as personal and temporary folders, to be in specific locations or specific formats.

System Requirements

The following are the system requirements for AppVerifier:

  • Windows XP Home Edition
  • Windows XP Professional

Files Required

  • Appverif.exe


AppVerifier Notes
Overview | Notes | UI

AppVerifier Modes of Operation

AppVerifier features two modes of operation: debugging and logging. Developers familiar with software development and testing use the debugging mode to troubleshoot applications. Developers and network administrators use the logging mode to generate a log of issues encountered by an application. In this log each issue is paired with a specific remedy.

Regardless of the mode in which it is run, AppVerifier is not an automated test tool. You must exercise all functions of the application you are testing. AppVerifier will only aid you in pinpointing a problem once it is encountered during your testing process.

AppVerifier and SafeDisk

SafeDisk is used by many gaming and software companies to prevent hackers from getting around copyright violations by preventing the program from running with a debugger attached. This means that if you are testing one of these programs, you may not be able to test it using AppVerifier.

Using AppVerifier

To use AppVerifier:

  1. Add an application to the list by clicking Add. When an application is added to the list, AppVerifier is globally enabled for it. This means that whether the application is run from AppVerifier, a short cut, or the command line the selected AppVerifier tests will be applied.
  2. Select the appropriate tests from the Test settings list.
  3. Start your application and exercise it. AppVerifier does not perform the tests of your binary; it only monitors and reports suspicious activity that it detects while you perform tests.

    Note

    You do not need to click Run button to exercising your application. It is only provided as a short cut. You can always run the application as you normally would run it.

  4. Once testing has completed, click View Logs to see the log entries that were generated.
  5. Remove the application from AppVerifier when testing is complete.

AppVerifier Features

AppVerifier offers the following features:

  • Integration of PageHeap and GFlags: AppVerifier wraps the functionality of PageHeap and GFlags in a simplified UI. You can enable page heap checking with a single mouse click.
  • Error Logging: AppVerifier places debug information into a log file that can be viewed and manipulated through the AppVerifier UI. This is helpful for non-technical users who do not know how to use a debugger.
  • Application Compatibility Testing: The tests written by the AppCompat team monitor for the most common application problems, including incorrect version checking, bad registry usage, and hard-coded file paths.
  • Extensible Test Architecture: Internal development teams can create their own tests by leveraging AppCompat's shim architecture. AppCompat will package approved submissions for distribution.

Expected Application Behavior While Using AppVerifier

  • The application may run more slowly than usual. This happens because of test overhead.
  • The application may not launch for any of the following reasons:
    • The application may fail a test during launch. Try unchecking a few of the tests and try to launch the application again.
    • The application may not work with a debugger attached.
  • The application may crash and prompt to have a debugger attached. Some tests will crash the application if a fault is detected.

Sharing AppVerifier Logs

If you want to share an AppVerifier log with another person, click Export Log in the Verifier Log window. This will create a text file that you can send to other individuals. These people can view the log in any program that allows you to view a text file or they can use View External Log to examine the exported log from AppVerifier.


AppVerifier UI
Overview | Notes | UI

Main AppVerifier UI

The AppVerifier window is made up of three parts: Applications to be verified, Test settings, and Test setting descriptions.

Applications to be verified

The Applications to be verified list remains empty until you click Add to add the name of an executable to be verified.

Test settings

The Test settings list also remains empty until you add at least one executable to the Applications to be verified list. Once an executable has been added, the available test settings appear in the Test settings list.

Test setting descriptions

If you would like to see descriptions of the displayed test settings, select one from the Test settings list. The description will be listed here. You need not check the test setting for the description to be displayed.

AppVerifier Options

AppVerifier offers four options:

  • Clear session log when test settings change. Use this option to tell AppVerifier to automatically clear a session log for the specified executable when an application is added or removed or has one of its test settings changed.
  • Break in the debugger for each log event. Use this option if you are attaching to a debugger and you want any event that would show up in the log to cause the application to break in a debugger. This is meant primarily for advanced users who are familiar with using a debugger and who want to see exactly where problems are occuring in their code.
  • Use full page heap (heavy memory usage). Use this option to help find heap-related bugs and corruption anywhere in your executable. For more information about the use of full page heap, see the explanation of Full-Page Heap in the Choosing a Method to Investigate Heap Block Corruptions section of PageHeap Notes.
  • Use the AppVerifier debugger to get crash logs. Use this option to allow AppVerifier to attempt to analyze crashes on its own and dump output into the log rather than require someone to launch a debugger. This option is meant for less experienced users who are not familiar with using a debugger.

AppVerifier Log

When you have run an application using AppVerifier, you can view the output in the AppVerifier Log window. You can also use this window to view logs that have been exported using Export Log.

The logs are shown in tree form. Each log is made up of expandable items displaying information about the executable's run. This information can be as simple as a notification that the listed executable started and stopped, but it can also include more detailed information about specific Microsoft Windows requirements that are violated by the executable. Expanding an item shows a list of violations that fall under that item's category. Click an item to see more information on resolving the problem in the Possible solutions text box.

Important

  • The log is not a complete list of issues found. Some tests log data, some throw exceptions (in other words, they crash the application intentionally), and some change the applications environment and rely on the tester to verify that the application continues to function correctly.


Compatadmin.exe: Compatibility Administration Tool
Overview | Notes | UI | Examples

This GUI tool provides an interface for browsing and editing the Windows XP Professional compatibility fix database as well as creating custom .sdb fixes that can be deployed to other users. CompatAdmin also provides a search capability that will locate fixed applications on a system or networked drives.

Each phase of changing access control can take a day or longer to complete and verify, and requires significant amounts of system resources and administrator time.

You can use CompatAdmin to test and apply one or more of the fixes available in the operating system, although QFixApp offers a superior interface for testing and applying fixes.

Corresponding UI

CompatAdmin provides its own user interface. For more information, see CompatAdmin UI.

Concepts

Applications that worked on earlier versions of Windows may fail to function properly on Windows XP Professional. There are several reasons that this may happen:

  • The application refuses to run when Windows reports new, higher operating system version numbers. Often the application will work well on the new version of Windows if the user can get past this block in the application.
  • The application calls older versions of Win32 API functions that return unexpected values on computers with large amounts of resources, such as disk free space.
  • The application expects older formats of Windows data.
  • The application expects user information, such as personal and temporary folders, to be in specific locations or specific formats.

System Requirements

The following are the system requirements for CompatAdmin:

  • Windows XP Home Edition
  • Windows XP Professional

File Required

  • Compatadmin.exe
  • Sdbinst.exe (in the %windir%\System32 folder)


CompatAdmin Notes
Overview | Notes | UI | Examples

Working with the System Database

The main CompatAdmin interface provides a control for viewing and browsing applications with compatibility fixes in the Windows XP Professional system database. This view is always displayed in the upper left pane (System Database pane) of the CompatAdmin window.

The system compatibility database is an integral part of the Windows XP Professional operating system, ensuring out-of-box compatibility for hundreds of Windows applications. This database and the corresponding application entries are protected by the operating system.

Microsoft may update the system database in future Service Pack releases or Windows Update packages.

Limiting the Entries Displayed in the Database Window

There are hundreds of applications in the system database, each using one of several possible compatibility technologies. The number of entries and information can make it difficult to browse and work with the system database control.

Use the View menu options to limit the system entries that are displayed.

Disabling System Fixes

The fixes listed in the system database cannot be deleted because they are part of the protected database on every Windows XP Professional system; however, the entries in the system database can be disabled for the local system. Disabling an entry ensures that corresponding system fixes are not applied when the application is run. This option is useful when testing an application that is already in the system fix database, or when specifying alternate fixes for the application.

To disable an entry:

  • Select the application from the System Database pane, or from the Custom Database pane of the CompatAdmin window.
  • The Details pane displays information on each of the compatibility solutions applied to this application.
  • Right-click the specific application fix in the Details pane, and select Disable Entry from the menu.
  • The entry should now have a red exclamation mark, verifying that it has been disabled.
  • Disabling and enabling entries is immediate, and there is no need to save this type of change. Once the selection has been changed, the operating system will behave accordingly when running the application.

Notes

  • Use caution when disabling application entries in the system database. Depending on the application, as well as the fixes that were applied, running without these fixes may cause the application to exhibit new problems or to fail.
  • You cannot deploy disabled entries to other computers. Entries are disabled only on the local computer for testing purposes.

Enabling Disabled System Fixes

To enable an entry:

  • Select the application from the System Database pane, or from the Custom Database pane of the CompatAdmin window.
  • The Details pane on the right side of the CompatAdmin window displays information on each of the compatibility solutions applied to this application.
  • Right-click the specific application fix in the Details pane, and select Enable Entry from the menu.
  • The entry should no longer have a red exclamation mark.
  • Disabling and enabling entries is immediate, and there is no need to save this type of change. Once the selection has been changed, the operating system will behave accordingly when running the application.

Searching for Applications

CompatAdmin provides a tool that searches local and connected computer drives for applications that use compatibility fixes. This includes applications with entries in the system database, as well as other custom databases that may be installed.

To search for applications that use compatibility fixes:

  1. Select Search for Fixes from the View menu.
  2. In the Drives to search dialog box, check the drives to profile.
  3. Click Search to begin the search.
  4. Click Cancel at any time to end the search.

CompatAdmin displays your search results. This lists all applications found in the search path with their corresponding compatibility entries. If you want to get more information about the specific fixes applied to an application in the list, look in the system database.

To view specific fixes applied to an application:

  • Select Database Viewer from the View menu. This returns you to the main CompatAdmin window.
  • Select the application for which you want fix information in the System pane.
  • Browse the fix information in the Details pane.

Creating and Maintaining Custom Databases

One of the most useful aspects of CompatAdmin is the support it provides for creating and maintaining custom compatibility databases. The current custom database is displayed in the lower left pane of the Main Database view (Custom Database pane). When CompatAdmin starts, the custom database area is opened with a new, empty database.

Use the Database menu options to add or remove fixes from the custom database. The menu options may only be enabled if you have already selected the custom database window and/or a valid entry.

Creating a Custom Fix Database

Once you have identified and tested fixes for your target applications, you can use CompatAdmin to create a custom fix database. You can create a custom fix database that contains applications fixed with compatibility modes, as well as applications fixed with specific compatibility fixes.

Creating a New Custom Fix Database

To create a new custom fix database:

  1. If you have a custom fix database open, select File|New .
  2. Select Database|Change Database name . Once you have changed the database name, it will be displayed at the top of the Custom Database pane. If Change Database name is disabled, click the Custom Database pane of the window.
  3. Select File|Save and name your .sdb file. You are now ready to add fixes to your custom database.

Adding a Compatibility Mode to a Custom Fix Database

To create a custom fix database with compatibility modes:

  1. Select Database|Create Application Fix . The Create an application fix dialog box is displayed.
  2. Select Apply Compatibility Mode, and click Next.
  3. Enter the name of the application for which you will specify a compatibility mode and click Next.
  4. Enter the name of the file to which the compatibility mode will be applied. You can type the name of the file, or use Browse to locate it.
  5. Select the compatibility mode to apply from the drop down list and click Next.
  6. Click Add file to select files that will help to identify the specified file on target computers. Choose files that are associated with your application that will be installed in the same related location. For example, choose an .hlp file that resides in the same directory as the .exe file. Try to uniquely identify your file without choosing an unnecessarily high number of matching files.

    Notes

    • Do not choose files in the \System32 folder to act as matching files for your application. Microsoft system files are protected and cannot be used for file matching.
    • Using Auto Generate will also create matching file information, but may generate much more information than you need. If you use this option, use Remove to delete any matching files that are not necessary to uniquely identify your .exe file on the target computer.
  7. Click Next when you have selected all necessary matching files.
  8. If you want to test the fix, click Test Run. Otherwise, click Finish.

Adding Specific Compatibility Fixes to a Custom Fix Database

Once you have used QFixApp to determine what application fixes you need to include in your .sdb file, you are ready to create your custom fix database. Repeat the following steps for each application that the .sdb will fix.

To create a custom fix database with specific compatibility fixes:

  1. Select Database|Create Application Fix . The Create an application fix dialog box is displayed.
  2. Select Apply specific compatibility fix, and click Next.
  3. Enter the name of the application for which you will specify fixes, and click Next.
  4. Enter the name of the file to which the fixes will be applied. You can type the name of the file, or use Browse to locate it.
  5. Click Next.
  6. Check the boxes for the fixes that need to be applied to the selected executable. If you need additional information on a fix, select it and read the description in the View Description textbox. If you need to start over after you have already started checking fixes, click Clear all to remove all checks.
  7. When you have checked all necessary fixes for the specified file, click Next.
  8. Click Add file to select files that will help to identify the specified file on target computers. Choose files that are associated with your application that will be installed in the same related location. For example, choose an .hlp file that resides in the same directory as the .exe file. Try to uniquely identify your file without choosing an unnecessarily high number of matching files.

    Notes

    • Do not choose files in the \System32 folder to act as matching files for your application. Microsoft system files are protected and cannot be used for file matching.
    • Using Auto Generate will also create matching file information, but may generate much more information than you need. If you use this option, use Remove to delete any matching files that are not necessary to uniquely identify your .exe file on the target computer.
  9. Click Next when you have selected all necessary matching files.
  10. If you want to test the fix, click Test Run. Otherwise, click Finish.

Maintaining a Custom Fix Database

Once you have created a custom fix database, you can add, edit matching file information, delete, and test the fixes it contains. For information on adding fixes to a custom database, see Adding a Compatibility Mode to a Custom Fix Database or Adding Specific Compatibility Fixes to a Custom Fix Database.

To edit matching file information for an application in a custom database:

  1. Select the application in the Custom Database pane.
  2. Right-click the file for which you want to add matching file information in the Details pane and select Add Matching Information.
  3. Click Add file to select files that will help to identify the specified file on target computers. Choose files that are associated with your application that will be installed in the same related location. For example, choose an .hlp file that resides in the same directory as the .exe file. Try to uniquely identify your file without choosing an unnecessarily high number of matching files.

    Notes

    • Do not choose files in the \System32 folder to act as matching files for your application. Microsoft system files are protected and cannot be used for file matching.
    • Using Auto Generate will also create matching file information, but may generate much more information than you need. If you use this option, use Remove to delete any matching files that are not necessary to uniquely identify your .exe file on the target computer.
  4. Click OK when you have finished editing matching file information.

To remove an application fix from a custom database:

  1. Select the application in the Custom Database pane.
  2. Select Database|Remove Application Fix . The application fix is deleted from the .sdb file.

To test an application fix in a custom database:

  1. Select the application in the Custom Database pane.
  2. Right-click the fix in the Details pane, and select Test Run.

Custom Databases and GUIDs

Each custom database has a unique GUID assigned to it. Renaming an exsiting custom database does not change the database's GUID. In order to generate a unique GUID, you must create a new custom database.

If you want to create a new version of an existing custom database, open that custom database and use Database|Change Database name to change the name. For example, your original custom database was called "ABC Co Fix V 1" and you change the name to "ABC Co Fix V 1.1." In this case, when you deploy the fix, other computers will correctly apply the updated fixes because the GUID for both of these files is identical.

However, if you create a "template" file that contains custom compatibility modes that you commonly use and just rename it to create new .sdb files, this will not produce reliable .sdb files for deployment to others in your company.

For example, your "template" custom database is called "Template" and you want to create two new custom databases based on it: "AcctApps" and "OperationsApps." For the most part, these two new files will be sent to different groups, but there is some overlap between those groups. If you create these files by opening "Template" and renaming it, both "AcctApps" and "OperationsApps" will have the same GUID. For those people who use only one .sdb file, this is not a large issue; however, for those people who need to apply both .sdb files, a conflict occurs. When one of the people from the latter group runs the first .sdb file, all the fixes are applied to his or her computer. When the second file is run, however, since it has the same GUID as the first file, fixes from the first file will be removed and replaced by fixes from the second file. Only if both "AcctApps" and "OperationsApps" have unique GUIDs will both .sdb files be properly applied without interfering with each other.

Deploying Custom Fix Databases

Once you establish which fixes are necessary for an application to work well on Windows XP Professional, use CompatAdmin to help deploy those fixes to other machines.

To deploy fixes using CompatAdmin:

  • Identify and test fixes for the target applications. It is recommended that you use QFixApp to determine what fixes are necessary for an application.
  • Create a custom database file(s) with the intended fixes (*.sdb).
  • Deliver the .sdb file to the destination Windows XP Professional machine(s).
  • Run the .sdb file on the machine(s). It will automatically install and add the fix information to the registry of the destination machine(s).

Create Custom Database (.sdb) Files for Targets

CompatAdmin creates a custom compatibility fix database in which multiple application and fixes can be specified. Once a database has been built with the fixes to deploy, simply save the custom database. This creates the database .sdb file, which can be installed on any Windows XP Professional system.

Deliver Files to the Destination Machines

Deploy a copy of the .sdb file to each machine that requires the fixes. There are a number of ways to accomplish this:

  • Copy the .sdb file to appropriate machines.
  • Make the .sdb file available on network share points.
  • Include the .sdb file in an installation program.

Add Fix Information to the Destination Machines

Installation of the custom database file is as simple as running the .sdb file on the Windows XP Professional target machine. The operating system performs all of the necessary actions to register the new fix database as well as creating an entry in Add or Remove Programs.

Note

  • A path with spaces will fail to install correctly on the target Windows XP Professional machine. This is a problem in the Windows XP Professional Beta 2 release and will be fixed in the final version. The workaround is to run sdbinst.exe from the directory where the .sdb file is located.

    For example, an .sdb file named myfix.sdb is saved to the desktop. Using the following command in the Run dialog will fail:

    sdbinst myfix.sdb

    In order for this command to run successfully, open a console window, change directories to the desktop, and then type the following at the command line:

    sdbinst myfix.sdb


CompatAdmin UI
Overview | Notes | UI | Examples

Main CompatAdmin Window

The main CompatAdmin window is made up of three panes: the System Database pane in the upper left corner, the Custom Database pane in the lower left corner, and the Details pane on the right side of the window.

System Database Pane

This pane allows you to view and browse applications with compatibility fixes in the Windows XP Professional system database.

Custom Database Pane

This pane allows you to create, edit, and rename custom database files (.sdb).

Details Pane

This pane allows you to view, enable, and disable existing fixes in the system database. You can also use this pane to view, enable, disable, and add matching file info, and to test run existing fixes in custom databases.

CompatAdmin Search Results Window (Search View)

This window is displayed when you search for fixes. The following details are listed for each application that has an application fix applied to it:

Heading | Description
Affected File | The name of the file to which the fix was applied.
Application | The name of the application to which the fix was applied.
Action | A general description of the fix that has been applied to the file.
Database | The name of the database where the fix lives (either the system database or a custom database).
Global Setting | The global status of the fix for any computer using the specified database. A fix from a custom database can be enabled or disabled at the global level. Fixes from the system database cannot be disabled on a global level.
Local Setting | The local status of the fix for any computer using the specified database. Fixes from both custom databases and the system database can be enabled or disabled at the local level.


CompatAdmin Examples
Overview | Notes | UI | Examples

Example 1: Create a Custom Fix Database

The following example uses CompatAdmin to create a custom .sdb containing the fixes for Demoapp.exe. It takes the fix information determined in Example 1: Fix a Windows 95 Application from QFixApp and adds it to a new custom fix database.

Select Database|Change Database name . Name the database "MyCustomDatabase." The database name is now displayed at the top of the Custom Database pane.

Select File|Save and name your .sdb file Mydb.sdb. Click Save.

You are ready to add the fixes for DemoApp to the custom .sdb file. Select Database|Create Application Fix . The Create an application fix dialog is displayed.

Type DemoApp as the name of the application, and then click Next.

Click Browse and locate Demoapp.exe on your computer. Select Demoapp.exe and click OK.

You determined what fixes you want to apply to Demoapp.exe by using QFixApp. Select the following fixes that were determined necessary to Demoapp.exe: CorrectFilePaths, EmulateCreateProcess, EmulateGetCommandLine, EmulateGetDiskFreeSpace, IgnoreLoadLibrary, MapMemoryB0000, and Win95VersionLie.

Click Next.

Click Add file, and select Demoapp.hlp that is in the same directory as Demoapp.exe. Click OK.

We already tested the fixes with DemoApp using QFixApp, so click Finish.

Select File|Save to save the addition to your custom fix database.

Example 2: Deploy a Custom Fix Database

The following example uses the Mydb.sdb file that you created in Example 1: Create a Custom Fix Database. Now that you are ready to deploy the fixes to other users, copy Mydb.sdb to a shared volume in your company.

Create an email message notifying users that the fix is available. Include a link to the file in the email message. When a user clicks on the link, the .sdb file will automatically update the target computer with the fixes contained in Mydb.sdb.


Gflags.exe: Global Flags Editor
Overview | Notes | Syntax | UI | Examples | Flags

Gflags.exe enables and disables advanced internal system diagnostics and troubleshooting features on computers running Windows 2000 and Windows XP Professional. GFlags is designed as a debugging tool for application developers. It is most often used to turn on indicators that other tools track, count, and log.

You can run Gflags from the command line or use its graphical user interface dialog box.

You can use GFlags to activate the following debugging features:

  • Registry. Set systemwide debugging features for all Windows processes. These settings are stored in the registry. They take effect when you restart the system and remain effective until you change them.
  • Kernel mode settings. Set debugging features for this session. These settings are effective immediately, but are lost when the system stops. The settings affect processes started after this command completes.
  • Image file settings. Set debugging features for a particular program. These settings are stored in the registry. They take effect when you restart the program and remain effective until you change them.
  • Debugger. Specify that a particular program always runs in a debugger. This setting is stored in the registry. It is effective immediately and remains effective until you change it. (This feature is available only from the Gflags dialog box.)
  • Launch. Run a program with the specified debugging settings. The debugging settings are effective until the program stops. (This feature is available only from the Gflags dialog box.)

Caution

  • Use GFlags only in consultation with Microsoft Product Support Services. It is an optional component provided solely for troubleshooting purposes. Incorrect use of this tool can degrade system performance or prevent the system from starting, requiring you to reinstall the operating system.

File Required

  • Gflags.exe


Gflags Notes
Overview | Notes | Syntax | UI | Examples | Flags

General Information

  • To display the Gflags dialog box, at the command line, type Gflags (with no parameters).
  • To set flags in the registry or in kernel mode, you must be a member of the Administrators group on the computer. However, users with at least Guest account access can launch a program from the Gflags dialog box.
  • Gflags system-level registry settings appear in the registry immediately, but do not take effect until you restart the system.
  • Gflags image file registry settings appear in the registry immediately, but do not take effect until you restart the process.
  • The debugger and launch features in the Gflags dialog box are program specific. You can only set them on one image file at a time.
  • For information about kernel special pool, see the Windows Driver Development Kit (DDKs).
  • For information about debuggers and to obtain debuggers and documentation, see the Microsoft Windows 2000 Debugging Tools Kit, which is available from the Microsoft Windows Driver Development Kits (DDK) (http://go.microsoft.com/fwlink/?LinkId=1651) Web site.

Flag Details

  • To clear all flags, set the flag to -FFFFFFFF. Setting the flag to 0 adds 0 to the current flag value.
  • When you set the flags for an image file to 0xFFFFFFFF, Windows clears all flags and deletes the GlobalFlag entry in the image file subkey. The subkey is retained.

Dialog Box and Command Line

You can run Gflags by using its handy dialog box or from the command line. Most features are available in both forms, but the following features are only available from the dialog box:

  • Launch. Start a program using the specified flags.
  • Run the program in a debugger.
  • Kernel Special Pool Tag.

Registry Information

Debugging settings saved between sessions are stored in the registry. You can use the registry APIs, Regedit, or Reg.exe to query or change these values. The following table lists the types of settings and where they are stored in the registry.

Systemwide debugging values. ("Registry") | HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\GlobalFlag
Program-specific debugging values. ("Image file") | HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageFileName\GlobalFlag
Maximum stack trace capture size (maxdepth) | HKLM\System\CurrentControlSet\Control\Session Manager\MaxStackTraceDepth
Create user mode stack trace database (ust, 0x1000) for an image file | Windows adds the image file name to the value of the USTEnabled registry entry (HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\USTEnabled).
Kernel Special Pool Tags | HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management\PoolTag
Verify Start / Verify End | HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management\PoolTagOverruns. The Verify Start option sets the value to 0. The Verify End option sets the value to 1.
Debugger for an image file | HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageFileName\Debugger


Gflags Syntax
Overview | Notes | Syntax | UI | Examples | Flags

One Step gflags [/r [flag [flag...]] [maxdepth StackSize]] | [/k [flag [flag...]] | [/i ImageFile [flag][flag...]]

Parameters

  • Typing gflags without parameters opens the Gflags dialog box.
flag
A three-letter abbreviation (flag-abbr) or hexadecimal value (flag-hex) that represents a debugging feature. The abbreviations and hexadecimal values are listed in the Global Flags Table.

Use one of the following flag formats:

Format | Description
{+ | -}flag-abbr | Sets (+) or clears (-) the flag represented by the flag abbreviation. Without a plus (+) or minus (-) symbol, the command has no effect.
[+ | -]flag-hex | Adds (+) or subtracts (-) the hexadecimal value of a flag. A flag is set when its value is included in the sum. Add (+) is the default. Enter a hexadecimal value (without 0x) that represents a single flag or enter the sum of hexadecimal values for multiple flags.
/r [flag [flag...]] [maxdepth StackSize]]
Registry. View and change systemwide debugging settings stored in the registry. These settings take effect when you restart the system and remain effective until you change them.
Parameter | Description
None | Displays the systemwide flags set in the registry.
flag | Sets or clears systemwide flags stored in the registry.
maxdepth StackSize | Specifies the maximum size of the stack trace in decimal units. The default is 16.
/k [flag [flag...]
Kernel mode settings. View and change debugging settings for this session. These settings are effective immediately, but are lost when the system stops. The settings affect processes started after this command completes.
Parameter | Description
None | Displays flags set for the current session.
flag | Sets or clears flags for the current session.
/i ImageFile [flag [flag...]
Image file settings. View and change debugging settings for a particular process. These settings are stored in the registry. These settings are effective for all new instances of this process. They remain effective until you change them.
Parameter | Description
None | Displays the flags for the specified image file.
flag | Sets or clears flags for the specified image file.

Global Flags Table

The following table lists the flags that Gflags changes, the hexadecimal value and abbreviation for each flag, and the destination (R for registry, K for kernel, I for image file) in which the flag is valid.

For a detailed description of each flag, see the Gflags Flag Reference.

Caution

  • The symbolic name of each flag is provided for reference only. Because symbolic names change, they are not a reliable identifier of a global flag.
Description | Symbolic name | Hexadecimal Value | Abbreviation | Destination
Buffer DbgPrint output | FLG_DISABLE_DBGPRINT | 0x08000000 | ddp | R,K
Create kernel mode stack trace database | FLG_KERNEL_STACK_TRACE_DB | 0x2000 | kst | R, K
Create user mode stack trace database | FLG_USER_STACK_TRACE_DB | 0x1000 | ust | R,K,I
Debug initial command | FLG_DEBUG_INITIAL_COMMAND | 0x4 | dic | R,K
Debug WINLOGON | FLG_DEBUG_INITIAL_COMMAND_EX | 0x04000000 | dwl | R, K
Disable heap coalesce on free | FLG_HEAP_DISABLE_COALESCING | 0x00200000 | dhc | R,K,I
Disable paging of kernel stacks | FLG_DISABLE_PAGE_KERNEL_STACKS | 0x80000 | dps | R,K
Disable protected DLL verification | FLG_DISABLE_PROTDLLS | 0x80000000 | dpd | R,K,I
Disable stack extension | FLG_DISABLE_STACK_EXTENSION | 0x10000 | dse | I
Early critical section event creation | FLG_CRITSEC_EVENT_CREATION | 0x10000000 | cse | R,K,I
Enable application verifier | FLG_APPLICATION_VERIFIER | 0x100 | vrf | R,K,I
Enable bad handles detection | FLG_ENABLE_HANDLE_EXCEPTIONS | 0x40000000 | bhd | R,K
Enable close exception | FLG_ENABLE_CLOSE_EXCEPTIONS | 0x00400000 | ece | R,K
Enable debugging of Win32 subsystem | FLG_ENABLE_CSRDEBUG | 0x20000 | d32 | R,K
Enable exception logging | FLG_ENABLE_EXCEPTION_LOGGING | 0x00800000 | eel | R,K
Enable heap free checking | FLG_HEAP_ENABLE_FREE_CHECK | 0x20 | hfc | R,K,I
Enable heap parameter checking | FLG_HEAP_VALIDATE_PARAMETERS | 0x40 | hpc | R,K,I
Enable heap tagging | FLG_HEAP_ENABLE_TAGGING | 0x800 | htg | R,K,I
Enable heap tagging by DLL | FLG_HEAP_ENABLE_TAG_BY_DLL | 0x8000 | htd | R,K,I
Enable heap tail checking | FLG_HEAP_ENABLE_TAIL_CHECK | 0x10 | htc | R,K,I
Enable heap validation on call | FLG_HEAP_VALIDATE_ALL | 0x80 | hvc | R,K,I
Enable loading of kernel debugger symbols | FLG_ENABLE_KDEBUG_SYMBOL_LOAD | 0x40000 | ksl | R,K
Enable object handle type tagging | FLG_ENABLE_HANDLE_TYPE_TAGGING | 0x01000000 | eot | R,K
Enable page heap | FLG_HEAP_PAGE_ALLOCS | 0x02000000 | hpa | R,K,I
Enable pool tagging | FLG_POOL_ENABLE_TAGGING | 0x400 | ptg | R,K
Enable system critical breaks | FLG_ENABLE_SYSTEM_CRIT_BREAKS | 0x100000 | scb | R, K, I
Load DLLs top-down (Win64 only) | FLG_LDR_TOP_DOWN | 0x20000000 | ltd | R, K, I
Maintain a list of objects for each type | FLG_MAINTAIN_OBJECT_TYPELIST | 0x4000 | otl | R,K
Show loader snaps | FLG_SHOW_LDR_SNAPS | 0x2 | sls | R,K,I
Stop on exception | FLG_STOP_ON_EXCEPTION | 0x1 | soe | R,K,I
Stop on hung GUI | FLG_STOP_ON_HUNG_GUI | 0x8 | shg | K


Gflags Flag Reference
Overview | Notes | Syntax | UI | Examples | Flags

Caution

  • The symbolic name of each flag is provided for reference only. Because symbolic names change, they are not a reliable identifier of a global flag.

Buffer DbgPrint output

Abbreviation | ddp
Hexadecimal value | 0x08000000
Symbolic Name | FLG_DISABLE_DBGPRINT
Destination | Systemwide registry entry, kernel mode

Suppresses debugger output from DbgPrint(), DbgPrintEx(), KdPrint(), and KdPrintEx() calls. When this output is suppressed, it does not automatically appear in the kernel debugger. However, it can still be accessed by using the !dbgprint debugger extension.

Create kernel mode stack trace database

Abbreviation | kst
Hexadecimal value | 0x2000
Symbolic Name | FLG_KERNEL_STACK_TRACE_DB
Destination | Systemwide registry entry, kernel mode

Creates a run-time stack trace database of kernel operations, such as resource objects and object management operations. This feature works only when using a "checked build," that is, an internal debugging build of the operating system.

Note

  • This flag is available as a kernel mode setting, but it is not effective in kernel mode because the kernel is already started.

Create user mode stack trace database

Abbreviation | ust
Hexadecimal value | 0x1000
Symbolic Name | FLG_USER_STACK_TRACE_DB
Destination | Systemwide registry entry, kernel mode, image file registry entry

Creates a run-time stack trace database in the address space of a particular process (image file mode) or all processes (systemwide).

Debug initial command

Abbreviation | dic
Hexadecimal value | 0x4
Symbolic Name | FLG_DEBUG_INITIAL_COMMAND
Destination | Systemwide registry entry, kernel mode

Runs Winlogon in the Windows Symbolic Debugger (Ntsd.exe) with the -d option, which directs its output to the kernel debugger console.

This flag is used for debugging the Client Server Run-time Subsystem (CSRSS), Winlogon.exe, and the Winlogon child processes.

See also: Debug Winlogon, Enable debugging of Win32 subsystem.

Debug Winlogon

Abbreviation | dwl
Hexadecimal value | 0x04000000
Symbolic Name | FLG_DEBUG_INITIAL_COMMAND_EX
Destination | Systemwide registry entry, kernel mode

Runs Winlogon in the Windows Symbolic Debugger (Ntsd.exe) with the following options:

  • -d Send output to kernel debugger console.
  • -g Ignore first breakpoint.
  • -x Ignore first chance access violations.

See also: Debug Initial Command, Enable debugging of Win32 subsystem.

Disable heap coalesce on free

Abbreviation | dhc
Hexadecimal value | 0x00200000
Symbolic Name | FLG_HEAP_DISABLE_COALESCING
Destination | Systemwide registry entry, kernel mode, image file registry entry

Leaves adjacent blocks of heap memory separate when they are freed. By default, the system combines ("coalesces") newly freed adjacent blocks into a single block. Combining the blocks takes time, but reduces fragmentation that might force the heap to allocate additional memory when it can't find contiguous memory.

This flag is used to test optimizing strategies. It is not used for debugging.

Disable paging of kernel stacks

Abbreviation | dps
Hexadecimal value | 0x80000
Symbolic Name | FLG_DISABLE_PAGE_KERNEL_STACKS
Destination | Systemwide registry entry, kernel mode

Prevents paging of the kernel mode stacks of inactive threads. Generally, the kernel mode stack cannot be paged; it is guaranteed to be resident in memory. However, the system occasionally pages the kernel stacks of inactive threads. This flag prevents these occurrences.

The kernel debugger can provide information about a thread only when its stack is in physical memory. This flag is particularly important when debugging deadlocks and in other cases when every thread must be tracked.

Disable protected DLL verification

Abbreviation | dpd
Hexadecimal value | 0x80000000
Symbolic Name | FLG_DISABLE_PROTDLLS
Destination | Systemwide registry entry, kernel mode, image file registry entry

This flag appears in Gflags, but it has no effect on the operating system.

Disable stack extension

Abbreviation | dse
Hexadecimal value | 0x10000
Symbolic Name | FLG_DISABLE_STACK_EXTENSION
Destination | Image file registry entry

Prevents the kernel from extending the stacks of the threads in the process beyond the initial memory committed. This is used to simulate low memory conditions (where stack extensions start to fail) and to test the strategic system processes that are expected to run well even with low memory.

Early critical section event creation

Abbreviation | cse
Hexadecimal value | 0x10000000
Symbolic Name | FLG_CRITSEC_EVENT_CREATION
Destination | Systemwide registry entry, kernel mode, image file registry entry

Creates event handles when a critical section is initialized, rather than waiting until the event is needed. When the system cannot create an event, it generates the exception during initialization and the calls to enter and leave the critical section do not fail.

Because this flag uses a significant amount of nonpaged pool memory, use it only on very reliable systems that have sufficient memory.

Enable application verifier

Abbreviation | vrf
Hexadecimal value | 0x100
Symbolic Name | FLG_APPLICATION_VERIFIER
Destination | Systemwide registry entry, kernel mode, image file registry entry

Enable bad handles detection

Abbreviation | bhd
Hexadecimal value | 0x40000000
Symbolic Name | FLG_ENABLE_HANDLE_EXCEPTIONS
Destination | Systemwide registry entry, kernel mode

Raises a user mode exception (STATUS_INVALID_HANDLE) whenever a user mode process passes an invalid handle to the Object Manager.

Enable close exception

Abbreviation | ece
Hexadecimal value | 0x00400000
Symbolic Name | FLG_ENABLE_CLOSE_EXCEPTIONS
Destination | Systemwide registry entry, kernel mode

Raises a user mode exception whenever an invalid handle is passed to the CloseHandle() interface or related interfaces, such as SetEvent(), that take handles as arguments.

Notes

  • This flag is still supported, but it has been replaced by Enable bad handles detection, which performs a more comprehensive check of handle use.

Enable debugging of Win32 subsystem

Abbreviation | d32
Hexadecimal value | 0x20000
Symbolic Name | FLG_ENABLE_CSRDEBUG
Destination | Systemwide registry entry, kernel mode

Runs the Client Server Run-time Subsystem, Csrss.exe, in the Windows Symbolic Debugger (Ntsd.exe) with the following options:

  • -d Send output to kernel debugger console.
  • -p 1 Attach the debugger to already running Csrss process, as identified by its process ID, 1.

This flag is effective only when the Debug Initial Command (dic) or Debug Winlogon (dwl) flag is also set.

Enable exception logging

Abbreviation | eel
Hexadecimal value | 0x00800000
Symbolic Name | FLG_ENABLE_EXCEPTION_LOGGING
Destination | Systemwide registry entry, kernel mode

Creates a log of exception records in the kernel run-time library. You can access the log from the kernel debugger.

Enable heap free checking

Abbreviation | hfc
Hexadecimal value | 0x20
Symbolic Name | FLG_HEAP_ENABLE_FREE_CHECK
Destination | Systemwide registry entry, kernel mode, image file registry entry

Validates the heap when it is freed.

See also: Enable heap tail checking, Enable heap parameter checking

Enable heap parameter checking

Abbreviation | hpc
Hexadecimal value | 0x40
Symbolic Name | FLG_HEAP_VALIDATE_PARAMETERS
Destination | Systemwide registry entry, kernel mode, image file registry entry

Verifies some aspects of the heap whenever a heap API is called.

See also: Enable heap validation on call

Enable heap tagging

Abbreviation | htg
Hexadecimal value | 0x800
Symbolic Name | FLG_HEAP_ENABLE_TAGGING
Destination | Systemwide registry entry, kernel mode, image file registry entry

Assigns unique tags to heap allocations. You can display the tag by using the !heap debugger extension with the -t parameter.

For information abou the !heap extension, see the Microsoft Windows 2000 Debugging Tools Kit, which is available from the Microsoft Windows Driver Development Kits (DDK) (http://go.microsoft.com/fwlink/?LinkId=1651) Web site.

See also: Enable heap tagging by DLL

Enable heap tagging by DLL

Abbreviation | htd
Hexadecimal value | 0x8000
Symbolic Name | FLG_HEAP_ENABLE_TAG_BY_DLL
Destination | Systemwide registry entry, kernel mode, image file registry entry

Assigns a unique tag to heap allocations created by the same DLL. You can display the tag by using the !heap debugger extension with the -t parameter.

For information abou the !heap extension, see the Microsoft Windows 2000 Debugging Tools Kit, which is available from the Microsoft Windows Driver Development Kits (DDK) (http://go.microsoft.com/fwlink/?LinkId=1651) Web site.

See also: Enable heap tagging

Enable heap tail checking

Abbreviation | htc
Hexadecimal value | 0x10
Symbolic Name | FLG_HEAP_ENABLE_TAIL_CHECK
Destination | Systemwide registry entry, kernel mode, image file registry entry

Checks for buffer overruns when the heap is freed. This flag adds a short pattern to the end of each allocation. The Windows heap manager detects the pattern when the block is freed and, if the block was modified, the heap manager breaks into the debugger.

See also: Enable heap free checking, Enable heap parameter checking

Enable heap validation on call

Abbreviation | hvc
Hexadecimal value | 0x80
Symbolic Name | FLG_HEAP_VALIDATE_ALL
Destination | Systemwide registry entry, kernel mode, image file registry entry

Validates the entire heap each time a heap API is called.

To avoid the high overhead resulting from this flag, use the HeapValidate() API at critical junctures, such as when the heap is destroyed. However, this flag is useful for detecting random corruption in a pool.

See also: Enable heap parameter checking

Enable loading of kernel debugger symbols

Abbreviation | ksl
Hexadecimal value | 0x40000
Symbolic Name | FLG_ENABLE_KDEBUG_SYMBOL_LOAD
Destination | Systemwide registry entry, kernel mode

Loads kernel symbols into the kernel memory space the next time the system starts. The kernel symbols are used in kernel profiling and by advanced kernel debugging tools.

Enable object handle type tagging

Abbreviation | eot
Hexadecimal value | 0x01000000
Symbolic Name | FLG_ENABLE_HANDLE_TYPE_TAGGING
Destination | Systemwide registry entry, kernel mode

This flag appears in Gflags, but it has no effect on the operating system.

Enable page heap

Abbreviation | hpa
Hexadecimal value | 0x02000000
Symbolic Name | FLG_HEAP_PAGE_ALLOCS
Destination | Systemwide registry entry, kernel mode, image file registry entry

Adds a guard page and other tracking features to each heap allocation. Available systemwide (registry or kernel mode) or per-program (image file).

Gflags for Windows XP implements full page heap tracking for image files and standard page heap tracking for system allocations. Full page heap tracking places inaccessible pages at the end of an allocation. Standard page heap tracking examines allocations as they are freed. This optimization reduces the huge overhead that would otherwise result from systemwide page heap tracking.

Enable pool tagging

Abbreviation | ptg
Hexadecimal value | 0x400
Symbolic Name | FLG_POOL_ENABLE_TAGGING
Destination | Systemwide registry entry, kernel mode

Attaches a four-character tag to every kernel pool allocation. Several tools that diagnose memory leaks and other kernel pool errors require this tag.

Enable system critical breaks

Abbreviation | scb
Hexadecimal value | 0x100000
Symbolic Name | FLG_ENABLE_SYSTEM_CRIT_BREAKS
Destination | Systemwide registry entry, kernel mode, image file registry entry

  • For per-process (image file) only: Forces a system breakpoint into the debugger whenever the specified process stops abnormally. This flag is effective only when the process calls the RtlSetProcessBreakOnExit() and RtlSetThreadBreakOnExit() interfaces.
  • For systemwide (registry or kernel mode): Forces a system breakpoint to the debugger whenever processes that have called the RtlSetProcessBreakOnExit() and RtlSetThreadBreakOnExit() interfaces stop abnormally.

Load DLLs top-down (Win64 only)

Abbreviation | ltd
Hexadecimal value | 0x20000000
Symbolic Name | FLG_LDR_TOP_DOWN
Destination | Systemwide registry entry, kernel mode, image file registry entry

Loads DLLs at the highest possible address. This flag is used to test 64-bit code for pointer truncation errors, because the most significant 32 bits of the pointers are not zeroes.

Maintain a list of objects for each type

Abbreviation | otl
Hexadecimal value | 0x4000
Symbolic Name | FLG_MAINTAIN_OBJECT_TYPELIST
Destination | Systemwide registry entry, kernel mode

Collects and maintains a list of the active objects by object type (for example, event, mutex, and semaphore). You can use Open Handles (Oh.exe), a Windows Support Tool, to dump the object lists.

Note

  • This flag is available as a kernel mode setting, but it is not effective in kernel mode because the kernel is already started.

Show loader snaps

Abbreviation | sls
Hexadecimal value | 0x2
Symbolic Name | FLG_SHOW_LDR_SNAPS
Destination | Systemwide registry entry, kernel mode, image file registry entry

Captures detailed information about the loading and unloading of executable images and their supporting library modules.

  • For systemwide (registry or kernel mode): Whenever a driver is loaded, this flag writes the kernel contents to the kernel debugger console. This feature works only when using a "checked build," that is, an internal debugging build of the operating system.
  • For per-process (image file): Whenever a DLL is loaded, this flag writes the loader contents (and data related to DLL loading) to the program debugger console.

Stop on exception

Abbreviation | soe
Hexadecimal value | 0x1
Symbolic Name | FLG_STOP_ON_EXCEPTION
Destination | Systemwide registry entry, kernel mode, image file registry entry

The kernel breaks into the kernel debugger whenever a kernel mode exception occurs. The system passes all first chance exceptions (except for STATUS_PORT_DISCONNECT) with a severity of Warning or Error to the debugger before passing them to a local exception handler.

Stop on hung GUI

Abbreviation | shg
Hexadecimal value | 0x8
Symbolic Name | FLG_STOP_ON_HUNG_GUI
Destination | Kernel mode

This flag appears in Gflags, but it has no effect on the operating system.

Gflags Topics

  • GFlags Notes
  • GFlags Command-Line Syntax
  • GFlags Dialog Box Operation
  • Global Flags Reference
  • GFlags Examples


Gflags.exe: Dialog Box Operation
Overview | Notes | Syntax | UI | Examples | Flags

By using the Gflags dialog box, you can perform all Gflags functions from a user interface that lists all flags by name. There is no need to look up flag abbreviations or hexadecimal values. Instead, you can set and clear flags by selecting and clearing the named flag check boxes.

Also, the dialog box provides access to the following features that are not available from the command line:

  • Debugger. Specify that a particular program always runs in a debugger.
  • Launch. Run a program with the specified debugging settings.
  • Kernel Special Pool Tag. Detects kernel pool errors.

This section includes the following topics.

Gflags Dialog Box

The Gflags dialog box in System Registry mode.

Gflags Dialog Box

To open the dialog box

Use one of the following methods:

  • At the command line, type gflags (without parameters).
  • In the Run dialog box, type gflags (without parameters).

To set and clear systemwide registry flags

Systemwide registry settings affect the entire system. They are saved in the registry and remain effective until you change them.

  1. In the Destination area, click System Registry.
  2. Set or clear a flag by selecting or clearing the check box associated with the flag.
  3. When you have selected or cleared all the flags you want, click Apply.
  4. Restart the system to make the changes effective.

To set and clear kernel mode flags

Kernel mode settings affect the entire system, but are effective only for the current session.

  1. In the Destination area, click Kernel Mode.
  2. Set or clear a flag by selecting or clearing the check box associated with the flag.
  3. When you have selected or cleared all the flags you want, click Apply.

To set and clear image file registry flags

Image file settings affect instances of the specified program that start after the command completes. They are saved in the registry and remain effective until you change them.

  1. In the Destination area, in the Image File Name box, type the name of the executable file or DLL, including the file name extension.
  2. Click Image File Options.
  3. Set or clear a flag by selecting or clearing the check box associated with the flag.
  4. When you have selected or cleared all the flags you want, click Apply.

To launch a program with flags

This feature runs a program once with the specified flags. These settings affect only the instance of the program launched by the instruction in the Command Line box. They are not saved in the registry.

  1. In the Destination area, in the Command Line box, type a command to start a program, including program parameters.
  2. Set or clear a flag by selecting or clearing the check box associated with the flag.
  3. When you have selected or cleared all the flags you want, click the Launch button.

Notes

  • Flags set in the registry do not affect the instance of the program that is launched.
  • Flags set in the dialog box are used for the launched instance even when they are not image file flags.

To run a program in a debugger

This feature configures the program so that it always runs in a debugger with the specified options. This setting is saved in the registry. It affects all new instances of the program and remains effective until you change it.

The flags settings in the dialog box do not affect the debugger run.

  1. In the Destination area, in the Image File Name box, type the name of the executable file, including the file name extension.
  2. Click Image File Options.
  3. In the Image Debugger Options area, click the Debugger check box.
  4. In the Debugger box, type the command to run the debugger, including the program name and parameters. For example, ntsd -d.
  5. Click Apply.

To configure kernel special pool

The kernel special pool feature uses the special pool for all allocations that have a specified tag or are within a specified size range. This feature helps you to detect and identify the source of errors in kernel pool use, such as writing beyond the allocated memory space, or referring to memory that has already been freed.

For information on using the special pool, see the Windows Driver Development Kit.

Kernel special pool settings are saved in the registry. They become effective when you restart the system and remain effective until you change them.

  1. In the Destination area, click System Registry.
  2. Choose one of the following methods:
    • To specify a pool tag in text format, click Text.

      • Type a four-character pattern for the tag. The tag can include the ? (any single character) and * (multiple characters) wildcard characters. For example, Fat* or Av?4.

      Gflags converts the ASCII characters to their hexadecimal format, placing the leftmost character in the lowest order position. For example, if you type Tag1, Gflags sets the tag to 0x31676154.

    • To specify a pool tag in hexadecimal format, click Hex.

      • Type a hexadecimal value for the tag.

      Gflags sets the tag to the same numeric value. For example, if you type 12345678, Gflags stores pool tag 0x12345678.

      Note

      • Enter a hexadecimal value that is greater than the page size of the system. Otherwise, the value is interpreted as indicating a size range.
    • To track kernel pool allocations of a specified size, click Hex.

      • Allocations are organized into a range of pool block sizes. In 32-bit systems, pool blocks are divided into 8-byte ranges. In 64-bit systems, the range is 16 bytes.

      To indicate a range, type a hexadecimal number equal to the upper limit of the range + 8 bytes for the pool header. For example, on a 32-bit system, to specify a pool block of between 9 and 16 bytes, type 18 to indicate 0x18.

      The following table shows the pattern of pool block ranges and the value you type to select that range for 32-bit systems.

      Size range (in bytes) | Value
0 - 8 | 0x10 (16)
9 - 16 | 0x18 (24)
17 - 24 | 0x20 (32)
25 - 32 | 0x28 (40)
... |

      The following table shows the pattern of pool block ranges and the value you type to select that range for 64-bit systems.

      Size range (in bytes) | Value
0 - 16 | 0x18 (24)
17 - 32 | 0x28 (40)
33 - 48 | 0x38 (56)
49 - 64 | 0x46 (70)
... |

      Note

      • The value for a size range must be equal to a multiple of 8 plus 8 (8x + 8) on 32-bit systems or a multiple of 16 + 8 (16x + 8) on 64-bit systems. Also, the value must be smaller than the page size for the system. Otherwise, the value is interpreted as a hexadecimal tag.
  3. Click Verify Start or Verify End:
    • Verify End causes a system stop when a program tries to access tagged memory beyond its memory allocation.
    • Verify Start causes a system stop when a program tries to access tagged memory preceding its memory allocation.
  4. Click Apply.
  5. To disable kernel special pool, delete the text or hexadecimal value from the Kernel Special Pool Tag box, and then click Apply.

Note

  • The special pool can also be used for the memory pool allocations requested by a specific driver. This feature is activated by Driver Verifier (Verifier.exe), a tool included in the Windows\System32 directory in Windows 2000 and Windows XP . For details, see the Driver Verifier documentation in the Windows Driver Development Kit (DDK).


Gflags Examples
Overview | Notes | Syntax | UI | Examples | Flags
Basic | Example 1: Display debugging settings. Example 2: Set a flag by using a flag abbreviation. Example 3: Set a flag by using its hexadecimal value. Example 4: Set multiple flags. Example 5: Clear a flag. Example 6: Clear all flags. Example 7: Clear all flags for an image file.
Advanced | Example 8: Change the maximum trace stack size. Example 9: Detect a memory pool leak. Example 10: Detect a heap memory leak in a process.

Example 1: Display debugging settings

The following command displays the current value of the system-level GlobalFlag registry entry (HKLM\System\CurrentControlSet\Control\Session Manager\GlobalFlag). It uses the /r parameter to specify the system-level registry entry.

gflags /r

In response, Gflags displays a single hexadecimal value representing the sum of all flags set and a list of the flags set.

Current Boot Registry Settings are: 40001400
    ptg - Enable pool tagging
    ust - Create user mode stack trace database
    bhd - Enable bad handles detection

In this example, the results show that there are three tags set, with a combined value of 0x40001400.

  • Enable pool tagging (ptg) = 0x400
  • Create user mode stack trace database (ust) = 0x1000
  • Enable bad handles detection (bhd) = 0x40000000

Remember that the value in the registry might not be the current value. Changes to the registry are not effective until the system is restarted.

You can use similar commands to display the debugging values for the current session, known as kernel mode, and debugging values for a particular image file.

The following command displays the debugging values for the current session. It uses the /k parameter to indicate kernel mode.

gflags /k

The following command displays the debugging values set in the registry for Notepad.exe. This value is stored in a GlobalFlag registry entry located in the program-specific subkey, HKLM\System\CurrentControlSet\Control\Session Manager\Image File Execution Options\Notepad.exe. It uses the /i parameter to indicate image file mode and specifies the image file.

gflags /i notepad.exe

Remember that the value in the registry might not be the current value. Changes to the registry are not effective until the system is restarted.

Example 2: Set a flag by using a flag abbreviation

The following command sets the Show loader snaps flag in the GlobalFlag registry entry for the Notepad.exe image file. Show loader snaps takes snapshots of the load process, capturing in detail the loading and unloading of executable images and their supporting library modules.

The command uses the /i parameter to indicate image file mode and specifies the name of the image file, Notepad.exe. To identify the flag, the command uses sls, the abbrevation for Show loader snaps and it precedes the abbreviation with a plus sign (+) to indicate that the flag is set. Without the plus sign, the command has no effect.

gflags /i notepad.exe +sls

In response, Gflags displays the current flags for Notepad.exe. The display indicates that the command is successful. The Show loader snaps flag is enabled for all new instances of the Notepad.exe process.

Current Registry Settings for notepad.exe executable are: 00000002
    sls - Show Loader Snaps

Example 3: Set a flag by using its hexadecimal value

The following command sets the Enable page heap flag in the systemwide GlobalFlag registry entry. Enable page heap adds a guard page and other tracking features to each heap allocation.

The command uses the /r parameter to indicate system registry mode. To identify the flag, the command uses 2000000, which represents 0x2000000, the hexadecimal value for Enable page heap.

Although the command sets a flag, it omits the plus sign. When using hexadecimal values, the sign is optional and add (+) is the default.

gflags /r 2000000

In response, Gflags displays the current value of GlobalFlag. The display indicates that the command is successful. The Enable page heap flag is set when you restart the system.

Current Boot Registry Settings are: 02000000
    hpa - Enable page heap

Example 4: Set multiple flags

The following command sets the following three debugging flags for the current session.

  • Enable heap free checking (hfc, 0x20)
  • Enable heap parameter checking (hpc, 0x40)
  • Enable heap validation on call (hvc, 0x80)

This command uses the /k parameter to specify kernel mode (session only). It sets the value for kernel mode to E0 (0xE0), the sum of the hexadecimal values of the flags.

gflags /k e0

In response, Gflags displays the current value of GlobalFlag. The display indicates that the command is successful and that the correct three flags are, indeed, set.

Current Running Kernel Settings are: 000000e0
    hfc - Enable heap free checking
    hpc - Enable heap parameter checking
    hvc - Enable heap validation on call

Please note that each of the following commands have the same effect as the command used in this example and can be used interchangeably.

gflags /k +20 +40 +80

gflags /k +E0

gflags /k +hfc +hpc +hvc

Flags set in kernel mode are effective immediately and remain effective until the system stops.

Example 5: Clear a flag

The following command clears the Enable page heap flag from the systemwide GlobalFlag registry entry. The command uses the /r parameter to indicate the systemwide registry and hpa, the abbreviation for the Enable page heap flag. The minus sign (-) specifies that the flag is to be cleared.

gflags /r -hpa

In response, Gflags displays the current value of GlobalFlag. The display indicates that the command is successful and that there are no longer any flags set in the registry value.

Current Boot Registry Settings are: 00000000

Please note that the following command, which uses the hexadecimal value of the Enable page heap flag, has the same effect as the command used in this example and can be used interchangeably:

gflags /r -02000000

Example 6: Clear all flags

There are two different ways to clear all flags set for a particular debugging mode:

  • Clear the current flags.
  • Clear all flags.

Notes

  • The methods demonstrated by this example clear flags only. They do not reset the maximum stack trace size or kernel special pool tag to the default values.

Clear the current flags

The following command uses the first method for clearing flags. It clears the current value of GlobalFlag by clearing the flags set. In this example, the current value is 0xE0.

gflags /r -E0

In response, Gflags displays the current value of GlobalFlag. The display indicates that the command is successful and that there are no longer any flags set in the registry value.

Current Boot Registry Settings are: 00000000

Please note that the following commands have the same effect as the command used in this example and can be used interchangeably:

gflags /r -20 -40 -80

gflags /r -hfc -hpc -hvc

Clear all flags

The following command uses the second method for clearing flags. It clears all possible values set for GlobalFlag.

gflags /r -ffffffff

In response, Gflags displays the current value of GlobalFlag. The display indicates that the command is successful and that there are no longer any flags set in the registry value.

Current Boot Registry Settings are: 00000000

Note

  • Type this command into Notepad, then save the file as ClearFlag.bat. Thereafter, to clear all flags, just type ClearFlag .

Finally, the following example demonstrates that the intuitive method of clearing all flags does not work.

The following command sets the value of the systemwide GlobalFlag registry entry to 0. In this example, the current value of GlobalFlag is 0xE0.

gflags /r 0

In response, Gflags displays the value of GlobalFlag after the command completes:

Current Boot Registry Settings are: 000000e0
    hfc - Enable heap free checking
    hpc - Enable heap parameter checking
    hvc - Enable heap validation on call

The command has no effect because it adds the value 0 to the current value of GlobalFlag.

Example 7: Clear all flags for an image file

The following command clears all flags and image debugger options for an image file. The command adds high-values (0xFFFFFFFF) to the current flag value. Gflags responds by deleting the GlobalFlag entry for the image file, thereby deleting all of the values it stores.

This method does not clear flags set in the systemwide registry entry or in kernel mode.

gflags /i notepad.exe ffffffff

In response, Gflags displays a message indicating that there are no flags set for the image file:

No Registry Settings for notepad.exe executable

To determine which image files have flags set, use Regfind, a tool included in the Windows 2000 Server Resource Kit, to search the registry subkeys in the Image file Execution Options subkey.

The following command searches for GlobalFlag in the path specified by the -p parameter. The -n parameter directs Regfind to search for the names of subkeys and entries, instead of the data stored in the entry.

regfind GlobalFlag -n -p "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options"

In response, Regfind displays all image file subkeys with GlobalFlag registry entries. It also displays the value of the entry. Because the gflags command deleted the entry for Notepad.exe, it does not appear in the Regfind list.

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execu
tion Options
    f32main.exe
        GlobalFlag = 0x000000c0
    dgsetup.exe
        GlobalFlag = 0x00000080

Note

  • Type the regfind command into Notepad, then save the file as Images.bat. Thereafter, to find image files for which flags have been set, just type Images .

Example 8: Change the maximum trace stack size

The following command increases the maximum size of the stack trace to 24 items. This value is set in the systemwide GlobalFlag registry entry. The default value is 16 (0x10).

The command uses the /r parameter to indicate the systemwide GlobalFlag registry entry. It uses the maxdepth parameter to change the maximum stack trace size and the value 24 to indicate the desired size in decimal units. (Hexadecimal units are not valid.)

gflags /r maxdepth 24

In response, Gflags displays the current value of the systemwide GlobalFlag registry entry. Gflags does not report the success of the command or display the current stack trace size.

Current Boot Registry Settings are: 02000000
    hpa - Enable page heap

To display the stack trace size, use registry APIs, Regedit, or Reg.exe, to check the value of the MaxStackTraceDepth registry entry (HKLM\System\CurrentControlSet\Control\Session Manager\MaxStackTraceDepth).

The following command uses Reg.exe to query the value of MaxStackTraceDepth:

reg query "hklm\system\currentcontrolset\control\session manager" /v maxstacktracedepth

In response, Reg.exe returns the value of MaxStackTraceDepth, which confirms that the new value, 24 (0x18), was set. This value becomes effective when you restart the system.

! REG.EXE VERSION 2.0

HKEY_LOCAL_MACHINE\system\currentcontrolset\control\session manager
    maxstacktracedepth  REG_DWORD       0x18

Notes

  • Type the reg query command into Notepad, then save the file as MaxDepth.bat. Thereafter, to display the value of MaxStackTraceDepth, just type MaxDepth .
  • To see the registry locations of values set by Gflags, see Gflags Notes.

Example 9: Detect a memory leak

The following example uses Gflags to set the Enable pool tagging flag in the registry entry for the system. Then, it uses Poolmon, a Windows Support Tool, to display the size of the memory pools. Poolmon uses pool tags to monitor the bytes in the paged and nonpaged memory pools. By running Poolmon periodically, you can identify pools that expand continuously over time. This pattern often indicates a memory leak.

Note

  • If the Enable pool tagging flag is not set, Poolmon fails and diplays the following message: "Query pooltags Failed c0000002."
  1. Set the Enable pool tagging flag in the systemwide registry entry.

    2. Use one of the following methods. These methods have the same effect and can be used interchangeably.

    • In the Gflags dialog box, click the Registry button, click the Enable pool tagging check box, and then click Apply.
    • At the command line, use the /r parameter to specify the systemwide registry entry, and the ptg abbreviation to specify the flag.

      gflags /r +ptg

    • At the command line, use the /r parameter to specify the systemwide registry entry, and the 0x400 hexadecimal value to specify the flag. The plus sign (+) is optional in this format.

      gflags /r +400

  2. Restart the computer to make the registry change effective.

  3. Run Poolmon periodically by using the following command. In this command, the /b parameter sorts the pools in descending size order.

    4. poolmon /b

    In response, Poolmon displays a table of memory pool size, including the number of allocs and frees, and the amount of memory remaining in the pool (in the Bytes column).

    Memory: 16224K Avail: 4564K PageFlts: 31 InRam Krnl: 684K P: 680K
 Commit: 24140K Limit: 24952K Peak: 24932K  Pool N: 744K P: 2180K

 Tag  Type    Allocs          Frees         Diff   Bytes      Per Alloc
-----------------------------------------------------------------------

 CM   Paged    1283 (   0)    1002 (   0)    281 1377312 (     0) 4901
Strg  Paged   10385 (  10)    6658 (   4)   3727  317952 (   512)   85
 Fat  Paged    6662 (   8)    4971 (   6)   1691  174560 (   128)  103
MmSt  Paged     614 (   0)     441 (   0)    173   83456 (     0)  482

    If the value of Bytes in a pool expands continuously for no obvious reason, there might be a memory leak in that pool.

  4. Turn off Enable pool tagging.

    5. The following command line uses the flag abbreviation method, but you can identify the flag by its hexadecimal value or use the Global Flags dialog box:

    gflags /r -ptg

  5. Restart the system to make the registry change effective.

Note

  • Use the append symbol (>>) to redirect the Poolmon output to a log file. Later, you can examine the log file for pool size trends. For example:

    poolmon.exe /b >> poolmon.log

Example 10: Detect a heap memory leak in a process

This example uses Gflags and Umdh.exe (User Mode Dump Heap), a tool available from Microsoft Product Support Services (http://go.microsoft.com/fwlink/?LinkId=1679).

To detect a leak in heap memory in Notepad.exe:

  1. Set the Create user mode stack trace database flag for the Notepad.exe image file.

    2. The following command uses Gflags to set the Create user mode stack trace database flag. It uses the /i parameter to identify the image file and the ust abbreviation for the flag.

    gflags /i Notepad.exe +ust

    As a result of this command, a user mode stack trace is created for all new instances of the Notepad process.

  2. Set the symbol file path.

    3. The following command creates an environment variable that stores the path to the directory of symbol files:

    set _NT_SYMBOL_PATH=C:\Windows\symbols

  3. Start Notepad.
  4. Find the process identifier (PID) of the Notepad process.

    5. You can find the PID of any running process from Task Manager or Tasklist.exe, a tool included in Windows XP Professional. In this example, the Notepad PID is 1228.

  5. Run Umdh.exe

    6. The following command runs Umdh.exe. It uses the -p: parameter to specify the PID which, in this example, is 1228. It uses the /f: parameter to specify the name and location of the output file for the heap dump, Notepad.dmp.

    umdh -p:1228 -f:notepad.dmp

    In response, Umdh writes a complete dump of all active heaps to the notepad.dmp file.


Pageheap.exe: Page Heap
Overview | Notes | Syntax | Examples

This command line tool sets page heap flags that help to find heap-related bugs and corruption. It can also help detect leaks in applications that are running on Windows 2000 Professional SP2 and Windows XP Professional systems.

PageHeap introduces a software validation layer (Page Heap manager) between the application and the system that verifies all dynamic memory operations (allocations, frees, and other heap operations). When Page Heap manager is enabled, the application being tested is then launched under a debugger. If a bug is encountered, it will cause a debugger break.

Important

  • PageHeap does not find bugs. It enables a verification layer that already exists in the ntdll.dll system libraries in Windows 2000 Professional SP2 and Windows XP Professional. PageHeap will not work on previous versions of Microsoft Windows.
  • If the application being tested is not launched under a debugger and a bug is encountered, it will just crash without any feedback.

Corresponding UI

There is no corresponding user interface for PageHeap.

Concepts

A common problem in application development is heap corruption. This typically occurs when an application allocates a block of heap memory of a given size and then writes to memory addresses beyond the requested size of the heap block. Heap corruption can also occur when an application writes to block of memory that has already been freed.

Two concepts are central to understanding the commands related to PageHeap and the way to use it:

  • Corruptions in heap blocks are discovered by either placing a non-accessible page at the end of the allocation, or by checking fill patterns when the block is freed.
  • There are two heaps (full-page heap and normal page heap) for each heap created within a process that has page heap enabled.

Full-page heap reveals corruptions in heap blocks by placing a non-accessible page at the end of the allocation. The advantage of this approach is that you achieve "sudden death," meaning that the process will access violate (AV) exactly at the point of failure. This behavior makes failures easy to debug. The disadvantage is that every allocation uses at least one page of committed memory. For a memory-intensive process, system resources can be quickly exhausted.

Normal page heap can be used in situations where memory limitations render full-page heap unusable. It checks fill patterns when a heap block is freed. The advantage of this method is that it drastically reduces memory consumption. The disadvantage is that corruptions will only be detected when the block is freed. This makes failures harder to debug.

System Requirements

The following are the system requirements for PageHeap:

  • Windows XP Home Edition
  • Windows XP Professional
  • Windows 2000 Professional SP2

File Required

  • Pageheap.exe


PageHeap Notes
Overview | Notes | Syntax | Examples

Choosing a Method to Investigate Heap Block Corruptions

Most of the corruptions in heap blocks can be discovered in one of two ways:

  1. Full-page heap: Placing a non-accessible page at the end of the allocation.
  2. Normal page heap: Checking fill patterns when the block gets freed.

Full-Page Heap

Full-page heap should be enabled for individual processes, or under limited parameters for large processes, because of its high memory requirements. It cannot be enabled system-wide, because it is difficult to evaluate the required page file size. Using a page file that is too small with system-wide full-page heap renders the system unbootable.

The advantage of full-page heap is that it causes a process to access violate (AV) exactly at the point of failure. This makes the failure easy to debug. In order to be able to pinpoint failures, first use normal page heap to determine the range where a process is failing, and then use full-page heap on individual large-scale processes for that restricted class of allocations (that is, a specific size range or a specific library).

Normal Page Heap

Normal page heap can be used for the testing of large-scale processes without the high memory consumption that full-page heap requires. However, normal page heap delays detection until blocks are freed, thus making failures more difficult to debug.

In general, use normal page heap for initial large-scale processes testing. Then, if problems are detected, enable full-page heap for a restricted class of allocations in those processes.

Normal page heap can be safely enabled system-wide for all processes. This is very useful on test benches that perform general system validation, rather than component focused testing. Normal page heap can also be enabled for a single process.

Using GFlags with System-Wide Page Heap

The GFlags tool is used to enable system-wide page heap. In order for a GFlags command to take effect, you must restart your computer after you issue the command.

To enable system-wide normal page heap

  1. Type the following at the command line:
    gflags -r +hpa
  2. Restart your computer.

To disable system-wide normal page heap

  1. Type the following at the command line:
    gflags -r -hpa
  2. Restart your computer.

Note

  • No other GFlags settings are useful when you enable page heap. If other settings that appear to be related to the heap are enabled, then page heap bugs can be introduced due to conflicts between page heap manager and these "harmless" heap flags.

Unaligned Allocations

The Windows heap managers (all versions) have always guaranteed that the heap allocations have a start address that is 8-byte aligned (on 64-bit platforms the alignment is 16-bytes). The page heap manager makes the same guarantee. This is impossible, however, if you want to have the end-of-the-allocation exactly at the end of a page. The exact end-of-page allocation is needed so that an off-by-one-byte error will trigger a read or write into the non-accessible page and cause an immediate fault.

If the user-requested size for the block is not 8-byte aligned, then page heap cannot meet both the "start address 8-byte aligned" and the "end address page aligned" constraints. The solution is to meet the first constraint and make the start of the block 8-byte aligned. Then use a small fill pattern between the end of the block and the start of the non-accessible page. This fill pattern can be from 0 bytes through 7 bytes in length on 32-bit architectures. The fill pattern is checked upon free.

If immediate fault detection is needed for these allocations that otherwise will have a fill pattern at the end, then make the page heap manager ignore the 8-byte alignment rule, and always align the end of the allocation at a page boundary by using the /unaligned and /full parameters. For more information, see the /unaligned parameter.

Note

  • Some applications make assumptions about 8-byte alignment and they will stop working correctly with the /unaligned parameter. Internet Explorer is one such example.

Uncommitted Pages for Full-Page Heap Allocations

The core full-page heap implementation commits two pages for any allocation smaller than one page. One page is used for the user allocation, and the other is made non-accessible at the end of the buffer.

End-of-buffer overruns can be detected by using a zone of reserved virtual space, instead of a non-accessible committed page. An access violation exception occurs when the process touches that reserved virtual space. This approach can reduce memory consumption by up to 50 percent. For more information, see the /decommit parameter.

Fault Injection

You can control page heap manager so that some allocations are deliberately failed. This is useful in simulating low memory conditions without actually using all system resources.

Specify a number from 1 through 10000 to represent the probability that an allocation will fail. Using a probability of 10000 ensures that 100 percent of allocations will fail. A probability of 2000 specifies that approximately 20 percent of allocations will fail.

The page heap manager takes special care to avoid fault injection in both the first five seconds of the process’ life, and the Windows NT loader code paths (for exampole, LoadLibrary, FreeLibrary). If five seconds is not sufficient to allow your process to complete startup, then you can specify a longer timeout at the beginning of the process. For more information, see the /fault parameter.

When you use the /fault parameter and the process being tested has a bug, an exception will be raised. Generally, the reason for this is that the allocate operation returned a NULL, and the application later tries to access the allocated memory. Since the allocate failed, however, the memory cannot be accessed, and therefore an access violation occurs.

The other reason that an exception is raised is that the application tries to deal with the allocation failure, but does not release some resources. This manifests as a memory leak and is more difficult to debug.

In order to help diagnose these failures, the page heap manager keeps a history of stack traces from the moment of fault injection. These traces can be displayed with the following debugger command:

!heap –p –f [NUMBER-OF-TRACES]

By default the extension will display only the last four traces.

Automatically Attaching a Debugger When the Application Starts

Some applications are difficult to start from a command prompt, or they are spawned from other processes. For these applications, specify that, whenever they are started, a debugger will automatically be attached to them. This is useful if page heap is enabled for that process and heap failures occur. For more information, see the /debug parameter.

What Interfaces Does PageHeap Verify?

PageHeap is effective when used to verify any memory allocation process, including C++ style allocations new and delete, as long as the custom allocation/free functions eventually call into NT heap management interfaces (that is, RtlAllocateHeap, RtlFreeHeap). The following functions are guaranteed to do that:

  • Functions like HeapAlloc, HeapFree, HeapReAlloc: These functions are exported by kernel32.dll and call directly into the NT heap interfaces.
  • Functions like GlobalAlloc, GlobalFree, GlobalReAlloc: These functions are exported by kernel32.dll and call either directly or indirectly into the NT heap interfaces.
  • Functions like LocalAlloc, LocalFree, LocalReAlloc: These functions are exported by kernel32.dll and call either directly or indirectly into the NT heap interfaces.
  • Functions malloc, free, realloc, msize, expand: These functions are exported by msvcrt.dll and call either directly or indirectly into NT heap. This has not always been the case. The C run-time used to have a different heap implementation, but the current C run-time calls directly into NT heap.
  • Operators new, delete, new[ ] , delete[ ] : These functions are exported by msvcrt.dll and call either directly or indirectly into NT heap.

    • Any other allocation/free set of functions probably is a custom scheme and is not guaranteed to call either directly or indirectly into NT heap. Only source code inspection or running under debugger can reveal the actual implementation.

    Avoid using static linking. Some applications have been statically linked to old versions of the C runtime. These old versions do not call NT heap APIs, and PageHeap cannot be used to verify these allocations. Dynamic linking ensures that you get the latest C runtime library (msvcrt.dll).

Classes of Bugs Found by PageHeap

PageHeap detects most heap-related bugs; however, it is focused on heap corruption problems and not focused on leaks. PageHeap has limited success with finding heap leaks, although it has functionality to target this.

One of the advantages of PageHeap is that many errors are detected when they happen. For example, an off-by-one-byte error at the end of a dynamically allocated buffer might cause an instant access violation. There are few types of errors that cannot be detected when they occur. In those cases, the error report is delayed until the block is freed.

  • Invalid heap pointer: All Win32 and Windows NT level heap interfaces take as a first parameter a pointer to the heap where the operation should happen. The page heap manager detects an invalid heap pointer at the moment the call is made.
  • Invalid heap block pointer: After a block is allocated, it can be used as a parameter for several heap interfaces, notably the free() class of interfaces. The page heap manager immediately detects an invalid heap block pointer. See Debugging Page Heap Failures for a way to determine if the invalid address is a few bytes off, or is completely incorrect.
  • Multithreaded unsynchronized access to the heap: Some applications call into a heap from multiple threads. This type of scenario requires setting a flag (by the user) which will trigger acquiring a heap lock. The page heap manager will detect this type of violation when two threads attempt to call simultaneously into the heap.
  • Assumptions about reallocation of a block at the same address: A reallocation operation is not guaranteed to return the same address. This is especially true when the reallocation reduces the size of the block. Some applications assume that reallocation will return the same address. The page heap manager always allocates a new block during a reallocation and frees the old block. The free block is protected for read/write access, and therefore any access to it will raise an access violation.
  • Double free: This bug, where the same heap blocks are freed several times, is common in some applications. This is detected immediately by the page heap manager because, on the second free, the block will not have the proper prefix header and cannot be found among the allocated blocks. See Debugging Page Heap Failures for ways to analyze the stack trace of the first free operation. This error can be a variant of the reallocation problem because, when the application frees what it thinks it is the address of the block, that block was already freed as part of the reallocation.
  • Access of block after free: Freed memory blocks are kept for a short time by the page heap manager in a pool of protected memory. Any access to those blocks will raise an access violation. Based on the "locality" principle, most of the problems should be caught if the free protected pool is large enough. If the freed block is still in the protected pool, the bug is caught instantly. However, if the memory was reused, then there is less chance of finding the bug or identifying the code that caused it.
  • Access after the end of allocated block: The page heap manager places an inaccessible page immediately following the allocated block. Any access past the end of the block will raise an access violation. Some applications expect allocations to be 8-byte aligned. This feature has been supported since Windows NT 3.5 heap managers. A request size that is not 8-byte aligned will still get an 8-byte aligned address, but this leaves a few bytes after the end of the block that are still accessible. If the application corrupts only those few bytes, then the error will be caught only by checking the block suffix pattern when the block is freed.
  • Access before the start of allocated block: The page heap manager can be instructed through a settable flag to place the inaccessible page at the beginning of the block, rather than at the end. Any access before the start of the block will raise an access violation.
Failure | Normal page heap | Full-page heap
Invalid heap pointer | Caught instantly | Caught instantly
Invalid heap block pointer | Caught instantly | Caught instantly
Unsynchronized access | Caught instantly | Caught instantly
Assumption about reallocation address | 90% until real free | 90% caught instantly
Double free | 90% caught instantly | 90% caught instantly
Reuse after free | 90% until real free | 90% caught instantly
Access after end of block | Caught upon free | Caught instantly
Access before start of block | Caught upon free | Caught instantly (special flag)

Debugging Page Heap Failures

With full-page heap enabled for end-of-buffer-overrun bug detection, an application will access violate at the moment it tries to access memory past the end of the page. These failures are easy to debug because the current stack trace points directly to the failing code.

If normal page heap is used, or if the corruption happens in the small fill pattern at the end of the buffer for alignment reasons, then the corruption will be detected only when the block is freed. In these cases, additional debugging is required to identify the problem.

The Structure of a Page Heap Block

The page heap manager places a header at the beginning of all allocations, both full and normal. This header contains valuable information: the owning heap, user requested size, and in some cases, stack trace for the allocation.

Diagram of a normal page heap block structure Diagram of a full page heap block structure

The information block has the following structure:

DPH_BLOCK_INFORMATION

ULONG 		StartStamp;
PVOID 		Heap;
SIZE_T 	         RequestedSize;
SIZE_T 	         ActualSize;
LIST_ENTRY 	FreeQueue;
PVOID 		StackTrace;
ULONG 		EndStamp;

The Heap field stores the owning heap. The user-requested size for the block is in RequestedSize. The stack can be obtained by issuing a dds debugger command at StackTrace address. The best way to get a dump of this structure is to use the following dd debugger command:

dd ADDRESS L20

Or if you have the latest NT debugger package and PDB symbols for ntdll.dll, then use the following:

dt ntdll!_DPH_BLOCK_INFORMATION ADDRESS

The StackTrace field does not always contain a non-null value. Stack trace detection is only supported on x86 platforms, but even on x86 machines the stack trace detection algorithms are not completely reliable. If the block is an allocated block, then the stack trace is for the allocation moment. If the block was freed, then the stack trace is for the free moment.

The Page Heap Debugger Extension

The page heap debugger extension is part of the !heap extension (Windows NT heap debugger extension). Simple help can be obtained by typing the following from within the debugger:

!heap -?

More extensive information is available by typing the following:

!heap -p -?

The extension is not intelligent enough to detect on its own if page heap is enabled for a process. The user needs to know that page heap is enabled and use commands prefixed by !heap -p.
Command | Description
!heap -p | Dumps addresses of all full page heaps created in the process.
!heap -p -h HEAP-ADDRESS | Full dump of full page heap at HEAP-ADDRESS.
!heap -p -a ADDRESS | Tries to determine if there is a heap block at ADDRESS. This value does not need to be the address of the start of the block. The command is useful if you have no information about the nature of a memory area.
!heap -p -t NUMBER | This command dumps the first NUMBER heavy users of heap allocations. This command is useful for leak analysis.

Typical Debug Scenarios

There are several failure scenarios that you may encounter. Some of them require additional detective work to get the whole picture.

Access violation in a non-accessible page

This happens when full-page heap is enabled and the tested application accesses heap beyond the end of the buffer. It can also happen when the application touches a freed block. In order to understand the nature of the address on which the exception happened, use this command in the debugger:

!heap -p -f ADDRESS-OF-AV

Corrupted block message

At several moments during the lifetime of an allocation (allocation, user free, real free), the page heap manager checks to see if the block has all fill patterns intact, and if the block header has consistent data. If this is not the case you will get the message "Page heap: block @ ADDRESS is corrupted".

If this is a full-page heap block (that is, if you know that full-page heap is enabled for all allocations), then you can use this command to find the characteristics of the block:

!heap -p -f ADDRESS

If it is a normal page heap block, then you must determine the start address for the block header. To do this, dump 30-40 bytes below the reported address and look for the start/end patterns for a block header: ABCDAAAA, ABCDBBBB, ABCDAAA9, ABCDBBBA. See The Structure of a Page Heap Block for more information about the structure of the heap.

The header provides most of the information that you need to understand a failure. Specifically the start/end patterns tell you if the block is allocated or free, and if it is a normal or full-page heap block. The information has to be matched carefully with the offending call. For example, if a call to HeapFree is made with the address of a block plus four bytes, then you will get the corrupted block message. The block header will look fine, but the first byte after the end of the header (that is, the first byte after 0xDCBAxxxx) has a different address then the one in the call.

Note

  • Even if you have full-page heap enabled, you can get the corrupted block message if there is an "off-by-a-few-bytes" error because of the small fill pattern needed at end of allocations for alignment reasons. See "Unaligned allocations" earlier in this document.

Special fill pointers

The page heap manager fills the user allocation with values that look like kernel pointers (fill value is F0). This occurs when the block is freed and if the block is allocated, but no request is made for the block to be zeroed (fill value is E0 for normal page heap and C0 for full-page heap). The non-zeroed allocations are typical for malloc/new users. If there is an access violation where a read/write is attempted at addresses like 0xF0F0F0F0, 0xE0E0E0E0, 0xC0C0C0C0, then the test application has probably hit one of these cases.

A read/write at 0xF0F0F0F0 means that a block has been used after it was freed. You need to do some detective work to find out which block caused this. Inspect the stack trace of the failure and the code for the functions on the stack. Look for functions that make wrong assumptions about an allocation being available after it was freed.

A read/write at 0xE0E0E0E0 or 0xC0C0C0C0 means that the application did not initialize the allocation properly. Inspect the code of the functions in the current stack trace.


PageHeap Syntax
Overview | Notes | Syntax | Examples

PageHeap uses the following syntax:

One Step pageheap [/enable ProgramName] [/disable ProgramName] [/full | /size SizeStart SizeEnd | /address AddressStart AddressEnd | /dlls DLL [...Dll] | /random Probability] [/debug | /kdebug] [/backwards] [/unaligned] [/decommit] [/notraces] [/fault Rate [Timeout]] [/leaks] [/protect] [/no_sync] [/no_lock_checks]

Parameters

/enable ProgramName
Enables page heap with default settings. ProgramName is the name of the program including the file extension.
/disable ProgramName
Disables page heap. ProgramName is the name of the program including the file extension.
/full
Specifies page heap for all allocations. Full-page heap allocations are memory intensive and should only be used in conjunction with a specified allocation range or DLL for large-scale processes. For more information about the full-page heap method, see Choosing a Method to Investigate Heap Block Corruptions in PageHeap Notes.
/size SizeStart SizeEnd
Specifies PageHeap allocations for a size range. SizeStart and SizeEnd are decimal integers.
/address AddressStart AddressEnd
Allows page heap allocations only in blocks that are contained in the stack trace, captured at the moment of allocation, and only if the address also falls in the specified range of addresses. AddressStart and AddressEnd specify the address range to be searched on all allocation stack traces and are specified as hexadecimal numbers in "C" syntax (that is, 0xAABBCCDD). This parameter is not commonly used.

Note

  • The /address parameters works only on x86 architectures and is not always reliable due to the underlying stack trace capturing algorithms.
/dlls DLL
Allocates in full-page heap only if the request comes from certain DLLs, and redirects all imports for the specified DLL to page heap functions. DLL is the name of a binary file including its file extension. The following imported functions are redirected:
HeapAlloc/Free | GlobalAlloc/Free | LocalAlloc/Free
malloc/free | operator new/delete | operator new[ ]/delete[ ]
/random Probability
Allows page heap to decide randomly if the allocation will be made in full-page heap or in normal page heap. Probability is a decimal integer from 0 through 100, representing the probability of a full-page heap allocation, rather than a normal heap allocation. Probability of 100 is the equivalent of using the /full parameter. Probability of 0 is the equivalent of using normal page heap.
/debug
Automatically launches PageHeap under debugger "ntsd -g -G -x" and attaches to the process specified by the /enable parameter. For more information, see Automatically Attaching a Debugger When the Application Starts in PageHeap Notes.
/kdebug
Launches PageHeap under debugger "ntsd -g -G -d -x" and redirects debugger output to the kernel debugger if there is one attached. This paremeter is not commonly used.
/backwards
Places a non-accessible page at the beginning of an allocation, rather than the end of it. This enables PageHeap to find overruns at the start of the buffer, instead of end buffer overruns. Use /backwards only with the /full parameter.
/unaligned
Directs page heap manager to ignore the 8-byte alignment rule and always align the end of the allocation at a page boundary. For more information, see Unaligned Allocations in PageHeap Notes.

Note

  • Some applications make assumptions about 8-byte alignment and will stop working correctly with the /unaligned parameter. Internet Explorer is one such example.
/decommit
Enables the use of the reserved virtual space feature, instead of non-accessible committed pages, and therefore reduces memory overhead. For more information, see Uncommitted Pages for Full-Page Heap Allocations in PageHeap Notes.
/notraces
Specifies that no stack traces are collected.
/fault Rate [Timeout]
Simulates low memory conditions by introducing heap allocation errors into the application being tested (fault injection). Rate is an integer from 1 through 10000 representing the probability that an allocation will fail. Timeout is the number of seconds that fault injection is disabled after an application starts. For more information, see Fault Injection in PageHeap Notes.
/leaks
Checks for heap leaks when a process shuts down. The /leaks parameter is effective only when normal page heap is enabled (that is, not full-page heap). Therefore, when the /leaks parameter is specified, all flags that force full-page heap are disabled.
/protect
Protects heap internal structures. The /protect parameter can be used to detect random corruptions, but will slow execution.
/no_sync
Checks for unsynchronized access and causes page heap to break if it detects that a heap created with HEAP_NO_SERIALIZE flag is accessed from different threads. Do not use this flag for a process that has its own custom heap manager (for example, MPheap process). If a process has a custom scheme to synchronize access then this parameter will give false positives.

Notes

  • When run without options, PageHeap will print all page heap enabled applications and their specific options.
  • Enabling page heap does not affect any processes that are already running. If you need to use page heap for a process that is already running and cannot be restarted (for example csrss.exe or winlogon.exe), then you must restart your computer after page heap has been enabled for that process.
  • Page heap manager supports multiple simultaneous parameters. The following command is an example of this:
    pageheap /enable iexplore.exe /dlls jscript.dll vbscript.dll /size 40 56 /random 3
    This command allocates in full-page heap all allocations made by iexplore.exe in jscript.dll or vbscript.dll, plus all blocks in range 40-56 bytes, and all other allocations with a probability of 3 percent.
  • If you try to use conflicting parameters, then PageHeap will give you an error message that a parameter has been disabled because of incompatibility with another parameter.

Sample Usage

pageheap /enable csapp.exe
pageheap /enable csapp.exe /full
pageheap /enable csapp.exe /dlls ole32.dll mshtml.dll jscript.dll
pageheap /enable csapp.exe /full /size 20 36
pageheap /enable csapp.exe /full /random 25
pageheap /enable csapp.exe /full /backwards
pageheap /enable csapp.exe /full /unaligned
pageheap /enable csapp.exe /full /decommit


PageHeap Examples
Overview | Notes | Syntax | Examples

Example 1: Test an Application Using PageHeap

Your application (pheap-buggy.exe) seems to have a problem with the heap. To enable normal page heap checking for the application, thereby minimizing the memory requirements, type the following at the command line:

pageheap /enable pheap-buggy.exe

To make sure that the partial page heap is actually enabled, type the following at the command line:

pageheap

You should see output similar to the following, confirming that partial page heap is enabled for pheap-buggy.exe:

pheap-buggy.exe: page heap enabled with flags

Next you need to run the application in a debugger. Type the following at the command line:

ntsd -g -x pheap-buggy /CorruptAfterEnd

When the application fails, you will see output similar to the following:

===========================================================
VERIFIER STOP 00000008: pid 0xAA0: corrupted suffix pattern

        00C81000 : Heap handle
        00D81EB0 : Heap block
        00000100 : Block size
        00000000 :
===========================================================

Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00d81eb0 ecx=77f7e257 edx=0006fa18 esi=00000008 edi=00c81000
eip=77f7e098 esp=0006fc48 ebp=0006fc5c iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
77f7e098 cc               int     3

The header information contains the address of the heap where the corrupted block is (00C81000 : Heap handle), the address of the corrupted block itself (00D81EB0 : Heap block) and the size of the allocation (00000100 : Block size). It is clear that PageHeap caught an error in pheap-buggy.exe. To further investigate the cause of the error by turning on line number dumping, type the following in the debuger:

.lines

The following information is displayed:

Line number information will be loaded

To specify that you want a call stack, type the following in the debugger:

kb

You will see output similar to the following call stack:

ChildEBP RetAddr  Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0006fc5c 77f9e6dd 00000008 77f9e3e8 00c81000 ntdll!DbgBreakPoint
0006fcd8 77f9f3c8 00c81000 00000004 00d81eb0 ntdll!RtlpNtEnumerateSubKey+0x2879
0006fcfc 77f9f5bb 00c81000 01001002 00000010 ntdll!RtlpNtEnumerateSubKey+0x3564
0006fd4c 77fa261e 00c80000 01001002 00d81eb0 ntdll!RtlpNtEnumerateSubKey+0x3757
0006fdc0 77fc0dc2 00c80000 01001002 00d81eb0 ntdll!RtlpNtEnumerateSubKey+0x67ba
0006fe78 77fbd87b 00c80000 01001002 00d81eb0 ntdll!RtlSizeHeap+0x16a8
0006ff24 010013a4 00c80000 01001002 00d81eb0 ntdll!RtlFreeHeap+0x69
0006ff3c 01001450 00000000 00000001 0006ffc0 pheap-buggy!TestCorruptAfterEnd+0x2b [d:\nttest\base\testsrc\kernel\rtl\pageheap\pheap-buggy.cxx @ 185]
0006ff4c 0100157f 00000002 00c65a68 00c631d8 pheap-buggy!main+0xa9 [d:\nttest\base\testsrc\kernel\rtl\pageheap\pheap-buggy.cxx @ 69]
0006ffc0 77de43fe 00000000 00000001 7ffdf000 pheap-buggy!mainCRTStartup+0xe3 [crtexe.c @ 349]
0006fff0 00000000 0100149c 00000000 78746341 kernel32!DosPathToSessionPathA+0x204

Looking at this call stack, you see that this bug was caught when the function TestCorruptAfterEnd in pheap-buggy.exe tried to free an allocation at 0x00c80000 by calling HeapFree, which is just a redirect to RtlFreeHeap. You suspect that this "corrupted suffix pattern" break means that the application has violated a data integrity pattern after the end of its heap allocation. This leads you to believe that your code has written past the end of the buffer it allocated here. To quit the debugger so that you can look at your code, type the following in the debugger:

q

You look for the bug in your code, but you cannot find the problem. You decide to change PageHeap mode from normal to full and see if it can catch the misuse of this heap buffer at the exact time of misuse. To enable full-page heap for pheap-buggy.exe, type the following at the command line:

pageheap /enable pheap-buggy.exe /full

To make sure that full-page heap is actually enabled, type the following at the command line:

pageheap

You should see output similar to the following, confirming that full-page heap is enabled for pheap-buggy.exe:

pheap-buggy.exe: page heap enabled with flags (full traces )

To run pheap-buggy.exe in the debugger, type the following at the command line:

ntsd -g -x pheap-buggy /CorruptAfterEnd

When the application fails, you will see output similar to the following:

Page heap: process 0x5BC created heap @ 00880000 (00980000, flags 0x3)
ModLoad: 77db0000 77e8c000   kernel32.dll
ModLoad: 78000000 78046000   MSVCRT.dll
Page heap: process 0x5BC created heap @ 00B60000 (00C60000, flags 0x3)
Page heap: process 0x5BC created heap @ 00C80000 (00D80000, flags 0x3)
Access violation - code c0000005 (first chance)
Access violation - code c0000005 (!!! second chance !!!)
eax=00c86f00 ebx=00000000 ecx=77fbd80f edx=00c85000 esi=00c80000 edi=00c16fd0
eip=01001398 esp=0006ff2c ebp=0006ff4c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000206
pheap-buggy!TestCorruptAfterEnd+1f:
01001398 889801010000     mov     [eax+0x101],bl          ds:0023:00c87001=??

This time you have an access violation. To investigate the actual location of the access violation, you turn on line number dumping again by typing the following in the debuger:

.lines

The following information is displayed:

Line number information will be loaded

Once again you specify that you want a call stack by typing the following in the debugger:

kb

You will see output similar to the following call stack:

ChildEBP RetAddr  Args to Child
0006ff3c 01001450 00000000 00000001 0006ffc0 pheap-buggy!TestCorruptAfterEnd+0x1f [d:\nttest\base\testsrc\kernel\rtl\pageheap\pheap-buggy.cxx @ 184]
0006ff4c 0100157f 00000002 00c16fd0 00b70eb0 pheap-buggy!main+0xa9 [d:\nttest\base\testsrc\kernel\rtl\pageheap\pheap-buggy.cxx @ 69]
0006ffc0 77de43fe 00000000 00000001 7ffdf000 pheap-buggy!mainCRTStartup+0xe3 [crtexe.c @ 349]
WARNING: Stack unwind information not available. Following frames may be wrong.
0006fff0 00000000 0100149c 00000000 78746341 kernel32!DosPathToSessionPathA+0x204

You can see by the stack trace that the problem takes place at line 184 of pheap-buggy.exe ([d:\nttest\base\testsrc\kernel\rtl\pageheap\pheap-buggy.cxx @ 184]). Because you used a full-page heap, this time the call stack starts in your code, not in a system DLL. As a result the bug was caught as it happened instead of when the heap block was freed. To quit the debugger so that you can look at your code, type the following in the debugger:

q

Line 184 in pheap-buggy.cxx reads as follows:

*((PCHAR)Block + 0x100 + 1) = 0;

Looking at this code you see that the buffer is 0x100 bytes large, but you are trying to write to the 0x101th byte. You have identified the bug. It is an off-by-one error where you have written beyond the end of the memory allocation.


Qfixapp.exe: Quick Fix Application
Overview | Notes | UI | Examples

This GUI tool provides an interface for determining which combination of fixes will resolve an application compatibility problem for a selected executable (.exe) file. When your target file has a common name (for example, setup.exe), QFixApp provides the ability to identify a file using file properties and matching file information. This ensures that fixes are applied to the correct file. Once you have uniquely identified a target file, use QFixApp to identify which combinations of fixes allow that application to work on Windows XP.

Use CompatAdmin to create an SDB file to deploy your fix to other target computers.

Corresponding UI

QFixApp provides its own user interface. See QFixApp UI for more information.

Concepts

Applications that worked on earlier versions of Windows may fail to function properly on Windows XP. There are several reasons that this may happen:

  • The application refuses to run when Windows reports new, higher operating system version numbers. Often the application will work well on the new version of Windows if the user can get past this block in the application.
  • The application calls older versions of Win32 API functions that return unexpected values on computers with large amounts of resources such as disk free space.
  • The application expects older formats of Windows data.
  • The application expects user information (such as personal and temporary folders) to be in specific locations or specific formats.

System Requirements

The following are the system requirements for QFixApp:

  • Windows XP Home Edition
  • Windows XP Professional

Files Required

  • Qfixapp.exe
  • Sdbinst.exe (in the %windir%\System32 folder)


QFixApp Notes
Overview | Notes | UI | Examples

Identifying a Specific Executable

There might be more than one executable (.exe) file on any given computer with the same name (for example, setup.exe), but only one of those files should have the specified QFixApp fixes applied to it. Use QFixApp advanced features to control how the tool identifies target files.

To identify a specific executable file:

  1. Click Browse and select the application's executable file.
  2. Click Advanced to display QFixApp's advanced features.
  3. Select one or more of the properties listed in the Choose file identification attributes box.
  4. If there are not enough file properties to uniquely identify the target file, then click Add matching file.
  5. Select the files with which you want to associate your executable file.

Note

  • The remove matching file button allows you to remove unnecessary matching files. You can also remove the matching file by selecting the file and pressing the DELETE key.

Identifying Application Fixes

The QFixApp interface provides the ability to select an executable file and apply fixes to it. QFixApp also provides the ability to group sets of fixes so that a group of fixes can be applied to an executable file.

Applying Fixes to an Executable

To apply fixes to an executable file:

  1. Click Browse and select the application's executable file.
  2. Click the Fixes tab. This displays a list of each of the fixes currently available for applications on Windows XP.
  3. Select any combination of these fixes by checking the box next to each name.

Applying a Layer to an Executable

To apply a group of fixes to an executable file:

  1. Click Browse and select the application's executable file.
  2. Click the Layers tab. This displays a list sets of fixes currently available for applications on Windows XP.
  3. Select any layer by clicking on its name.

Testing an Application with Fixes

To test an application's executable file with one or more of the fixes:

  1. Click Browse and select the application's executable file.
  2. Add any required, command-line parameters in the Cmd line box.
  3. Select fixes by checking the appropriate boxes on the Fixes and/or Layers tab.
  4. Click Run.

Use Tasklist, a utility that is part of the Windows XP operating system, to display information on the application process started by QFixApp. The Tasklist output displays the DLLs normally used by the application, as well as any additional DLLs that implement the specified fix.

Understanding the QFixApp Output

QFixApp creates a log file called Qfixapp.log in the %WINDIR%\AppPatch folder. This file shows information about the QFixApp session. View the log by clicking View log in the QFixApp interface. The fix information is contained in a file that is created with the base name of the target application and an sdb extension. For example, information about Notepad.exe would be kept in a file named Notepad.sdb in the %windir%\AppPatch directory.

When QFixApp is closed, Windows XP will not continue to apply fixes to the application, even though the new files are not removed from the \AppPatch folder.

Note

  • If a fix is applied to an application executable file with QFixApp, and the application is then closed, the fix will still be applied to any new instances of that same executable file until QFixApp is closed. This feature allows the application of fixes to several executable files in the same QFixApp session.

Understanding the AppPatch Folder

Four DLLs located in the %WINDIR%\AppPatch folder contain all the fixes. The apphelp.sdb and sysmain.sdb files implement the AppHelp messages and application fixes supplied as part of Windows XP.

Note

  • When a fix is tested for an application with QFixApp, QFixApp adds new files to the folder.

    • When you create custom SDBs, QFixApp places these files in the AppPatch folder. For example, if you create an SDB for the setup file (Setup.exe) for application "ABC", QFixApp will place Setup.sdb in the AppPatch folder. If you create an SDB for application "XYZ" and the setup file for that application has the same name as the setup for application "ABC" (Setup.exe), then QFixApp will overwrite the Setup.sdb file from application "ABC" and replace it with Setup.sdb from application "XYZ".

    You should move SDB files out of the AppPatch folder before you create other SDB files with the same base names.

Deploying Fixes on Windows XP

QFixApp is intended to help determine which fixes to apply to an application. Once this is done, use Compatadmin to deploy the fixes for the application to other users' Windows XP computers. It is possible to use the .sdb file generated by QFixApp to deploy fixes for a single application to other target computers, but Compatadmin allows you to create a single .sdb file containing the fixes for multiple applications. Compatadmin also provides an interface for managing multiple .sdb files.


QFixApp UI
Overview | Notes | UI | Examples

The top of the QFixApp dialog box allows you to select the file to which you want to apply fixes and specify any required command-line parameters.

Top of QFixApp dialog box

Note

  • If you want to disable fixes in the system, the Application Compatibility Team strongly suggests that you use Compatadmin.

Fixes Tab

The Fixes tab shows each of the fixes that are currently available for applications on Windows XP. You can select any combination of these fixes by checking the box next to each name.

To get more information about a fix, select a fix and read the descriptive text in the Fix description box. You need not check a fix to read the description.

Note

  • Some of the descriptions refer to shims, an older term for application fixes.

Layers Tab

Many applications require the same sets of fixes to work well on Windows XP. The Layers tab groups sets of fixes so that you can apply them without selecting each fix separately. These groups are called layers or modes.

To see which fixes are used in each layer, select a layer on the Layers tab, then choose the Fixes tab. Each fix applied by the selected layer is checked on the Fixes tab.

Advanced Features

QFixApp uses several mechanisms to make sure that it applies fixes to the correct executable (.exe) file. The Advanced button provides access to additional QFixApp features that control how the tool identifies target files.

Advanced Features view

File Properties

QFixApp identifies up to sixteen properties in the target file and lists them in the Choose file identification attributes box. Sixteen properties are usually sufficient to uniquely identify any executable file. You can select one or more properties for the verification process.

File Matching

Some applications do not expose all sixteen properties. In some cases, the number of properties actually exposed may not be enough to uniquely identify fixes for a particular executable file in an application-rich environment.

QFixApp can use information for one or more additional files to help identify the target file. Click Add matching file to select additional files for verification. Selecting additional files instructs QFixApp to use that file information to help verify the target file. QFixApp will only apply fixes to the specified target file if it meets the criteria specified in the window on the right side of the QFixApp interface.

Note

  • If you mistakenly add a matching file that should not be used, you can delete it from the QFixApp interface. Select the matching file you want to delete and press the Delete key on the keyboard. QFixApp will remove the matching file.

Creating a Fix

When you have identified the layers or fixes that you want to apply to an application, you can use Create fix support to create an .sdb file; however, QFixApp gives you little control over this file. You cannot rename it, and it only contains the fix for the single application. QFixApp will ask if you want to install the SDB that you just created. Selecting Yes applies the selected fixes to the application when you run it. To remove this fix, in Control Panel, select Add/Remove Programs and remove the corresponding entry. The entries are named with the executable name followed by the words "custom database". As an example, Notepad would be labeled Notepad.exe custom database.

The Compatadmin tool has a fix wizard that adds your single fix to an SDB file. It also allows you to name the SDB file as well as providing an interface for building and managing SDB files.

Show XML

This is used by the Microsoft development team.


QFixApp Examples
Overview | Notes | UI | Examples

Example 1: Fix a Windows 95 Application

The following example uses QFixApp to fix the demoapp.exe file that ships with the Application Compatibility Toolkit.

Double click demoapp.exe in the following path:

c:\program files\Application Compatibility Toolkit\demoapp\demoapp.exe

The following error is displayed:

Demoapp.exe requires Windows 95.

Before you start using QFixApp, open a command window and type the following at the command line:

dir c:\windows\apppatch\*.*

This will show the files that are in the %WINDIR%\AppPatch folder by default. Your output will be similar to the following:

 Volume in drive C has no label.
 Volume Serial Number is E827-33AC

 Directory of C:\WINDOWS\AppPatch

05/11/2001  01:02 PM    <DIR>          .
05/11/2001  01:02 PM    <DIR>          ..
04/06/2001  05:00 AM           369,152 AcGenral.dll
04/06/2001  05:00 AM           231,936 AcLayers.dll
04/06/2001  05:00 AM            89,600 AcSpecfc.dll
04/06/2001  05:00 AM            54,272 AcXtrnal.dll
04/06/2001  05:00 AM           171,182 apphelp.sdb
04/06/2001  05:00 AM           713,946 sysmain.sdb
               6 File(s)      1,630,088 bytes
               2 Dir(s)   1,520,504,832 bytes free

The four DLLs located in the %WINDIR%/AppPatch folder contain the fixes. The two files, apphelp.sdb and sysmain.sdb, implement the AppHelp messages and application fixes supplied as part of Windows XP Professional.

To try fixes with demoapp.exe, run QFixApp. Click Browse and locate the demoapp.exe file. Select the Layers tab if it is not already selected. Since we know that the application requires Windows 95 to run, we'll start by selecting the Windows 95 layer.

You can see what fixes are included in this layer by clicking the Fixes tab. Select any fix, and without clearing the checkbox, read the description displayed in the Fix description text box.

To test the Windows 95 layer with the demoapp.exe application, click Run. This application does not require any command-line parameters, but if it did, we would type them into the Cmdline box.

Click Run to test demoapp. Now the following error is displayed:

Debug: couldn't load CVT32.DLL.

However, when you click OK to dismiss the error dialog box, the setup program appears to be ready to continue. Follow the rest of the installation process and the application will now run to completion. Choose to restart your computer later, and click Finish.

To see what files are now in the %WINDIR%\AppPatch folder, type the following at the command line in a command window:

dir c:\windows\apppatch

Your output will look similar to the following:

 Volume in drive C has no label.
 Volume Serial Number is E827-33AC

 Directory of c:\windows\apppatch

05/11/2001  01:57 PM    <DIR>          .
05/11/2001  01:57 PM    <DIR>          ..
04/06/2001  05:00 AM           369,152 AcGenral.dll
04/06/2001  05:00 AM           231,936 AcLayers.dll
04/06/2001  05:00 AM            89,600 AcSpecfc.dll
04/06/2001  05:00 AM            54,272 AcXtrnal.dll
04/06/2001  05:00 AM           171,182 apphelp.sdb
05/11/2001  01:57 PM             1,042 demoapp.xml
05/11/2001  01:57 PM             1,764 QFixApp.log
04/06/2001  05:00 AM           713,946 sysmain.sdb
05/11/2001  01:57 PM               650 systest.sdb
               9 File(s)      1,633,544 bytes
               2 Dir(s)   1,520,295,936 bytes free

There are now three additional files in the folder: systest.sdb (which contains the fixes that were applied to demoapp.exe), Qfixapp.log (which shows the fixes applied to the application during the test run), and demoapp.xml (which is list of the fixes being applied in xml format). As long as QFixApp is open, the fixes in systest.sdb will be applied to demoapp.exe when it is run.

Click View log to open the Qfixapp.log file. The contents will look similar to the following:

Expand to see Qfixapp.log Sample 1

-------------------------------------------
 Log  "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe"
-------------------------------------------
05/11/2001 13:25:11 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "C:\Program".
05/11/2001 13:25:11 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Files\Application".
05/11/2001 13:25:11 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Compatibility".
05/11/2001 13:25:11 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Toolkit".
05/11/2001 13:25:11 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "2\demoapp\demoapp.exe".
05/11/2001 13:25:11 MapMemoryB0000 3 - [NotifyFn] Created block at 0xB0000.
05/11/2001 13:25:11 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:25:11 EmulateGetCommandLine 1 - [GetCommandLineA] Changed "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe " to "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe ".
05/11/2001 13:25:11 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:25:11 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:25:11 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:25:11 Win95VersionLie 3 - [GetVersion] Return Win95.
05/11/2001 13:25:11 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:25:11 EmulateGetCommandLine 1 - [GetModuleFileNameA] Changed "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe" to "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe".
05/11/2001 13:25:11 EmulateBitmapStride 3 - [GetObjectA] width of scan lines from 426 to 428
05/11/2001 13:25:16 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:25:22 IgnoreLoadLibrary 3 - APIHook_LoadLibraryA Allow(CVT32.DLL)
05/11/2001 13:25:26 EmulateGetDiskFreeSpace 3 - [GetDiskFreeSpaceA] Called. Returning <=2GB FREE SPACE
05/11/2001 13:25:27 EMULATEGETCOMMANDLINE 1 - [GETMODULEFILENAMEA] CHANGED "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe" TO "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe".
05/11/2001 13:25:27 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES
    C:\PROGRA~1

05/11/2001 13:25:27 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:25:27 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:25:27 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:25:27 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:25:27 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:25:27 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMODLL.DLL
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMODLL.DLL

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS

05/11/2001 13:25:31 HANDLEREGEXPANDSZREGISTRYKEYS 3 - [REGQUERYVALUEEXW] CAUGHT REG_EXPAND_SZ KEY: "(null)".
05/11/2001 13:25:31 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO

05/11/2001 13:25:31 CORRECTFILEPATHS 1 - WINEXEC CORRECTED PATH:
    EXPLORER.EXE C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO
    EXPLORER.EXE C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO

05/11/2001 13:25:31 WINEXECRACECONDITIONFIX 3 - [WINEXEC] CALLED. RETURNING WITHOUT WAITING FOR NEW PROCESS TO START.
-------------------------------------------
 LOG  "C:\WINDOWS\explorer.exe"
-------------------------------------------
05/11/2001 13:25:31 EMULATECREATEPROCESS 1 - [EMULATECREATEPROCESS_PARSECOMMANDLINE] ILLEGAL COMMAND LINE SWITCH "C:\WINDOWS\explorer.exe".
05/11/2001 13:25:32 MAPMEMORYB0000 3 - [NOTIFYFN] CREATED BLOCK AT 0XB0000.
05/11/2001 13:25:32 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:25:32 EMULATEGETCOMMANDLINE 1 - [GETCOMMANDLINEA] CHANGED "explorer.exe C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\Programs\Compatibility Demo" TO "C:\WINDOWS\explorer.exe C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\Programs\Compatibility Demo".
05/11/2001 13:25:32 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:25:32 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:25:32 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:25:32 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYW ALLOW(COMCTL32.DLL)
05/11/2001 13:25:32 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:25:32 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYW ALLOW(COMCTL32.DLL)
05/11/2001 13:25:32 HANDLEREGEXPANDSZREGISTRYKEYS 3 - [REGQUERYVALUEEXW] CAUGHT REG_EXPAND_SZ KEY: "(null)".
05/11/2001 13:25:33 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYA ALLOW(CLBCATQ.DLL)
05/11/2001 13:25:33 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYA ALLOW(CLBCATQ.DLL)
05/11/2001 13:25:33 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYEXW ALLOW(SHELL32.DLL)
05/11/2001 13:25:33 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:25:33 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:33 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:33 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:33 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\DESKTOP
    C:\DOCUME~1\ALLUSE~1.WIN\DESKTOP

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\DESKTOP
    C:\DOCUME~1\ALLUSE~1.WIN\DESKTOP

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO README.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO README.LNK

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES
    C:\PROGRA~1

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:34 HANDLEREGEXPANDSZREGISTRYKEYS 3 - [REGQUERYVALUEEXW] CAUGHT REG_EXPAND_SZ KEY: "(null)".
05/11/2001 13:25:37 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO.LNK

05/11/2001 13:25:37 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO HELP.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO HELP.LNK

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:25:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\WINDOWS\DESKTOP\COMPATIBILITY DEMO.LNK
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\DESKTOP\COMPATIBILITY DEMO.LNK

05/11/2001 13:25:43 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

-------------------------------------------
 LOG  "C:\WINDOWS\notepad.exe"
-------------------------------------------

If you look through the output, you will see that the only fixes that were applied from the Windows 95 layer are CorrectFilePaths, EmulateBitmapStride, EmulateCreateProcess, EmulateGetCommandLine, EmulateGetDiskFreeSpace, HandleRegExpandSzRegistryKeys, IgnoreLoadLibrary, MapMemoryB0000, and Win95VersionLie.

Select the Fixes tab and click Clear to deselect the fixes associated with the Windows 95 layer. Instead, select only those fixes that were used.

As you select the fixes, read the description associated with each in the Fix description box. For example, you will notice that the description for the EmulateBitmapStride specifies that it is only used with Windows 2000. Since you are not applying a fix to an application on Windows 2000, deselect the EmulateBitmapStride fix.

When you have selected the remaining fixes from the list, click Run again. Dismiss the error dialog box and let the application run to completion. Choose to restart your computer later, and click Finish.

Click View log to open the new Qfixapp.log file. The contents will look similar to the following:

Expand to see Qfixapp.log Sample 2

-------------------------------------------
 Log  "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe"
-------------------------------------------
05/11/2001 13:29:59 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "C:\Program".
05/11/2001 13:29:59 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Files\Application".
05/11/2001 13:29:59 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Compatibility".
05/11/2001 13:29:59 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Toolkit".
05/11/2001 13:29:59 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "2\demoapp\demoapp.exe".
05/11/2001 13:29:59 MapMemoryB0000 3 - [NotifyFn] Created block at 0xB0000.
05/11/2001 13:29:59 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:29:59 EmulateGetCommandLine 1 - [GetCommandLineA] Changed "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe " to "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe ".
05/11/2001 13:29:59 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:30:00 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:30:00 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:30:00 Win95VersionLie 3 - [GetVersion] Return Win95.
05/11/2001 13:30:00 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:30:00 EmulateGetCommandLine 1 - [GetModuleFileNameA] Changed "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe" to "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe".
05/11/2001 13:30:05 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:30:11 IgnoreLoadLibrary 3 - APIHook_LoadLibraryA Allow(CVT32.DLL)
05/11/2001 13:30:15 EmulateGetDiskFreeSpace 3 - [GetDiskFreeSpaceA] Called. Returning <=2GB FREE SPACE
05/11/2001 13:30:16 EMULATEGETCOMMANDLINE 1 - [GETMODULEFILENAMEA] CHANGED "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe" TO "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe".
05/11/2001 13:30:16 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES
    C:\PROGRA~1

05/11/2001 13:30:16 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:30:16 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:30:16 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:30:16 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:30:17 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:30:17 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMODLL.DLL
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMODLL.DLL

05/11/2001 13:30:20 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS

05/11/2001 13:30:20 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:30:20 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:20 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO

05/11/2001 13:30:21 CORRECTFILEPATHS 1 - WINEXEC CORRECTED PATH:
    EXPLORER.EXE C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO
    EXPLORER.EXE C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO

-------------------------------------------
 LOG  "C:\WINDOWS\explorer.exe"
-------------------------------------------
05/11/2001 13:30:21 EMULATECREATEPROCESS 1 - [EMULATECREATEPROCESS_PARSECOMMANDLINE] ILLEGAL COMMAND LINE SWITCH "C:\WINDOWS\explorer.exe".
05/11/2001 13:30:21 MAPMEMORYB0000 3 - [NOTIFYFN] CREATED BLOCK AT 0XB0000.
05/11/2001 13:30:21 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:30:21 EMULATEGETCOMMANDLINE 1 - [GETCOMMANDLINEA] CHANGED "explorer.exe C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\Programs\Compatibility Demo" TO "C:\WINDOWS\explorer.exe C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\Programs\Compatibility Demo".
05/11/2001 13:30:21 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:30:21 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:30:21 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:30:21 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYW ALLOW(COMCTL32.DLL)
05/11/2001 13:30:21 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:30:21 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYW ALLOW(COMCTL32.DLL)
05/11/2001 13:30:23 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYA ALLOW(CLBCATQ.DLL)
05/11/2001 13:30:23 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:30:23 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYA ALLOW(CLBCATQ.DLL)
05/11/2001 13:30:23 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYEXW ALLOW(SHELL32.DLL)
05/11/2001 13:30:23 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\DESKTOP
    C:\DOCUME~1\ALLUSE~1.WIN\DESKTOP

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\DESKTOP
    C:\DOCUME~1\ALLUSE~1.WIN\DESKTOP

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO README.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO README.LNK

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES
    C:\PROGRA~1

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:23 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO.LNK

05/11/2001 13:30:26 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO HELP.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO HELP.LNK

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:30:29 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:30:32 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:30:33 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:30:33 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\WINDOWS\DESKTOP\COMPATIBILITY DEMO.LNK
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\DESKTOP\COMPATIBILITY DEMO.LNK

05/11/2001 13:30:33 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

-------------------------------------------
 LOG  "C:\WINDOWS\notepad.exe"
-------------------------------------------

This time when you look through the output, you will see that only seven of the eight selected fixes were applied: CorrectFilePaths, EmulateCreateProcess, EmulateGetCommandLine, EmulateGetDiskFreeSpace, IgnoreLoadLibrary, MapMemoryB0000, and Win95VersionLie. Click Run to test demoapp.exe again. Dismiss the error dialog box and let the application run to completion, choose to restart your computer later, and click Finish.

Click View log to open the new Qfixapp.log file. The contents will look similar to the following:

Expand to see Qfixapp.log Sample 3

-------------------------------------------
 Log  "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe"
-------------------------------------------
05/11/2001 13:46:16 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "C:\Program".
05/11/2001 13:46:16 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Files\Application".
05/11/2001 13:46:16 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Compatibility".
05/11/2001 13:46:16 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "Toolkit".
05/11/2001 13:46:16 EmulateCreateProcess 1 - [EmulateCreateProcess_ParseCommandLine] Illegal command line switch "2\demoapp\demoapp.exe".
05/11/2001 13:46:16 MapMemoryB0000 3 - [NotifyFn] Created block at 0xB0000.
05/11/2001 13:46:16 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:46:16 EmulateGetCommandLine 1 - [GetCommandLineA] Changed "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe " to "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe ".
05/11/2001 13:46:16 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:46:16 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:46:16 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:46:16 Win95VersionLie 3 - [GetVersion] Return Win95.
05/11/2001 13:46:16 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:46:16 EmulateGetCommandLine 1 - [GetModuleFileNameA] Changed "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe" to "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe".
05/11/2001 13:46:21 Win95VersionLie 3 - [GetVersionExA] Return Win95.
05/11/2001 13:46:27 IgnoreLoadLibrary 3 - APIHook_LoadLibraryA Allow(CVT32.DLL)
05/11/2001 13:46:32 EmulateGetDiskFreeSpace 3 - [GetDiskFreeSpaceA] Called. Returning <=2GB FREE SPACE
05/11/2001 13:46:33 EMULATEGETCOMMANDLINE 1 - [GETMODULEFILENAMEA] CHANGED "C:\Program Files\Application Compatibility Toolkit\demoapp\demoapp.exe" TO "C:\PROGRA~1\APPLIC~1\demoapp\demoapp.exe".
05/11/2001 13:46:33 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES
    C:\PROGRA~1

05/11/2001 13:46:33 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:46:33 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:46:33 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:46:33 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:46:34 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:46:34 CORRECTFILEPATHS 1 - COPYFILEA CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMODLL.DLL
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMODLL.DLL

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\DESKTOP.INI

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - CREATEDIRECTORYA CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO

05/11/2001 13:46:38 CORRECTFILEPATHS 1 - WINEXEC CORRECTED PATH:
    EXPLORER.EXE C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO
    EXPLORER.EXE C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO

-------------------------------------------
 LOG  "C:\WINDOWS\explorer.exe"
-------------------------------------------
05/11/2001 13:46:38 EMULATECREATEPROCESS 1 - [EMULATECREATEPROCESS_PARSECOMMANDLINE] ILLEGAL COMMAND LINE SWITCH "C:\WINDOWS\explorer.exe".
05/11/2001 13:46:38 MAPMEMORYB0000 3 - [NOTIFYFN] CREATED BLOCK AT 0XB0000.
05/11/2001 13:46:38 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:46:38 EMULATEGETCOMMANDLINE 1 - [GETCOMMANDLINEA] CHANGED "explorer.exe C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\Programs\Compatibility Demo" TO "C:\WINDOWS\explorer.exe C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\Programs\Compatibility Demo".
05/11/2001 13:46:38 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:46:38 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:46:38 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:46:38 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYW ALLOW(COMCTL32.DLL)
05/11/2001 13:46:38 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:46:38 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYW ALLOW(COMCTL32.DLL)
05/11/2001 13:46:40 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYA ALLOW(CLBCATQ.DLL)
05/11/2001 13:46:40 WIN95VERSIONLIE 3 - [GETVERSIONEXA] RETURN WIN95.
05/11/2001 13:46:40 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYA ALLOW(CLBCATQ.DLL)
05/11/2001 13:46:40 IGNORELOADLIBRARY 3 - APIHOOK_LOADLIBRARYEXW ALLOW(SHELL32.DLL)
05/11/2001 13:46:40 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\DESKTOP
    C:\DOCUME~1\ALLUSE~1.WIN\DESKTOP

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\DESKTOP
    C:\DOCUME~1\ALLUSE~1.WIN\DESKTOP

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.TXT

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO README.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO README.LNK

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\DESKTOP.INI
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES
    C:\PROGRA~1

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:40 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:43 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:46:43 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:43 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:43 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO.LNK

05/11/2001 13:46:44 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.HLP

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\DOCUMENTS AND SETTINGS\V-EVEGO.XP\START MENU\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO HELP.LNK
    C:\DOCUME~1\ALLUSE~1.WIN\STARTM~1\PROGRAMS\COMPATIBILITY DEMO\COMPATIBILITY DEMO HELP.LNK

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:46:47 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\WINDOWS\SYSTEM32
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\SYSTEM32

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - COMHOOK_ISHELLLINKA_SETPATH CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESTRINGW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO
    C:\PROGRA~1\COMPATIBILITY DEMO

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETFILEATTRIBUTESW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - GETPRIVATEPROFILESECTIONW CORRECTED PATH:
    C:\PROGRAM FILES\DESKTOP.INI
    C:\PROGRA~1\DESKTOP.INI

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - FINDFIRSTFILEEXW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - COMHOOK_IPERSISTFILE_SAVE CORRECTED PATH:
    C:\WINDOWS\DESKTOP\COMPATIBILITY DEMO.LNK
    C:\DOCUME~1\V-EVEGO.XP\WINDOWS\DESKTOP\COMPATIBILITY DEMO.LNK

05/11/2001 13:46:50 CORRECTFILEPATHS 1 - CREATEFILEW CORRECTED PATH:
    C:\PROGRAM FILES\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE
    C:\PROGRA~1\COMPATIBILITY DEMO\DEMOAPP\DEMOAPP.EXE

-------------------------------------------
 LOG  "C:\WINDOWS\notepad.exe"
-------------------------------------------

This time when you look through the output, you will see that the same seven fixes that were selected were applied: CorrectFilePaths, EmulateCreateProcess, EmulateGetCommandLine, EmulateGetDiskFreeSpace, IgnoreLoadLibrary, MapMemoryB0000, and Win95VersionLie.

Now that you know what fixes demoapp.exe requires to run, use Compatadmin to add these fixes to a custom .sdb file that you can deploy to other computers in your organization. If you want to create a single fix .sdb file, Example 2: Create a Single Fix .sdb File.

Example 2: Create a Single Fix .sdb File

The following example uses QFixApp to create a single fix .sdb file to allow you to distribute the fixes for the demoapp.exe file that ships with the Application Compatibility Toolkit. See Example 1: Fix a Windows 95 Application to determine what fixes the demoapp.exe file requires. This example assumes that you have already followed the steps listed in that example.

With the demoapp.exe file and its associated fixes selected, you now need to ensure that the target file is uniquely identified on the target computer(s).

Click Advanced. The QFixApp dialog box expands to show the file attributes that can be used to identify the target file. Demoapp.exe has a number of file properties that you can select. Additionally, you can click Add matching file and choose files that must exist in the same or related directories to provide additional information to uniquely identify the target file. Between the file attributes and the ability to select matching files, you should always have enough information to uniquely identify a target file.

Note

  • You do not need to uniquely identify the target executable file in QFixApp unless you intend to distribute the .sdb file containing the single fix made by QFixApp. The Application Compatibility Team strongly encourages you to use QFixApp to identify what fixes must be applied to an application and to use Compatadmin to create and manage the .sdb files that you deploy to other users.

Inspect the properties that are exposed for demoapp.exe.

Click Add matching file and browse to the c:\program files \application compatibility toolkit \demoapp folder. Select demoapp.hlp and click OK.

Note

  • Add demoapp.hlp as a matching file. Click the "Create Fix Support" button when you are ready to create the SDB.


This program could not start.

The operating system could not start this program. Some possible solutions are:

If your computer is on a network, contact your system administrator.

If a system administrator controls your computer, you should ask the administrator why you cannot start the program. Your administrator may have removed the program or set a policy that prevents you from starting it.

Install the necessary hardware.

Some programs are installed automatically when you install the hardware associated with them. To install new hardware click Start, point to Settings, click Control Panel, and then double-click Add Hardware.

Install the necessary software.

The program might not be installed on your computer because:

  • It is an optional component. To install optional components, click Start, point to Settings, click Control Panel, and then double-click Add or Remove Programs.
  • You have not installed the hardware that uses this program. To install new hardware click Start, point to Settings, click Control Panel, and then double-click Add Hardware.
  • If your computer is on a network, your system administrator may have removed this program or set a policy that prevents you from starting it.

Reinstall the program file.

The program file may have been accidentally deleted or corrupted. If you know the name of the file that is missing, you can copy the compressed version from the operating system installation compact disc to your hard drive, and then restore it by doing the following:

  1. Insert the installation compact disc.
  2. Click Browse the CD.
  3. In the folder list, open either the Alpha or I386 folder.
  4. Find the name of the missing file.

    NOTE: The last letter in the file name extension will be replaced by an underscore because it is a compressed version of the file. For example, notepad.exe is called notepad.ex_ on the installation compact disc.

  5. Copy the compressed file to your systemroot\System32 folder on your hard drive.
  6. Click Start, point to Programs, and then click Command Prompt.
  7. At the command prompt, type:

expand %systemroot%\system32\
my_file_name.ex_

%systemroot%\system32\
my_file_name.exe
    and then press ENTER.


This information is not available

The information you are trying to locate is not available on this computer.

Try the following Web sites:

  • Windows Resource Kits (http://go.microsoft.com/fwlink/?LinkId=291)
  • Microsoft Press (http://go.microsoft.com/fwlink/?LinkId=215)
  • Microsoft Windows (http://go.microsoft.com/fwlink/?LinkId=622)
  • Microsoft Product Support (http://go.microsoft.com/fwlink/?LinkId=281)
  • Microsoft Technet (http://go.microsoft.com/fwlink/?LinkId=170)
  • Microsoft MSDN (http://go.microsoft.com/fwlink/?LinkId=140)