Sunteți pe pagina 1din 39

Page 1 of 39

Compatibility Solutions Spreadsheet: 16-Bit


Symptom Compatibility Fix Name Compatibility Fix Description
The installation program or WOWCFEX_PLATFORMVERSIONLIE Changes the information returned by GetVersionEx to return the version information
application expects to find the that the application expects. It does not change the major and minor versions that the
Microsoft® Windows® 95 or operating system returns.
Windows® 98 operating system
running.

The installation program or WOWCF2_HACKWINFLAGS Turns off a winflag bit to send Windows NT version information to the application. It
application expects to find the does not change the major or minor version returned by the operating system.
Microsoft® Windows NT®
operating system running.

The installation program or WOWCFEX_SP2CSDVERSIONLIE Returns the version information "Service Pack 2" to the application. It does not change
application expects to find Service the major or minor versions returned by the operating system.
Pack 2 installed.

The application window is hidden ForceSeparateVDM Adds the CREATE_SEPARATE_WOW_VDM flag to CreateProcess() function calls so that a
by a second window. separate VDM process is always created.

The application becomes WOWCF_NOWAITFORINPUTIDLE Prevents the application from waiting on a spawned process after calling LoadModule32.
unresponsive. Without this flag, the application waits for the new process to become idle before
continuing with its own thread. This might make it appear that the application has
stopped responding.

The application behaves WOWCF_USER_DDENOSYNC Prevents the application from synchronizing when sending DDE messages. Without this
unpredictably. flag, some applications can behave unpredictably.

A minimized application cannot be WOWCF2_FIXLUNATRAYRECT Fixes window placement problems that are caused by using themes. When themes are
restored. used, it is possible for an applications to calculate incorrect coordinates because a
themed window (using the UxTheme.lib library) will return different window coordinates
than a nonthemed window.

Messages are displayed behind WOWCF2_SETFOREGROUND Attempts to give the focus to the application displaying the message box.
the application.
A message indicates that a file WOWCF2_SYNCSYSFILE Redirects file open calls in the application from systemroot\system to
has not been found. systemroot\system32.
A message indicates that the WOWCFEX_DISPMODE256 Forces the display mode to 256 colors. It does not change the screen resolution.
application requires 256 colors.

A message indicates that the WOWCFEX_EATDEVMODEMSG Prevents the WM_DEVMODECHANGE message from being sent to the application. Some
application requires 256 colors. applications are unable to properly handle this message.

A general protection fault (GP WOWCFEX_FORCEINCDPMI Forces DOS Protected Mode Interface (DPMI) memory allocations to use increasing
fault) occurs. linear addresses.
A divide-by-zero error occurs. WOWCF2_DELAYTIMEGETTIME Corrects a divide-by-zero error that occurs when the results of two consecutive
timeGetTime() function calls are the same.
The Help file does not open. WOWCFEX_USEWINHELP32 Causes Winhlp32.exe to be substituted for Winhelp.exe.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 2 of 39

Compatibility Solutions Spreadsheet: Application Removal


Symptom Compatibility Fix Name Compatibility Fix Description
The application returns the DelayShowGroup Delays the Dynamic Data Exchange (DDE) command ShowGroup. Often, an application
"<DirName> refers to a location resumes before the group is visible, which causes problems if the application calls
that is unavailable…." error DeleteGroup before the group is visible. In this case, Wi ndows Explorer generates the
message when an application is following message: "DirName refers to a location that is unavailable. It could be on a
removed. hard drive on this computer, on a network, or on a different computer on your home
network. Check to make sure that the disk is properly inserted, or that you are
connected to the Internet or home network, and then try again. If it still cannot be
located, the information may have been moved to a different location."

During uninstallation, the LUARedirectReg_Cleanup Removes the registry entries that were redirected by the LUARedirectReg compatibility
application returns an error fix. The program that removes an application uses this compatibility fix when the
message stating that registry application installation program uses the LUARedirectReg fix.
entries cannot be removed.

Files are left behind after an LUARedirectFS_Cleanup Removes the redirected files that were written by the LUARedirectFS compatibility fix.
application has been uninstalled. This compatibility fix is useful for uninstall programs.

Files are left behind after an MoveWinInitRenameToReg Intercepts calls made to ExitWindowsEx, waits for DLL_PROCESS_DETACH, and then
application has been uninstalled. moves the contents of the [Rename] section of Wininit.ini to the registry using the
MoveFileEx function.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 3 of 39

Compatibility Solutions Worksheet: Clipboard


Symptom Compatibility Fix Name Compatibility Fix Description
The application does not perform EmptyClipboardtoSet Fixes an application that calls SetClipboardData (CF_TEXT) without emptying the Clipboard
copy or paste operations correctly. first.

When bitmaps are copied to or from EmulateClipboardDIBFormat Converts a high-color device-independent bitmap (DIB) to a 24-bit DIB when the DIB is copied
the Clipboard, the application returns to the Clipboard in CF_DIB format. On Windows 95, Windows 98, and the Microsoft®
the "Access violation" error message. Windows® Millennium Edition (Windows Me) operating system, a high-color DIB that is copied
to the Clipboard in the CF_DIB format is automatically converted to a 24-bit DIB. On the
Microsoft® Windows® 2000 and Windows® XP Professional operating systems, this conversion
does not occur. Some applications are designed to handle only 8-bit and 24-bit DIBs.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 4 of 39

Compatibility Solutions Spreadsheet: Color Palette


Symptom Compatibility Fix Name Compatibility Fix Description
The application window does not display IgnoreHungAppPaint Intercepts calls to the RegisterClass function and changes the window brush to
as expected at startup and during GetStockObject(HOLLOW_BRUSH). This prevents the USER process from painting
execution. over application windows if it detects they are unresponsive.

The application changes the system IgnoreSysColChanges Prevents the application from making system color changes that cannot be restored
colors. after the application terminates.
After the application switches tasks or PaletteRestore Helps the application track palette changes and maintain them through mode
modes, colors change. changes, because the palette state is lost during a mode change in Windows XP
Professional.
A palette error occurs. EmulateGetDeviceCaps Modifies the Windows XP Professional version of the GetDeviceCaps API so that its
behavior emulates the Windows 95 or the Windows 98 version of that function.

A palette error occurs when you quit the EmulateGetDeviceCaps Modifies the Windows XP Professional version of the GetDeviceCaps API so that its
application, and it returns the behavior emulates the Windows 95 or the Windows 98 version of that function.
"PM_free():Allocation 001B4498 failed
integrity check! (InitPalette)" error
message.

The application returns the "Unhandled EmulateDeleteObject Causes the version of DeleteObject in the Microsoft® Windows® XP operating
Error: User Category 10 Fatal Error: Code system to return a result of success, which emulates Windows 95 and Windows 98
2 Palette Error" message. behavior.

The palette is distorted. ForceDefaultSystemPaletteEntries Attempts to isolate Graphical Device Interface (GDI) palette operations from
DirectDraw to more closely emulate Windows 95 and Windows 98 behavior. In
Windows 95 and Windows 98, DirectDraw manipulates the palette directly without
using GDI. Windows NT and later operating systems use GDI, which yields different
results.

After the application switches tasks or PaletteRestore Helps the application track palette changes and maintain them through mode
modes, images appear corrupted. changes, because palette state is lost during a mode change in Windows XP
Professional.
After the application switches tasks or PaletteRestore Helps the application track palette changes and maintain them through mode
modes, the background turns black. changes, because palette state is lost during a mode change in Windows XP
Professional.
After the application switches tasks or PaletteRestore Helps the application track palette changes and maintain them through mode
modes, buttons disappear. changes, because palette state is lost during a mode change in Windows XP
Professional.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 5 of 39

Compatibility Solutions Spreadsheet: Display


Symptom Compatibility Fix Name Compatibility Fix Description
The application starts up in a 640x480 pixel Force640x480 Sets the screen display to 640x480 pixels when the process starts.
window and does not switch to full screen.

The application starts up in a 640x480 pixel Force640x480x16 Sets the screen display to 640x480 pixels with 16-bit color when the process
window and does not switch to full screen. starts.

The application starts up in a 640x480 pixel Force640x480x8 Sets the screen display to 640x480 pixels with 8-bit color when the process
window and does not switch to full screen. starts.

Most of the application window runs off the LazyReleaseDC Delays the actual release of a device context released by the ReleaseDC
desktop. function. Some applications written for Windows 95 and Windows 98 attempt to
use a device context that has already been released through a call to
ReleaseDC.
The application returns a message that Force8BitColor Forces the color depth of the display to 8-bit color (256 colors) when the
indicates that the display is corrupted. process starts.

Graphics are corrupted in full-screen mode. ForceDirectDrawEmulation Forces DirectDraw into emulation mode, in which pitch is directly scaled to
width. Some applications do not handle certain aspects of hardware
acceleration correctly. For example, they might assume that the pitch is always
double the width in 16-bit-per-pixel displays.

The application retruns a message that Force8BitColor Forces the color depth of the display to 8-bit color (256 colors) when the
indicates that 256 colors are required. process starts.

The application returns a message that ForceDisplayMode Takes a command line to specify the resolution for applications that require a
indicates that 256-color mode is required. specific resolution to run. The command-line options must specify the width (in
pixels), height (in pixels), and color depth (in bits). If the resolution is omitted,
the current system resolution is used. For example, if the command-line
options specify a setting of "1024,768,16", the application uses a setting of
1024 x 768 at a color depth of 16 bits. If the command-line options specify
",,16", the application uses the current system resolution but changes to 16-bit
color depth.

Introductory videos do not play. ForceDirectDrawEmulation Forces DirectDraw into emulation mode, in which pitch is directly scaled to the
width. Some applications do not handle certain aspects of hardware
acceleration correctly. For example, they might assume that the pitch is always
double the width in 16-bit-per-pixel displays.

The taskbar is visible when the application HideTaskBar Enables the application to use full-screen mode correctly. In Windows XP
is in full-screen mode. Professional, the WS_EX_CLIENTEDGE window style causes applications to run
with the taskbar visible. This might not be the expected behavior for some
applications running in full-screen mode.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 6 of 39

When the application switches modes, the IgnoreNoModeChange Causes Windows XP Professional to ignore irrelevant mode change requests
screen becomes blank. Pressing ALT+TAB from the application. This prevents the mode uniqueness value from changing.
restores the video display. If the mode uniqueness value changes, DirectDraw resets all of its objects,
even if the new mode is identical to the preceding mode.

When the application closes, the system ForceTemporaryModeChange Ensures that any mode changes the application makes are temporary. All mode
display mode changes. changes are reset when the application terminates.

When the application closes, the display EmulateUSER Modifies the SetWindowsHookEx, SetWindowLong, RegisterClass,
mode is not restored. ChangeDisplaySettings, ChangeDisplaySettingsEx, ToAscii, ToAsciiEx,
GetMessage, PeekMessage, and ShowWindow functions to emulate Windows 95
and Windows 98. In addition, this compatibility fix causes the palette state to
remain unchanged during a mode change.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 7 of 39

Compatibility Solutions Spreadsheet: Execution Failures


Symptom Compatibility Fix Name Compatibility Fix Description
Access violations occur regularly DisableBoostThread Disables the automatic boost that threads get when they are unblocked. Windows 95 and
during application execution. Windows 98 do this only on message objects and not on synchronization objects. The
command-line options are: +HigherMainThread or +LowerMainThread to change the main
thread priority, and +BoostMainThread to keep the automatic boost for the main thread.

The application shuts down HeapIgnoreMoveable If the original call to GlobalAlloc fails, calls GlobalAlloc again with the GMEM_MOVEABLE
unexpectedly during execution. flag removed. The heap manager in Windows NT version 4.0 and later operating systems
has a 64 KB limit on the number of movable blocks it can allocate. This compatibility fix is
superceded by EmulateHeap.

The application shuts down HeapLookasideFree Addresses potential problems with freeing heap memory by delaying the actual memory
unexpectedly during execution. freeing. Also checks to ensure that all heap memory free calls are made on the correct
heap.
The application shuts down HeapPadAllocation Addresses potential problems with memory allocation by allocating additional memory for
unexpectedly during execution. every call to the HeapAlloc function. By default, 256 bytes of extra memory are allocated.
This can be modified by the command line.

The application shuts down HeapValidateFrees Validates the calls to the HeapFree function to ensure that the specified pointer is in the
unexpectedly during execution. heap from which it was allocated.

The application shuts down LUARedirectFS Redirects files to SystemDrive\Documents and


unexpectedly when it accesses Settings\username\LocalAppData\Redirected\drive\filepath when the user does not have
configuration or user settings. Write permission.

The application periodically shuts down DisableScreenSaver Disables the screen saver when the application starts, and restores it when the application
unexpectedly, typically at the same terminates. This compatibility fix is useful for applications using the Microsoft® DirectX®
interval at which the screen saver is application programming interface (API), which do not work well with an active screen
set to activate. saver.

Access violations occur during normal EmulateHeap Emulates the functionality of the Windows 95 and Windows 98 heap manager. This
functioning as the heap becomes compatibility fix is the full implementation of the Windows 95 and Windows 98 heap
corrupted, causing the application to manager ported to Windows XP Professional.
become unresponsive.

An access violation occurs when the HeapForceGrowable Forces the heap to be growable when the HeapCreate function is called by setting the
application switches contexts. dwMaximumSize parameter to zero.

The application returns a "Runtime IgnoreVBOverflow Intercepts type checking code and ignores the type check. Some Microsoft® Visual Basic®
error 6" message when you install applications attempt to store 32-bit handles in a 16-bit variable. This works in Windows 95
add-ons to the application. and Windows 98, because most handles use only the lower 16 bits of that handle, but in
Windows NT and later operating systems, the handles often use the upper 16 bits of the
handle also.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 8 of 39

The application returns a "Runtime IgnoreVBOverflow Intercepts type checking code and ignores the type check. Some Visual Basic applications
error 6" message when you attempt to attempt to store 32-bit handles in a 16-bit variable. This works in Windows 95 and
use Help. Windows 98, because most handles use only the lower 16 bits of that handle, but in
Windows NT and later operating systems, the handles often use the upper 16 bits of the
handle also.

Executable programs designed to run LUARedirectReg Redirects the placement of registry entries to the subtree HKEY_CURRENT_USER when an
at Windows startup, such as application does not have the correct permissions. Applications might incorrectly attempt to
application toolbars, do not run for all write to the subkey HKEY_LOCAL_MACHINE.
users.

A default screensaver cannot be MoveIniToRegistry Moves .ini data into the registry. Some applications store data in .ini files instead of in the
applied. registry. This is a generic compatibility fix that is command-line driven.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 9 of 39

Compatibility Solutions Spreadsheet: Exit Failures


Symptom Compatibility Fix Name Compatibility Fix Description
Access violations occur when the EmulateHeap Emulates the functionality of the Windows 95 and Windows 98 heap manager. This compatibility fix is
application is closed. the full implementation of the Windows 95 and Windows 98 heap manager ported to Windows XP
Professional.
Access violations occur when the IgnoreFreeLibrary Ignores calls to the FreeLibrary function when certain dynamic-link library (DLL) files, such as
application is closed. User32.dll and Gdi32.dll, are released. Some applications will free DLL files that are still in use and
then attempt to make a call to a function exported by the DLL, which results in an access violation.

Access violations occur when the IgnoreLoadLibrary Prevents certain DLL files from being loaded with the LoadLibrary function to emulate Windows 95
application is closed. and Windows 98 behavior. This is useful for applications that have fallback mechanisms for features
that are not supported. In addition, this compatibility fix reduces the error mode so that library
problems cause an error message.

Access violations occur when the IgnoreCRTExit Prevents CRT shutdown routines from running.
application is closed.

Access violations occur when the IgnoreCRTExit Prevents CRT shutdown routines from running.
application is removed.

Access violations occur when dialog IgnoreCRTExit Prevents CRT shutdown routines from running.
boxes are canceled.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 10 of 39

Compatibility Solutions Spreadsheet: File I/O


Symptom Compatibility Fix Name Compatibility Fix Description
During installation or operation, the EmulateGetDiskFreeSpace Causes the Windows XP Professional version of GetDiskFreeSpace to emulate the
application reports the incorrect behavior of the GetDiskFreeSpace function on Windows 95 and Windows 98. If the true
amount of available disk space. free space is larger than 2 GB, GetDiskFreeSpace returns a free disk space value of 2
GB, which is the same value that Windows 95 and Windows 98 return. If the true
available disk space is less than 2 GB, the sector geometry is modified to emulate
Windows 95 and Windows 98.

When a user with a DBCS (double- RedirectDBCSTempPath Redirects the double-byte character set (DBCS) temp path to the single-byte character
byte character set) name starts the set (SBCS) temp path. With a DBCS user name logon, the temp path contains a DBCS
application, the application returns an path.
error message indicating that there
are problems with the user's temp
path.

The application returns the "The RedirectWindowsDirToSystem32 Redirects calls to the GetWindowsDirectory function to the GetSystemDirectory function
system file does not exist" error to account for differences in folder structure between Windows 95 or Windows 98 and
message. Windows XP Professional.

When you attempt to open certain EmulateWriteFile Causes the WriteFile function on Windows XP Professional to emulate the behavior of
Audio Video Interleaved (.avi) files, WriteFile on Windows 95 and Windows 98 when a NULL pointer is passed for lpBuffer.
the application returns the "Access On Windows 95 and Windows 98, WriteFile writes null characters when lpBuffer is NULL;
violation" error message. on Windows XP Professional, WriteFile fails if lpBuffer is NULL.

When you attempt to open a file, the RemoveOverlappedFlagFromCreateFile Removes the FILE_FLAG_OVERLAPPED flag from all CreateFile function calls when the
application stops responding. file target is a disk drive. Windows 95 and Windows 98 ignore this flag for disk types.

When you attempt to open a file, the RemoveReadOnlyAttribute Removes the read-only attribute from all directories. This is helpful for applications that
application says that the file is read- do not work when the shell folders are set to read-only.
only.
When you attempt to open a folder, RemoveReadOnlyAttribute Removes the read-only attribute from all directories. This is helpful for applications that
the application says that the file is do not work when the shell folders are set to read-only.
read-only.
When you move files or projects, the ChangeAuthenticationLevel Changes the COM Security Level from RPC_C_AUTHN_LEVEL_NONE to
application returns the "Access RPC_C_AUTHN_LEVEL_COMMON for applications written for Windows 95 and Windows
violation" error message. 98. This enables temporary elevation of the security context for an application.

The application returns the "File CorrectCreateEventName Replaces backslashes with an underscore, because the CreateEvent function in Windows
mapping not created" error message. XP Professional does not accept event names that contain a backslash as it did in
Windows 95 and Windows 98.

The application returns the "File EmulateCreateFileMapping On Windows 95 and Windows 98, the CreateFileMapping function automatically sets the
mapping not created" error message. SEC_COMMIT flag when the SEC_NOCACHE flag is set. On Windows XP Professional, the
function will fail. Adds the SEC_COMMIT flag to the CreateFileMapping function for
applications written for Windows 95 or Windows 98 that expect it to be present.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 11 of 39

When accessing a CD, the application EmulateCDFS Removes the read-only flag on Windows XP Professional CD-ROM directories from file
returns either the "Unable to locate operations and causes the application to ignore all sharing and write attributes in order
files" or the "Unable to install" error to emulate Windows 95 and Windows 98. This compatibility fix also handles the
message. differences in the CD attributes between Windows 95 or Windows 98 and Windows XP
Professional.

When accessing a CD, the application RemoveNoBufferingFlagFromCreateFile Removes the FILE_FLAG_NO_BUFFERING flag from all CreateFile function calls.
quits without generating an error
message.

The application returns the "Files do EmulateEnvironmentBlock Causes Windows XP Professional to return a smaller environment block from the
not exist" error message. GetEnvironmentStrings function. This reduces the chance of a buffer overrun, which
causes corruption.
Files are not found or error messages EmulateGetCommandLine Causes Windows XP Professional to return a smaller environment block from the
or paths are truncated. GetEnvironmentStrings function. This reduces the chance of a buffer overrun, which
causes corruption.
The Uninstall command fails to remove CorrectFilePathsUninstall Corrects file paths during application removal, if the file paths were corrected during
files and folders from program files. application installation. The program that is used to remove the application uses this
You need to use this fix with the compatibility fix when the installation program uses the CorrectFilePaths compatibility
CorrectFilePaths compatibility fix. fix.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 12 of 39

Compatibility Solutions Spreadsheet: Focus


Symptom Compatibility Fix Name Compatibility Fix Description
When the application starts, the ForceKeepFocus Ensures that when a window is no longer visible, another visible window from the current
configuration window is minimized. application is ready to take its place. Otherwise the application can lose focus altogether, which
is inconsistent with the behavior of Windows 95 and Windows 98.

The application window becomes ForceApplicationFocus Forces new windows to receive the focus and move to the foreground. Because of Windows XP
inactive. Professional window manager changes, applications might lose the focus and be unable to
regain it.
A message box becomes inactive. ForceMessageBoxFocus Intercepts calls made to the MessageBox function and adds the MB_SETFOREGROUND style to
force the resulting message box to be the foreground window.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 13 of 39

Compatibility Solutions Spreadsheet: Graphics Control


Symptom Compatibility Fix Name Compatibility Fix Description
When the application loads, the EmulateBitmapStride Modifies the GetObjectA function for a bitmap object to ensure that the scan line width is
graphics become corrupted. DWORD-aligned.

When a minimal installation of the ForceCDStop Stops applications written for Windows 95 or Windows 98 from trying to access the CD when
application is performed, graphics they are playing a movie or sound through the Media Control Interface (MCI). Note that this
are missing and video clips do not compatibility fix assumes that the application is running off on a single CD-ROM drive at a
play. time.

When the application starts, the ForceSimpleWindow Adjusts the CreateWindow function parameters to create a very simple window. This fixes
screen becomes blank. problems that occur when an application passes combinations of styles that had special
meaning on Windows 95 and Windows 98 but that are not supported on Windows XP
Professional.
When the application starts, the EmulateDirectDrawSync Hooks the mutex functions that DirectDraw uses to synchronize exclusive mode access and
screen becomes blank. ensures that all synchronization events happen on the same thread for applications written
for Windows 95 and Windows 98. DirectDraw can produce unstable results if the exclusive
mode is released from a thread other than the one that acquired it.

When the application starts, the WinExecRaceConditionFix Modifies the behavior of the WinExec function so that it does not wait for the launched
screen becomes blank. process input to become idle. Without this modification, some applications will destroy
themselves, without the input becoming idle, if they find another instance of the application
in existence. This causes WinExec to never return.

Either the introductory video does ForceSimpleWindow Adjusts the CreateWindow function parameters to create a very simple window. This fixes
not appear, or the application won't problems that occur when an application passes combinations of styles that had special
play in hardware mode. meaning in Windows 95 and Windows 98, but are unsupported in Windows XP Professional.

Inactive windows do not display as AlwaysActiveMenus Causes windows to remain active even in the background, so that they do not appear
expected. corrupted. In Windows XP Professional, inactive menus appear differently from those in the
active window. Some applications cannot handle this change.

Clicking on an active bitmap image CorrectBitmapHeader Corrects known bitmap headers that were acceptable in Windows 95 and Windows 98 but
causes the application to become are not in Windows XP Professional. To promote wider compatibility, Windows XP
unresponsive. Bitmap images do not Professional places greater restrictions on the format of bitmap headers.
load.

Instead of an icon, a shadowed block CorrectCreateIcon Intercepts calls made to the CreateIcon function, and zeros the alpha channel in lpbXORbits.
appears. This improves the display of certain icons in Windows XP.

When the application loads bitmaps, CorrectCreateSurface Attempts to correct the contents of the DDSCAPS structure in the DirectDraw CreateSurface
they do not display as expected. methods.

The characters of the Far East fonts CorrectFarEastFont Corrects the lfCharSet value in the LOGFONTA structure passed to the CreateFontIndirectA
do not display correctly. function to correctly display localized versions of East Asian characters. East Asian
applications written for Windows 95 or Windows 98 create fonts to display localized
characters by supplying only the font face name and letting the system pick up the correct
character set. To display the localized characters correctly in applications running on
Windows XP Professional, you must specify the correct character set.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 14 of 39

Pressing ESC returns you to a blank DelayWin95VersionLie Modifies the GetVersion and GetVersionEx functions so that they return version information
window+A12 rather than to the that resembles Windows 95 for a specified number of function calls. This is useful in cases
application menu. where some parts of an application are version-sensitive, but others are not.

Menu or list box contents do not DisableAnimation Disables menu and list box animation.
appear or they do not appear as
expected.
When you enable the FilterKeys DisableFilterKeys Disables the FilterKeys option at application startup and restores it when the application
option, the graphics do not display terminates.
as expected.

The application alternates between DisableThemes Temporarily disables the Windows XP Professional theme functionality for applications that
the currently applied themed view do not support the new display themes.
and the nonthemed view.

When the application runs under new DisableThemes Temporarily disables the Windows XP Professional theme functionality for applications that
themes, the standard message do not support the new display themes.
boxes do not appear.

The system buttons (Minimize and DisableThemes Temporarily disables the Windows XP Professional theme functionality for applications that
Close) do not work. do not support the new display themes.

The title bar of the application DisableThemes Temporarily disables the Windows XP Professional theme functionality for applications that
window hides the toolbars. do not support the new display themes.

Dialog boxes are truncated. DisableThemes Temporarily disables the Windows XP Professional theme functionality for applications that
do not support the new display themes.
Buttons overlap. DisableThemes Temporarily disables the Windows XP Professional theme functionality for applications that
do not support the new display themes.
When the application window is DisableThemes Temporarily disables the Windows XP Professional theme functionality for applications that
resized, it does not display as do not support the new display themes.
expected.
Text does not appear in the menu or EmulateDrawText Allows the DrawText function to accept out-of-range drawing rectangle values and then
in message boxes. convert them to acceptable values to emulate Windows 95 and Windows 98.

The application fails when it EmulateDrawText Allows the DrawText function to accept out-of-range drawing rectangle values and then
attempts to display the menu or convert them to acceptable values to emulate Windows 95 and Windows 98.
message boxes.
Bitmaps in the Autorun dialog boxes EmulateGetProfileString Causes the Windows XP Professional version of the GetProfileString function to strip trailing
do not display as expected. white space (including tabs) from the end of .ini file strings in order to emulate the behavior
of Windows 95 and Windows 98. In Windows XP Professional, the full line, including the
white space at the end, is returned. This sometimes results in files failing to load because
the filename is invalid.

The application scrolls text too EmulateGetStringType Causes the Windows XP Professional GetStringTypeA, GetStringTypeW, GetStringTypeExA,
rapidly. and GetStringTypeExW functions to emulate the Windows 2000 versions of these functions.

Typed text or text that should be EmulateTextColor Modifies the behavior of the SetTextColor and SetBkColor functions with regards to the
displayed on the menu buttons or in COLORREF structure. Windows 95 and Windows 98 allowed a color to be specified in a 16-bit
labels does not appear. value, and the GDI functions handled this color correctly. On Windows NT and later, the
colors must be in a true COLORREF format. This compatibility change converts the 16-bit
colors to true COLORREF values.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 15 of 39

The application does not display EnlargeGetObjectBufferSize Modifies the size of the buffer that holds the bitmap information in a call to GetObjectA.
graphics. Some applications hard-code this size to 10 when it should be SIZEOF(BITMAP).

A file cannot be inserted as an icon ExtractAssociatedIcon Strips the alpha channel from a 32 bpp icon to revert the icon to a 24 bits-per-pixel (bpp)
into another file. Attempting to do so icon. This compatibility fix applies to applications that use the ExtractAssociatedIcon function
produces an "Out of memory or call.
system resources" error.

An application's attempts to access FailObsoleteShellAPIs Hooks the GetProcAddress function and, when an obsolete, private shell32 function is
menus, specifically the File menu, retrieved by ordinal, returns a pointer to a stubbed-out version of the function that will
produces an "Access violation" error. always fail.

The menu and toolbar buttons are FakeThemeMetrics Forces a match between the menu and button colors when the system color for the menu
the wrong color. does not match the system color for the button face.

Typed text or text that is displayed EmulateTextColor Modifies the behavior of the SetTextColor and SetBkColor functions with regard to the
on the menu buttons or in labels is COLORREF structure. Windows 95 and Windows 98 allowed a color to be specified in a 16-bit
the wrong color. value, and the Graphics Device Interface (GDI) functions handled this color correctly. On
Windows NT and later, the colors must be in a true COLORREF format. This compatibility
change converts the 16-bit colors to true COLORREF values.

Menu commands are replaced with ForceDefaultSystemPaletteEntries Isolates GDI palette operations from DirectDraw in order to more closely emulate Windows
black boxes. 95 and Windows 98 behavior. In Windows 95 and Windows 98, DirectDraw manipulates the
palette directly without using GDI; on Windows NT version 3.1 and later, DirectDraw uses
GDI. Therefore, if an application mixes calls to GDI and DirectDraw palette operations, it
gets different results from Windows 95 and Windows 98 than it does from Windows NT 3.1
and later.

The application fails when it returns HeapDelayLocalFree Modifies the LocalFree function to delay the actual freeing of the memory. This helps
to the main menu. applications that are trying to use memory after it has been freed with the LocalFree
function.
The mouse pointer appears HideCursor Forces the ShowCursor function to act as an on/off function instead of incrementing or
unexpectedly. decrementing the display count. For example, calling ShowCursor(FALSE) will always force
the cursor to be hidden instead of just decrementing the display count.

A button or other control is LoadComctl32Version5 Intercepts calls to the CreateWindow, DialogBox, and CreateDialog functions to ensure that
corrupted. the Comctl32.dll library is loaded. By default, Comctl32.dll is not loaded until a function
exported by the DLL is actually called, and the common control window classes are not
registered until the DLL is loaded. As a result, an application will try to create a common
control that has not been registered because the DLL has not been loaded. Normally, an
application calls InitCommonControls or InitCommonControlsEx to load the DLL and register
the common control classes. This compatibility fix ensures that the DLL is loaded and that
the window classes are registered whenever the CreateWindow, CreateWindowEx,
DialogBox, or CreateDialog function is called.

Resizing a window causes the icons NoGdiBatching Disables the batching of GDI calls. The batching is manipulated with the GdiGetBatchLimit,
and other visual elements to GdiSetBatchLimit, and GdiFlush functions.
disappear.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 16 of 39

The application window flickers and NoShadow Disables windows shadow for the application.
is repeatedly refreshed.

The user interface is unresponsive. RemoveInvalidW2KWindowStyles Removes any window styles not supported by Windows XP Professional from calls made to
the CreateWindowEx function.
After you quit the application, the RestoreSystemCursors Resolves the problem of applications written for Windows 95 and Windows 98 that use the
system cursor is not restored. SetSystemCursor() function to restore the system cursor. Beginning with Windows NT, this
function works differently and will cause these applications to remove the cursor altogether.

Images, and the text associated with UnMirrorImageList Resolves the problem of applications written for Windows 95 and Windows 98 that use the
them, are displayed backwards. SetSystemCursor() function to restore the system cursor. Beginning with Windows NT, this
function works differently and will cause these applications to remove the cursor altogether.

When you insert an image file, the IgnoreLoadLibrary Prevents specified DLL files from being loaded by the LoadLibrary API, to emulate Windows
application returns an "Access 95 and Windows 98 behavior. This is useful for applications that have fallback mechanisms
violation" error message. for features that are not supported. In addition, this compatibility fix reduces the error mode
so that a library problem returns an error message.

When you modify an image, an DisableThemes Temporarily disables the Windows XP Professional theme functionality for applications that
access violation occurs. do not support the new display themes.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 17 of 39

Compatibility Solutions Spreadsheet: Installation Failures


Symptom Compatibility Fix Name Compatibility Fix Description
When you attempt to install the CorrectOpenFileExclusive Forces the OpenFile function to fail if the file is already open in order to emulate the
application, the application returns the behavior of Windows 95 and Windows 98.
"ComponentMoveData" error message.

When you attempt to perform a default EmulateGetProfileString Causes the Windows XP Professional version of the GetPrivateProfileString function to strip
installation, text in the Destination whitespace and comments from the end of the returned string.
Directory dialog box is unreadable.

When you attempt to install the CorrectVerInstallFile Corrects a problem that occurs in Windows XP Professional when the VerInstallFile function
application, the application returns "The is called. In some instances, the destination file might exist in the destination directory but
application or DLL have an 8.3 file name rather than the long file name. This compatiblity fix searches the
<drive>:\<%windir%>\system32\ole2.dl destination directory for either the long file name or the 8.3 file name to determine if the
l is not a valid Windows image" error destination file should be overwritten.
message.

When you attempt to install an EmulateCreateProcess Modifies the CreateProcess function to ensure that all parameters have acceptable values for
application using an Autorun file, the the Windows XP Professional implementation of the function. The Windows 95 and Windows
installation fails. 98 version of CreateProcess is more tolerant of invalid parameters.

Attempts to install the application with IgnoreOemToChar Modifies the OemToCharA function to ignore certain strings that are already in the American
InstallShield version 5.0 fail when names National Standards Institute (ANSI) format.
with East Asian characters are used.

The application appears to become KeepWindowOnMonitor Forces all windows to be displayed centered on the correct monitor. Can be used to prevent
unresponsive during setup because a windows from being moved off the screen.
dialog box containing an error message
occupies space beyond the visible
desktop.

The application fails to install. RedirectEXE When a process is created, automatically adds the process path to the PATH environment
variable, launches a new instance of the process with the updated environment, and
terminates the current process.
Setup fails unexpectedly. EmulateLZHandles Modifies the LZOpenFile function to ensure that the returned handle value is not zero. Also
modifies the LZClose, LZCopy, LZInit, LZRead, and LZSeek functions to properly use the
modified handle. Many applications assume that the return value of the LZOpenFile function
will be non-zero if the function is successful, but this is not the case. LZOpenFile returns an
internal handle to the file, and a value of zero is an acceptable handle value.

On a dual processor machine, an SingleProcAffinity When a process is created, automatically sets the process affinity mask to a single
application fails during installation or processor.
when you attempt to start it.

The application returns the "<x> not SyncSystemAndSystem32 Takes a semicolon-delimited command line of filenames. When the process terminates, the
installed correctly, please install again" DLL extracts each filename from the command line and ensures that the file exists in both
error message, where x is an application the \System directory and in the \System32 directory if it exists in either. Some older
component. applications expect certain DLLs to be in the \System directory, when in Windows NT 3.1
and later they belong in the \System32 directory (and vice versa).

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 18 of 39

The application cannot find a path during HandleDBCSUserName Places the application path in double quotation marks at GetCommandLineA. Applications fail
installation when a double-byte character when the application path name has high ASCII characters. If the application path is
set (DBCS) user name is used. enclosed in double quotation marks, the application can sometimes handle DBCS characters.

The application cannot find a path during HandleDBCSUserName2 Disables the DBCS feature of the CharNextA function if the string is a DBCS user profile.
installation when a DBCS user name is Some old non-DBCS applications handle characters by byte instead of by character. If the
used. application calls a DBCS-enabled Win32 function (for example, CharNextA), it breaks the
DBCS character at the second byte.

Access violations occur during installation. FileVersionInfoLie Modifies the GetFileVersionInfo and GetFileVersionInfoSize functions to return different
version information for DirectX version 6.1 components. This is helpful when applications
that were written for Windows 95 or Windows 98 were designed to use earlier versions of
DirectX.

During installation, when the application LimitFindFile Modifies the FindFile function to limit the depth, the number of subdirectories, or the
is searching for the presence of previous number of files that the function can return. Limits fully qualified paths and, optionally,
versions, an access violation occurs. limits relative paths. This compatibility fix can optionally return short file names.

When the application is installed, an RemoveBroadcastPostMessage Intercepts and removes broadcast messages to the application window process.
access violation occurs.

When the application is installed, an IgnoreFreeLibrary Ignores calls to the FreeLibrary function when certain DLL files, such as User32.dll and
access violation occurs. Gdi32.dll, are released. Some applications will free DLL files that are still in use and then
attempt to make a call to a function exported by the DLL, which results in an access
violation.
The application does not install from an HideDisplayModes Reduces the number of display modes reported by Windows XP Professional and stores that
Autorun file, causing an access violation. information in a fixed-length buffer in order to mimic the behavior of Windows 95 and
Windows 98.
During installation, the application returns FailOpenFile Causes the OpenFile function to fail for specified files. The file names to be prevented from
the "Cannot open files" error message. opening are supplied on the command line when this compatibility fix is used.

After you run the setup program, the DuplicateHandleFix Modifies the DuplicateHandle function to not set the lpTargetHandle out parameter to NULL
application returns the "Access violation" if the function fails. DuplicateHandle was changed from Windows 2000 to always set
error message. lpTargetHandle to NULL if the function fails.

The application returns the "Setup32: DeRandomizeExeName Ensures that an executable program that otherwise would be randomly named by the
This product does not support Windows application that performs the setup is named a specific name. The command line parameters
NT" error message. are the source name followed by the desired name with a semicolon to separate them. For
example: *.EXE;RANDOMSETUP.EXE.

The application returns the "Unknown DisableW2KOwnerDrawButtonStates Removes owner-draw button states that can be sent to an application during
button state" error message. WM_DRAWITEM messages for applications written for versions of Windows earlier than
Windows 2000, which do not expect this information.

You are notified that a certain DLL is EmulateGetProfileString Causes the Windows XP Professional version of the GetPrivateProfileString function to strip
required for installation. white space and comments from the end of the returned string.

The application returns the "Must be an ForceAdminAccess Modifies the CheckTokenInformation function to always return a value of TRUE in the
administrator to install" error message. IsMember parameter, even if the function is successful. The IsMember parameter normally
receives TRUE only if the token is a member and is enabled. Some applications use the
IsMember return value to determine the success of the CheckTokenInformation function.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 19 of 39

The Configuration menu is blank. After ForceWorkingDirectoryToEXEPath Modifies the system-implemented IShellLink::SetWorkingDirectory and IShellLink::SetPath
the application's setup program finishes, functions to always set the working directory of the shortcut to the executable path.
InstallShield fails.

If you do not register the application, the HeapLookasideFree Addresses potential problems when heap memory is freed by delaying the actual memory
application does not start. freeing. Also checks to ensure that all heap memory free calls are made on the correct
heap.
The application fails to start. RedirectEXE When a process is created, automatically adds the process path to the PATH environment
variable, launches a new instance of the process with the updated environment, and
terminates the current process.
When the application is started, an access RemoveBroadcastPostMessage Intercepts and removes broadcast messages to the application window process.
violation occurs.

The system fails to restart after you EnableRestarts Enables an application to call the ExitWindowsEx function with the correct security privileges
confirm the application's restart request. to restart the computer. On Windows 95 and Windows 98, applications could restart the
computer by calling the ExitWindowsEx function. Windows XP Professional requires that the
application run with adequate security privileges to use the ExitWindowsEx function to
restart the computer.

The application fails to register services. RedirectEXE When a process is created, automatically adds the process path to the PATH environment
variable, launches a new instance of the process with the updated environment, and
terminates the current process.
The Readme.txt file cannot be opened. HandleRegExpandSzRegistryKeys Modifies the RegQueryValueEx function for REG_EXPAND_SZ registry keys to automatically
expand the environment strings.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 20 of 39

Compatibility Solutions Spreadsheet: Keyboard Input


Symptom Compatibility Fix Name Compatibility Fix Description
When you attempt to type in logon AliasDXDC Returns the same device context (DC) for a particular drawing device returned by
information, the application returns DirectDraw, and then reverts the behavior when GDI functions are called. Windows 95,
the "Unexpected error" message. Windows 98, and Windows 2000 internally cache DirectDraw DC handles. This guarantees
that the same DC is returned for a device drawing area, regardless of how many times it
was released and acquired.

The application does not correctly DisableKeyboardCues Disables Keyboard Cues messages.
display the shortcut keys.

Using the ALT+TAB key combination IgnoreAltTab Disables ALT+TAB, the Windows key, CTRL+ESC, and ALT+ESC, because many applications
causes the application window to written for Windows 95 and Windows 98 were not designed to use these keys or key
become blank. combinations. Note that CTRL+ALT+DEL cannot be ignored in Windows XP Professional.

The application becomes IgnoreAltTab Disables ALT+TAB, the Windows key, CTRL+ESC, and ALT+ESC, because many applications
unresponsive when you use the written for Windows 95 and Windows 98 were not designed to use these keys or key
ALT+TAB key combination. combinations. Note that CTRL+ALT+DEL cannot be ignored in Windows XP Professional.

The application stops responding DisableStickyKeys Disables the Sticky Keys option at application startup, and reenables it when the application
when you use the SHIFT key, the terminates.
CTRL key, or the ALT key 5 times or
more in succession.

The keyboard locks up during normal EmulateUSER Modifies the following APIs to emulate Windows 95 and Windows 98: SetWindowsHookEx,
operation. SetWindowLong, RegisterClass, ChangeDisplaySettings/ChangeDisplaySettingsEx,
ToAscii/ToAsciiEx, GetMessage/PeekMessage, and ShowWindow. In addition, this
compatibility fix causes the palette state to persist through mode changes.

The keyboard is sluggish or doesn't LowerThreadPriority Modifies the SetThreadPriority function; if the new priority is
function at all, and the system THREAD_PRIORITY_TIME_CRITICAL, changes it to THREAD_PRIORITY_HIGHEST. Modifies
becomes generally unresponsive. the SetPriorityClass function; if the new priority is HIGH_PRIORITY_CLASS or
REALTIME_PRIORITY_CLASS, changes it to NORMAL_PRIORITY_CLASS.

This worksheet is associated with "Planning and Testing for Application Compatibility" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 21 of 39

Compatibility Solutions Spreadsheet: Multimedia


Symptom Compatibility Fix Name Compatibility Fix Description
Sounds do not play. DelayWinMMCallback Modifies the waveOutOpen and waveOutClose functions to override the caller-
specified waveOutProc function. Very few Windows functions can be called inside a
waveOutProc function, but some applications ignore this restriction. This fix
substitutes its own waveOutProc callback function and defers the calls to the original
callback function until it is safe to call other system functions.

No sound or limited sound plays. CorrectACMStreamOpen Modifies the acmStreamOpen function to provide a samples-per-block value that will
pass IMA ADPCM parameter validation.
Sounds do not play because the AddWritePermissionsToDeviceFiles Enables SecureROM applications to correctly open the sound devices by emulating
application does not detect sound Windows 95 and Windows 98. Forces device read/write permissions to match the
devices. permission necessary for all I/O controls.

The application cannot use the sound AddWritePermissionsToDeviceFiles Enables SecureROM applications to correctly open the sound devices by emulating
hardware, so it returns the “Sound Windows 95 and Windows 98. Forces device read/write permissions to match the
hardware already in use” error permission necessary for all I/O controls.
message.

Sounds do not play with Audio CorrectACMArgs Modifies the acmStreamConvert and acmStreamPrepareHeader functions to correct
Compression Manager drivers. cases where the cbSrcLength member of the ACMSTREAMHEADER structure is too
large.
The application returns the "Active CorrectActiveMoviePath Modifies the WinExec function to find when AMOVIE.OCX is started to play a movie
Movie Control: An object or name and reroutes the command to Windows Media Player in order to display the movie.
was not found" error message.

A message indicates that the sound CorrectSoundDeviceId Modifies the waveOutOpen, waveOutGetDevCaps, midiOutOpen, and
device driver failed to load. midiOutGetDevCaps functions to properly interpret the case where uDeviceID is
0xFFFF. In 16-bit windows, a uDeviceID value of 0xFFFF was used to identify the
WAVE_MAPPER. In 32-bit Windows, this value changed to 0xFFFFFFFF. This fix looks
for a uDeviceID value of 0xFFFF and converts it to 0xFFFFFFFF.

The sound loops perpetually, and the EmulatePlaySound Modifies the PlaySound and sndPlaySound functions to emulate the Windows 95 and
application does not always respond Windows 98 behavior of the function. If an application calls PlaySound with the
to shutdown requests. SND_LOOP flag, the sound plays continuously until PlaySound is called with a NULL
sound name. On Windows 95 and Windows 98, the sound also stops playing if a
different sound is played, but on Windows 2000, the original sound continues to play.
This fix emulates the Windows 95 behavior by causing the current sound to stop
playing when a different sound is played.

Audio Video Interleaved (.avi) files ForceAVIWindow Filters the calls made to MCI and causes them to execute in the existing target
continue to run behind the menu window. Some applications that use MCI to play AVI files send messages in a
screen. sequence that causes mciavi32 to continually reopen the window in which they are to
play.

This worksheet is associated with "Planning and Testing for Application Compatibility" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 22 of 39

The cursor freezes momentarily IgnoreMCISTOP Modifies the mciSendCommand function to ignore the MCI_STOP command. The
during background music changes. MCI_STOP command will be issued in response to the MC_CLOSE command. On
Windows 95 and Windows 98, the MCI_STOP command has a relatively fast response
time, but on Windows 2000 and Windows XP Professional, it can take several seconds
.

The application attempts to send WaveOutUsePreferredDevice Modifies the waveOutOpen and waveOutGetDevCaps functions to force the application
sound to the wrong device (usually to use the WAVE_MAPPER device instead of the device specified in the function. It is
to an audio card instead of to the safe to apply this compatibility fix only to applications that incorrectly attempt to open
desired USB devices). device 0 in order to open the default device.

This worksheet is associated with "Planning and Testing for Application Compatibility" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 23 of 39

Compatibility Solutions Spreadsheet: Network Connection


Symptom Compatibility Fix Name Compatibility Fix Description
The application automatically selects Serial DirectPlayEnumOrder Enables the DirectPlay devices to enumerate in the order that emulates Windows 95 and
Connection when you attempt to select a Windows 98. Some applications expect the DirectPlay devices to be enumerated in a specific
network connection. order.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 24 of 39

Compatibility Solutions Spreadsheet: Permissions


Symptom Compatibility Fix Name Compatibility Fix Description
Insufficient user rights produce LUATrackFS Identifies the directories that an application uses, and records those directory names in a
errors. file. This information can be used to determine the changes required to make the application
work for limited user accounts (LUA).

This worksheet is associated with "Planning and Testing for Application Compatibility" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 25 of 39

Compatibility Solutions Spreadsheet: Printing


Symptom Compatibility Fix Name Compatibility Fix Description
Access violations occur when the EmulatePrinter Emulates the behavior of Windows 95 and Windows 98 to compensate for a variety of
application starts or when it searches differences in the printer functions in Windows XP Professional. Most of the problems are
for printers. Consequently, the related to differences in the behavior of the EnumPrinters function in Windows 95, Windows
application returns error messages 98, and Windows XP Professional.
when you attempt to find, select, or
print to a printer.

The application shuts down ForceAnsiWindowProc Modifies the GetWindowLongA(GWL_WNDPROC) function to redirect the calls to the
unexpectedly when you attempt to GetWindowLongW function to get the GWL_WNDPROC value. In Windows XP Professional,
print. GetWindowLongA(GWL_WNDPROC) does not return the window procedure address directly.
The window procedure address supplied by GetWindowLongA(GWL_WNDPROC) is
reinterpreted when the address is passed to the CallWindowProc function. Some
applications, however, use the window procedure address directly and do not use
CallWindowProc. This compatibility fix forces the true window procedure address to always
be supplied. This fix also works correctly with the DWL_DLGPROC value.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 26 of 39

Compatibility Solutions Spreadsheet: Registry


Symptom Compatibility Fix Name Compatibility Fix Description
The application makes a call to a InjectDll Preloads required static DLL files for the application. Some applications use dynamically
statically loaded .dll file that has not loaded DLL files, which can issue calls to static DLL files before the application is ready. This
yet been loaded. compatibility fix takes a command line that contains a list of the DLL files that are affected.
The files are loaded in the order in which they are listed in the command line. This
compatibility fix is similar to DelayDllInit, which works with statically loaded DLL files.

When you use a limited user account LUARedirectFS Redirects files to SystemDrive\Documents and
(LUA), the application returns the Settings\username\LocalAppData\Redirected\drive\filepath when the application does not
error message "Failed to update have the appropriate user rights for writing.
system registry. Please try using
RegEdit."

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 27 of 39

Compatibility Solutions Spreadsheet: Start Menu and Shortcuts


Symptom Compatibility Fix Name
Shortcuts are not created for all CorrectFilePaths
users.

Shortcuts are not created for all LUARedirectReg


users.

A desktop shortcut is not created. ForceAnsiGetDisplayNameOf

Shortcuts are not removed for all CorrectFilePathsUninstall


users.

A valid and an invalid shortcut DelayShowGroup


appear on the Start menu during
application installation.

The application does not appear ProfilesEnvStrings


on the Start menu.

The application does not appear ProfilesGetFolderPath


on the Start menu.

The application does not appear ProfilesRegQueryValueEx


on the Start menu.

Shortcuts do not appear on the ProfilesEnvStrings


desktop.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 28 of 39

Shortcuts do not appear on the ProfilesGetFolderPath


desktop.

Shortcuts do not appear on the ProfilesRegQueryValueEx


desktop.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 29 of 39

patibility Solutions Spreadsheet: Start Menu and Shortcuts


Compatibility Fix Description
Corrects file paths that changed between Windows 95 or Windows 98 and Windows XP Professional. This
compatibility fix works by hooking into the file APIs and converting the file paths to the correct location for
Windows XP Professional. For example, a Windows 95 path of C:\Windows\Write.exe is converted to
C:\Windows\System32\Write.exe.
Relocates registry entries to the subtree HKEY_CURRENT_USER when an application does not have the correct
permissions for the subtree to which it is trying to write. Applications might incorrectly attempt to write to the
subkey HKEY_LOCAL_MACHINE.
Modifies the system-implemented IShellFolder::GetDisplayNameOf function to emulate Windows 95 and Windows
98 by returning an ANSI string instead of a Unicode string. When calling IShellFolder::GetDisplayNameOf, the
function specifies the type of string returned in the uType member of the STRRET structure. Some applications
assume that the string type will always be STRRET_CSTR, but on Windows NT, the string is supplied in the
STRRET_WSTR format. This fix allows an application that uses the IShellFolder::GetDisplayNameOf function and
assumes the returned string will be in the STRRET_CSTR format to work correctly.

Corrects file paths during application removal if the file paths were corrected during application installation. The
program to remove the application uses this compatibility fix when the installation program uses the
CorrectFilePaths compatibility fix.
Delays the return from the DDE command ShowGroup until the group is actually visible. Often an application
resumes before the group is visible, which can cause problems if the application issues the DeleteGroup command
before the group is visible.

Modifies the GetEnvironmentVariable and ExpandEnvironmentStrings functions to emulate Windows 95 and


Windows 98 by returning the ALLUSERSPROFILE environment variable when the USERPROFILE environment
variable is requested. Some applications use the USERPROFILE environment variable to install their application
shortcuts, which limits shortcut visibility to the user that performed the installation. By substituting the
ALLUSERSPROFILE environment variable, the shortcut will be visible to all users.

Modifies the SHGetFolderLocation, SHGetSpecialFolderLocation and SHGetFolderPath functions to substitute the


all-users version of a folder when a per-user folder is specified. Some setup applications mistakenly request a per-
user folder, such as CSIDL_PROGRAMS, when the all-users version of the folder, CSIDL_COMMON_PROGRAMS,
should be used.

Emulates Windows 95 and Windows 98 by returning a common path instead of the paths specified in the registry
subkey Shell Folders, so that the application is available to all users of the computer after installation. Some
applications attempt to directly read the Shell Folders subkey in HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER,
which returns the folders for the user performing the installation.

Modifies the GetEnvironmentVariable and ExpandEnvironmentStrings functions to emulate Windows 95 and


Windows 98 by returning the ALLUSERSPROFILE environment variable when the USERPROFILE environment
variable is requested. Some applications use the USERPROFILE environment variable to install their application
shortcuts, which limits shortcut visibility to the user that performed the installation. By substituting the
ALLUSERSPROFILE environment variable, the shortcut will be visible to all users.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 30 of 39

Modifies the SHGetFolderLocation, SHGetSpecialFolderLocation, and SHGetFolderPath functions to substitute the


all-users version of a folder when a per-user folder is specified. Some setup applications mistakenly request a per-
user folder, such as CSIDL_PROGRAMS, when the all-users version of the folder, CSIDL_COMMON_PROGRAMS,
should be used.

Emulates Windows 95 and Windows 98 by returning a common path instead of the paths specified in the registry
subkey "Shell Folders" so that the application is available to all users of the computer after installation. Some
applications attempt to read the registry entries in the "Shell Folders" subkey in HKEY_LOCAL_MACHINE or
HKEY_CURRENT_USER, which returns the folders for the user performing the installation.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 31 of 39

Compatibility Solutions Spreadsheet: Start-up Failures


Symptom Compatibility Fix Name Compatibility Fix Description
The setup program fails to install the HandleWvsprintfExceptions Modifies the wvsprintf function to emulate the function behavior on Windows 95 when
application. the arglist parameter is not valid.
The application cannot load. IgnoreDebugOutput Causes the OutputDebugString function to ignore any output that the application sends.
This type of debug information is not useful to an end user, and it slows application
performance under Windows XP Professional.

The application does not start after it EmulateGetStdHandle Modifies the GetStdHandle function to always return non-NULL handle values. Some
is installed. applications incorrectly assume that a handle with a value of NULL is not valid. This fix
prevents the handle value from being zero.

The application does not start, but StackSwap Modifies the way specified functions use the stack in order to emulate the stack usage
displays error messages or indicates on Windows 95. Some applications make assumptions about the stack usage of
that an access violation has operating system functions that do not hold true between Windows 95 and Windows NT.
occurred.

When starting, the application HeapPadAllocation Addresses potential problems with memory allocation by allocating additional memory
causes an access violation. for every call to the HeapAlloc function. By default, 256 bytes of extra memory is
allocated. This can be modified by the command line.

When you attempt to start the FailGetStdHandle Causes all calls to the GetStdHandle function from a specific application to fail.
application, it returns an error
message indicating that the
application is not installed.

When you attempt to start the EmulateGetStdHandle Modifies the GetStdHandle function to always return non-NULL handle values. Some
application, it returns an error applications incorrectly assume that a handle with a value of NULL is not valid. This fix
message indicating that the prevents the handle value from being zero.
application must be installed.

The application fails to start, and EmulateVerQueryValue Modifies the VerQueryValue function to accept a NULL value for the puLen parameter. In
returns an error message. Windows XP Professional, this is corrected in the function.

When the application is started AddWritePermissionsToDeviceFiles Forces device read/write permissions to match the permission necessary for all I/O
directly after setup is complete, it controls (IOCTLs). This compatibility fix enables SecureROM applications to correctly
returns the “No Disc Inserted” error open the sound devices.
message because it does not detect
the CD-ROM+A44 drive.

An access violation occurs when the EmulateGetDeviceCaps Modifies the GetDeviceCaps function in Windows XP Professional to behave in the same
application starts. way that it does in Windows 95 and Windows 98 when the NUMRESERVED capability is
requested.
When you start the application, it GlobalMemoryStatusLie Modifies the memory status structure so that it reports a swap file that is 400 MB
returns the "Computer memory full" regardless of the true swap file size.
error message.

When you attempt to start the VirtualRegistry Modifies all of the registry functions to allow virtual keys, redirection, and expansion
application, it returns the values.
"Component failed to be located"
error message.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Projects book. 19497860.xls
Page 32 of 39

The application stops responding HideDisplayModes Reduces the number of display modes reported in order to mimic the behavior of
immediately after starting. Windows 95 and Windows 98. Display modes are enumerated differently for Windows XP
Professional than they were on Windows 95 and Windows 98, causing problems for
applications that attempt to list all of the supported display modes and to store that
information in a fixed-length buffer.

The application quits immediately HeapClearAllocation Fills all heap-allocated memory for the application with zeros.
after starting.
The application becomes AddWritePermissionsToDeviceFiles Forces device read/write permissions to match the permission necessary for all IOCTLs.
unresponsive after starting. This compatibility fix enables SecureROM applications to correctly open the sound
devices.
The application becomes EmulateFindHandles Modifies the RemoveDirectory function to close any open FindFirstFile handles that are
unresponsive or closes unexpectedly open on the directory if the directory is empty. Some applications perform a FindFirstFile
shortly after starting. to find a directory, and then call RemoveDirectory to remove the directory. Because the
FindFirstFile handle has not been closed, RemoveDirectory fails, because it sees the
directory as being in use. This fix also ensures that the FindFirstFile handles are valid
before calling the FindNext or FindClose function.

When the application starts, it IgnoreCoCreateInstance Modifies the CoCreateInstance function to fail gracefully if a specific CLSID is specified.
returns an exception error.

When the application starts, it LoadLibraryCWD Emulates the behavior of older versions of Windows by loading from the current
returns the ".dll not compatible with directory first.
the application" error message.

A component or file is not correctly CorrectFilePathInSetDlgItemText Modifies the behavior of the SetDlgItemTextA function. If the string is
registered or is missing, or the "c:\windows\system\", regardless of case, the result of the GetSystemDirectory function
application returns an "Invalid" error is substituted.
message.

When the application starts, a IgnoreException Causes the application to ignore certain specified exceptions. By default, the only
window containing only a cursor exceptions ignored are privileged mode instructions, but any exception can be ignored
opens. with this compatibility fix.

The application returns the DelayDllInit Causes a delay in the static DLLs of the application. Some applications use static DLLs,
"Component failed to initialize" error which potentially issue calls to APIs before the application is ready. This compatibility fix
message. takes a command line containing a list of the DLLs affected. The DLLs are loaded in the
reverse order of the command-line listing. Note that this compatibility fix is similar to
InjectDll, which works with dynamically loaded DLLs.

When you start the application, it NoGhost Disables window ghosting for this application.
automatically minimizes, but sound
effects continue to play. The
application might or might not run
when selected from the taskbar.

Runtime errors occur when you start SetEnvironmentVariable Enables the application to set specific environment variables at application startup.
the application or when you start These variables are provided through a command line, and multiple environment
specific components. variables in the list should be separated by a pipe (|).

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Projects book. 19497860.xls
Page 33 of 39

When the application expects to find EmulateJoystick Retrieves JOYCAPS data for a given joystick number and copies the number of
a joystick, it quits unexpectedly. requested bytes to an application structure. If the return value is an error, this
compatibility fix fills the JOYCAPS structure with the same values from Windows 95 and
Windows 98.
When you attempt to start EmulateMissingEXE Modifies the CreateProcess, WinExec, FindFirstFile, FindFirstFileEx, IShellLink::SetPath,
executable programs, such as and IShellLink::SetArguments functions to redirect certain Windows 95 and Windows 98
Scandisk, Disk Defragmenter, and executable files to the Windows XP Professional equivalent. For example, Windows 95
Help, the application displays an contains an application with the file name Defrag.exe, which is used to defragment a
error message. hard drive. On Windows XP Professional, however, the disk defragment utility is
contained in a Microsoft Management Console (MMC) snap-in. This fix looks for the
following executable files and redirects them to the proper place on Windows XP
Professional: Start.exe, Scandskw.exe, Defrag.exe, Control.exe, Dxdiag.exe,
Winhelp.exe, Rundll.exe, and Pbrush.exe.

When the application runs on a high- EmulateSlowCPU Modifies the timeGetTime, QueryPerformanceCounter, and QueryPerformanceFrequency
end machine, its window is blank or functions to emulate the return values expected on slower processors that were in wide
it displays an "Access violation" error use with older versions of Windows.
message.

When you attempt to start two EmulateToolHelp32 Modifies the Process32First and Process32Next functions to address two problems. The
instances of the application, the first problem is that Windows XP Professional places the image name of the process in
application returns an error the szExeFile member of the PROCESSENTRY32 structure, whereas on Windows 95 and
message. Windows 98, the szExeFile member receives the path and file name of the module. This
compatibility fix converts the image name to a module file name that is compatible with
Windows 95. The second problem is that, on Windows XP Professional, the cntUsage
member of the PROCESSENTRY32 structure always receives zero, whereas on Windows
95 and Windows 98, the cntUsage member receives a non-zero value. This compatibility
fix always places the value 1 in the cntUsage member.

Starting the Safedisk program FailCloseProfileUserMapping Causes the CloseProfileUserMapping function call to fail. Applications written for older
causes access violations. versions of Windows require that the call fail. On Windows XP Professional, there is no
way for this function to fail. Note that this problem is computer-dependent.

Logging on and starting services FixServiceStartupCircularDependency Addresses circular dependencies that occur when two or more installed services depend
take a long time. upon each other to start.
The application returns a message ForceCDStop Stops applications written for Windows 95 or Windows 98 from trying to access the CD
asking that the correct CD be put in when they are playing a movie or sound through MCI. Note that this compatibility fix
the drive or stating that there is no assumes that the application is running off a single CD-ROM drive at a time.
CD in the drive.

The application fails to run its startup ForceCoInitialize Modifies the CoCreateInstance function to call CoInitialize(NULL) if COM has not been
movie (.avi file) and shuts down. initialized. Some multimedia applications on Windows 95 and Windows 98 call AVIFileInit
without first calling CoInitialize. On Windows XP Professional, the call fails.

The application returns the "DirectX ForceDXSetupSuccess Modifies the LoadLibrary, LoadLibraryEx, GetProcAddress, and FreeLibrary functions to
does not support the Windows provide stubs for the DirectXSetup and DirectXSetupGetVersion functions of the
version on the system" error Dsetup.dll and Dsetup32.dll libraries. Some applications built to use older versions of
message. DirectX encounter problems on Windows XP Professional.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Projects book. 19497860.xls
Page 34 of 39

The application does not run in ForceSimpleWindow Adjusts the CreateWindow function parameters to create a very simple window. This
hardware mode. fixes problems that occur when an application passes combinations of styles that had
special meaning in Windows 95 and Windows 98, but are not supported in Windows XP
Professional.

The Autorun menu does not appear. CorrectBitmapHeader Corrects known bitmap headers that were acceptable in Windows 95 and Windows 98
but are not in Windows XP Professional. To promote wider compatibility, Windows XP
Professional places greater restrictions on the format of bitmap headers than do
Windows 95 and Windows 98.

The Autorun dialog box does not get HandleAPIExceptions Modifies the BackupSeek, CreateEvent, GetFileAttributes, VirtualProtect,
refreshed after the application is GetTextExtentPoint32, GetMenuItemInfo, and wsprintf functions to fail gracefully.
installed, so that the option to start
the application is still disabled.

The application becomes IgnoreException Causes the application to ignore certain specified exceptions. By default, the only
unresponsive immediately after exceptions ignored are privileged mode instructions, but any exception can be ignored
starting. with this compatibility fix.

The application displays message IgnoreMessageBox Modifies the MessageBox function so that it does not display a message box if certain
boxes that give debugging or other caption and display text is specified.
extraneous information.

The application fails to start or IgnoreScheduler Handles scheduling problems, such as threads suspending or resuming themselves. It
performs slowly. also normalizes all thread and process priorities that starve other threads or processes.

The application does not start, and it LazyReleaseDC Delays the actual release of a device context released by the ReleaseDC function. Some
returns the "Desktop is running in 0 applications written for Windows 95 and Windows 98 attempt to use a device context
bit color mode" error message. that has already been released through a call to ReleaseDC.

The application does not start, or MapMemoryB0000 Maps a block of memory at the B0000 address for applications written for Windows 95
you get error messages when you and Windows 98 that require that a block of memory be mapped at that address.
attempt to start it.

When the application is run by a user PopulateDefaultHKCUSettings Populates HKEY_CURRENT_USER with the necessary default registry settings for the
other than the user who installed it, application. This enables applications that write these settings at installation to run for
it displays error messages such as other users.
"Cannot find <X>" (where x is a
folder or file that does exist on the
system) or "<X> components were
not found or are corrupt, run setup."

When you start the application, it RecopyExeFromCD Accepts a command line that tells it to recopy a file from the CD. Applications written for
returns the "Not a valid win32 Windows 95 and Windows 98 truncate some NULL bytes from an executable image.
application" or "Unable to run the Windows XP Professional performs image validation on files, and will fail if the image
command" error message. size changes.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Projects book. 19497860.xls
Page 35 of 39

An access violation occurs when you RemoveDDEFlagFromShellExecuteEx Modifies the ShellExecuteEx function to remove the SEE_MASK_FLAG_DDEWAIT flag.
attempt to start another program Some applications call ShellExecute, which in turn calls ShellExecuteEx with the
through the application by linking to SEE_MASK_FLAG_DDEWAIT flag set. This can sometimes cause synchronization
Windows components (Internet problems.
Explorer Web Links or Explorer.exe
folders, for example).

When the application attempts to SearchPathInAppPaths Modifies the SearchPath function so that it also searches in the registry subkey App
start Windows components (such as Paths, which is located in
Microsoft Paint), it returns the "File HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\.
or program cannot be found" error
message.

The application returns the "Files SetEnvironmentVariable Enables the application to set specific environment variables at application startup.
cannot be found or do not exist" These variables are provided through a command line, and multiple environment
error message. variables in the list must be separated by a pipe (|).

Entry-point errors occur for functions TerminateExe Terminates an executable program immediately after it starts.
within earlier versions of Cryptsys
and DirectX DLLs.

The application returns the error WinG32SysToSys32 Modifies the GetModuleFileName function and, when the module path and file name
message "WinG32.dll has been contain "\system\wing32.dll", modifies the path to point to the true system directory. If
incorrectly installed in the system the module path contains "system\wing32.dll", the WinG32.dll library posts a message
folder. Please move it to the box and fails.
system32 folder."

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Projects book. 19497860.xls
Page 36 of 39

Compatibility Solutions Spreadsheet: Telephony API (TAPI)


Symptom Compatibility Fix Name Compatibility Fix Description
A runtime error occurs in Mfc40.dll IgnoreTAPIDisconnect Removes the disconnect message from the queue. Some Telephony API (TAPI) applications
when the call is disconnected. do not correctly handle a disconnect message.

The phone dialer does not hang up. IgnoreTAPIDisconnect Removes the disconnect message from the queue. Some TAPI applications do not correctly
handle a disconnect message.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 37 of 39

Compatibility Solutions Spreadsheet: Versioning


Symptom Compatibility Fix Name Compatibility Fix Description
The application requests that Win95VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
Windows 95 be installed. for Windows 95.

The application requests that Win98VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
Windows 98 be installed. for Windows 98.

The application requests that WinNT4SP5VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
Windows NT 4.0 Service Pack 5 be for Windows NT 4.0 Service Pack 5.
installed.
The application requests that Win2000VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
Windows 2000 be installed. for Windows 2000.

The application requests that Win2000SP1VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
Windows 2000 Service Pack 1 be for Windows 2000 Service Pack 1.
installed.
The application requests that a Win2000VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
previous version of DirectX be for Windows 2000.
installed.
The application requests that a WinNT4SP5VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
previous version of DirectX be for Windows NT 4.0 Service Pack 5.
installed.
The application requests that a Win2000SP1VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
previous version of DirectX be for Windows 2000 Service Pack 1.
installed.
The application reports that it will Win95VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
not function on a Windows NT for Windows 95.
system.
The application reports that it will Win98VersionLie Modifies the GetVersion and GetVersionEx functions so that they return the version information
not function on a Windows NT for Windows 98.
system.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 38 of 39

Compatibility Solutions Spreadsheet: Window Management


Symptom Compatibility Fix Name Compatibility Fix Description
An unexpected dialog box appears. ForceShellLinkResolveNoUI Modifies the IShellLink::Resolve function to never display a user interface even when
the SLR_NO_UI flag is set in the parameters.
A dialog box does not come to the GiveupForeground Enables the dialog box for applications written for older versions of Windows to become
foreground; you must press ALT+TAB active if another application is active.
to see it.

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls
Page 39 of 39

Compatibility Solutions Spreadsheet: Miscellaneous


Symptom Compatibility Fix Name Compatibility Fix Description
A spawned process fails to operate properly, PropagateProcessHistory Adds the current process to the __PROCESS_HISTORY environment
although the parent process functions normally. variable, enabling child processes to look in the parent process directory
For example, Setup.exe works correctly, but the for matching information. This compatibility fix is typically needed when
spawned process, Setup2.exe, fails. a 32-bit program that unpacks files creates a temporary executable file
that requires a compatibility fix.

The application does not display system RemoveIpFromMsInfoCommandLine Modifies the CreateProcess function to remove the /p option when
information properly when you use the System Msinfo32.exe starts. This allows Msinfo32.exe to emulate its behavior
Info button in the About dialog box. on Windows NT 4.0 (it can print a blank page instead of displaying
system information).

This worksheet is associated with "Planning and Testing for Application Deployment" in the Planning, Testing, and Piloting Deployment Projects book. 19497860.xls

S-ar putea să vă placă și