Application compatibility cache

The Application compatibility cache can be found in the following Windows Registry keys.

In Windows 2000 and XP:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatibility

In Windows 2003 and later:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache

Note that several sources claim that the Application Compatibility Cache is part of the Application Compatibility Database. However unfortunately these claims are not backed by sources or facts. Since the previous article does not mention the relationship between the cache and the database, this document the Application Compatibility Cache to part of the Windows Application Compatibility subsystem instead.

Note that the actual difference between the Application Compatibility Cache and Shim (Database) Cache is currently unknown. Be aware that in other sources the terms can be used interchangeable. Since MSDN explicitly defines BaseFlushAppcompatCache and ShimFlushCache, there is likely a subtle difference to what data is cached. Also see: Understanding Shims.

Windows 2000

Windows 2000 stores Application Compatibility related data in subkeys in:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatibility

At this time it is unclear if these subkeys serve the same purpose as the AppCompatCache value in later versions of Windows.

The subkeys are named as the executable files e.g. Uninstall.exe and have been seen to contain the following values:

Name Data type Description
%NAME% Unknown (seen: x, 462)
DllPatch-%NAME% Unknown

Also seen values named like 00008 WindowsNT4.0.

Windows 2000 unknown value

The Windows 2000 unknown value is variable of size and consists of:

Offset Size Value Description
0 4 0x0000000c Unknown 1 (header size?)
4 4 Unknown 2 (empty values)
8 4 Unknown 3
12 4 Unknown 4

Contains additional data if “Unknown 4 > 0”

Empty?
00000000  0c 00 00 00 00 00 00 00  06 00 00 00 00 00 00 00  |................|

With data:
00000000  0c 00 00 00 00 00 00 00  06 00 00 00 04 00 00 00  |................|

00000010  10 00 00 00 00 00 00 00  00 00 15 00 ff ff ff ff  |................|
00000020  ff ff ff ff 0f 00 00 00                           |........(...A.u.|

Sting byte size followed by string:
00000020                           28 00 00 00 41 00 75 00  |........(...A.u.|
00000030  74 00 6f 00 43 00 41 00  44 00 20 00 41 00 70 00  |t.o.C.A.D. .A.p.|
00000040  70 00 6c 00 69 00 63 00  61 00 74 00 69 00 6f 00  |p.l.i.c.a.t.i.o.|
00000050  6e 00 00 00                                       |n.......|

00000050              00 00 00 00                           |n.......|

Windows 2000 DllPatch value

The Windows 2000 DllPatch value is variable of size and contains an UTF-16 little-endian formatted string with end-of-string character e.g. ‘shcmn.dll 7’.

It is currently unclear what the trailing number represents.

Windows XP

Windows XP stores the application compatibility cache in the value: AppCompatCache.

The value data consists of:

  • header

    • array of LRU cache entry index values

  • array of cache entries (suggested that the maximum is 92)

Note that 64-bit versions of Windows XP will use the Windows 2003 64-bit format.

Windows XP application compat cache header

The Windows XP application compat cache header is 400 bytes of size and consists of:

Offset Size Value Description
0 4 0xef, 0xbe, 0xad, 0xde Signature
4 4 Number of cached entries
8 4 Number of LRU array entries
12 4 Unknown (empty values)
16 ... LRU array
Contains 32-bit value of the index within the array of cache entries
Currently it is unclear if the top or the bottom of the array is the LRU
... ... Unknown (padding?)
Contains 0-byte values

Windows XP 32-bit application compat cache entry

The Windows XP 32-bit application compat cache entry is 552 bytes of size and consists of:

Offset Size Value Description
0 2 x ( MAX_PATH + 4 ) = 528 Path
UTF-16 little-endian string with end-of-character
Note that the unused bytes can contain remnant data
528 8 Last modification time
Contains a FILETIME
536 8 File size
544 8 Last update time
Contains a FILETIME

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows 2003

Windows 2003 stores the application compatibility cache in the value: AppCompatCache

The value data consists of:

  • header

  • array of cache entries (suggested that the maximum is 512)

  • string data

Windows 2003 application compat cache header

The Windows 2003 application compat cache header is 8 bytes of size and consists of:

Offset Size Value Description
0 4 0xfe, 0x0f, 0xdc, 0xba Signature
4 4 Number of cached entries

Windows 2003 32-bit application compat cache entry

The Windows 2003 32-bit application compat cache entry is 24 bytes of size and consists of:

Offset Size Value Description
0 2 Path size
2 2 Maximum path size
4 4 Path offset
The offset value is relative to the start of the header
8 8 Last modification time
Contains a FILETIME
16 8 File size

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows 2003 64-bit application compat cache entry

The Windows 2003 64-bit application compat cache entry is 32 bytes of size and consists of:

Offset Size Value Description
0 2 Path size
2 2 Maximum path size
4 4 Unknown (padding)
8 8 Path offset
The offset value is relative to the start of the header
16 8 Last modification time
Contains a FILETIME
24 8 File size

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows Vista and 2008

Windows Vista and 2008 store the application compatibility cache in the value: AppCompatCache

The value data consists of:

  • header

  • array of cache entries (suggested that the maximum is 1024)

  • string data

[NOTE] If the cache is empty it will only consists of a header.

Windows Vista application compat cache header

The Windows Vista application compat cache header is 8 bytes of size and consists of:

Offset Size Value Description
0 4 0xfe, 0x0f, 0xdc, 0xba Signature
4 4 Number of cached entries

Windows Vista 32-bit application compat cache entry

The Windows Vista 32-bit application compat cache entry is 24 bytes of size and consists of:

Offset Size Value Description
0 2 Path size
2 2 Maximum path size
4 4 Path offset
The offset value is relative to the start of the header
8 8 Last modification time
Contains a FILETIME
16 4 Insertion flags
20 4 Shim flags

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows Vista 64-bit application compat cache entry

The Windows Vista 64-bit application compat cache entry is 32 bytes of size and consists of:

Offset Size Value Description
0 2 Path size
2 2 Maximum path size
4 4 Unknown (padding)
8 8 Path offset
The offset value is relative to the start of the header
16 8 Last modification time
Contains a FILETIME
24 4 Insertion flags
28 4 Shim flags

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows 7 and 2008 R2

Windows 7 and 2008 R2 store the application compatibility cache in the value: AppCompatCache

The value data consists of:

  • header

  • array of cache entries (suggested that the maximum is 1024)

  • data

  • string data

Windows 7 application compat cache header

The Windows 7 application compat cache header is 128 bytes of size and consists of:

Offset Size Value Description
0 4 0xee, 0x0f, 0xdc, 0xba Signature
4 4 Number of cached entries
8 4 120 Unknown (size?)
12 116 Unknown (cache statistics?)

Windows 7 32-bit application compat cache entry

The Windows 7 32-bit application compat cache entry is 32 bytes of size and consists of:

Offset Size Value Description
0 2 Path size
The byte of the path without the end-of-string character
2 2 Maximum path size
The byte of the path with the end-of-string character
4 4 Path offset
The offset value is relative to the start of the header
8 8 Last modification time
Contains a FILETIME
16 4 Insertion flags
20 4 Shim flags
24 4 Data size
28 4 Data offset
The offset value is relative to the start of the header

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows 7 64-bit application compat cache entry

The Windows 7 64-bit application compat cache entry is 48 bytes of size and consists of:

Offset Size Value Description
0 2 Path size
The byte of the path without the end-of-string character
2 2 Maximum path size
The byte of the path with the end-of-string character
4 4 Unknown (padding)
8 8 Path offset
The offset value is relative to the start of the header
16 8 Last modification time
Contains a FILETIME
24 4 Insertion flags
28 4 Shim flags
32 8 Data size
40 8 Data offset
The offset value is relative to the start of the header

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows 8

Windows 8 store the application compatibility cache in the value: AppCompatCache

The value data consists of:

  • header

  • array of cache entries

Windows 8 application compat cache header

The Windows 8 application compat cache header is 128 bytes of size and consists of:

Offset Size Value Description
0 4 128 Header size (or cache entry array offset)
4 4 Unknown
8 120 Unknown

Windows 8.0 application compat cache entry

The Windows 8.0 application compat cache entry is variable bytes of size and consists of:

Offset Size Value Description
0 4 "00ts" Signature
4 4 Unknown
8 4 Cache entry data size
The size of the cache entry without the first 12 bytes
12 2 Path size
14 ... Path
UTF-16 little-endian string without end-of-character
... 4 Unknown (Insertion flags?)
... 4 Unknown (Shim flags?)
... 8 Last modification time
Contains a FILETIME
... 4 Data size
... ... Data

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows 8.1 application compat cache entry

The Windows 8.1 application compat cache entry is variable bytes of size and consists of:

Offset Size Value Description
0 4 "10ts" Signature
4 4 Unknown
8 4 Cache entry data size
The size of the cache entry without the first 12 bytes
12 2 Path size
14 ... Path
UTF-16 little-endian string without end-of-character
... 4 Unknown (Insertion flags?)
... 4 Unknown (Shim flags?)
... 2 Unknown
... 8 Last modification time
Contains a FILETIME
... 4 Data size
... ... Data

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Windows 10

Windows 10 store the application compatibility cache in the value: AppCompatCache

The value data consists of:

  • header

  • array of cache entries

Windows 10 application compat cache header

The Windows 10 application compat cache header is 48 bytes of size and consists of:

Offset Size Value Description
0 4 48 Header size (or cache entry array offset)
4 4 Unknown
8 4 Unknown (empty values)
12 4 Unknown
16 4 Unknown
20 16 Unknown (empty values)
36 4 Number of cached entries
40 8 Unknown (empty values)

The Windows 10 Creator update application compat cache header is 52 bytes of size and consists of:

Offset Size Value Description
0 4 52 Header size (or cache entry array offset)
4 4 Unknown
8 4 Unknown (empty values)
12 4 Unknown
16 4 Unknown
20 8 Unknown (empty values)
28 4 Unknown
32 8 Unknown (empty values)
40 4 Number of cached entries
44 8 Unknown (empty values)

Windows 10 application compat cache entry

The Windows 10 application compat cache entry is variable bytes of size and consists of:

Offset Size Value Description
0 4 "10ts" Signature
4 4 Unknown
8 4 Cache entry data size
The size of the cache entry without the first 12 bytes
12 2 Path size
14 ... Path
UTF-16 little-endian string without end-of-character
... 8 Last modification time
Contains a FILETIME
... 4 Data size
... ... Data

Note that the last modification time applies to that of the file e.g. for NTFS this is the last modified time of the file as stored in the $STANDARD_INFORMATION attribute.

Insertion flags

TODO describe

Value Identifier Description
0x00000001
0x00000002 Indicated as executed by CSRSS.EXE flag
Client/Server Runtime Subsystem (CSRSS)
0x00000004
0x00000008
0x00000010 Unknown (Seen in Windows 8.0, 8.1)
0x00000020 Unknown (Seen in Windows 8.0, 8.1)
0x00000040 Unknown (Seen in Windows 8.0, 8.1)
0x00000080 Unknown (Seen in Windows 8.0, 8.1)
0x00010000 Unknown (Seen in Windows 8.1)
0x00020000 Unknown (Seen in Windows 8.1)
0x00030000 Unknown (Seen in Windows 8.1)
0x00040000 Unknown (Seen in Windows 8.1)
0x00100000 Unknown (Seen in Windows 8.1)
0x00200000 Unknown (Seen in Windows 8.1)
0x00400000 Unknown (Seen in Windows 8.1)
0x00800000 Unknown (Seen in Windows 8.1)

Shim flags

TODO describe

Value Identifier Description
0x00000001 Unknown (Has data?)
0x00000020
0x00000100 Unknown (Seen in Windows 7)
0x00001000 Unknown (Seen in Windows 7, 8.0)
0x00010000 Unknown (Seen in Windows 8.0, 8.1)
0x00020000 Unknown (Seen in Windows 8.0)
0x00100000 Unknown (Seen in Windows 8.1)
0x00200000 Unknown (Seen in Windows 8.1)
0x01000000 Unknown (Seen in Windows 8.0, 8.1)
0x02000000 Unknown (Seen in Windows 8.0)
0x10000000 Unknown (Seen in Windows 8.1)

Data

TODO describe

Notes

https://technet.microsoft.com/en-us/library/cc787360(v=ws.10).aspx

Are these related?
0x00000001 MS-DOS-based program
0x00000002 OS/2-based program
0x00000004 Windows-based 16-bit program
0x00000008 Windows-based 32-bit program
0x0000000C Windows-based 16-bit and 32-bit program
0x0000000F Any version of a program
0x00000010 Return user name instead of computer name for GetComputerName.
0x00000020 Return Terminal Server build number instead of Windows 2000 build number for GetVersion.
0x00000040 Synchronize user .ini file to system version.*
0x00000080 Do not substitute user \Windows directory.**
0x00000100 Disable registry mapping for program or registry key.
0x00000200 Per-object user/system global mapping
0x00000400 Return system \Windows directory instead of user \Windows directory for GetWindowsDir.
0x00000800 Limit the reported physical memory for GlobalMemoryStatus.
0x00001000 Log object creation to file.
0x20000000 Do not put program to sleep on unsuccessful keyboard polling (Windows-based 16-bit programs only).

Related DLLs:

  • apphelp.dll; related to “AppHelp” functionality and Application Compatibility database

  • kernel32.dll; base cache management functionality

Is the Application compatibility cache in Windows also referred to as AppHelpCache?

AppHelp: https://msdn.microsoft.com/en-us/library/bb432181(v=vs.85).aspx

Different shim types? MSIE and RPC shim types?

Related Registry keys:

HKLM\Sofware\Microsoft\Windows NT\CurrentVersion\AppCompatFlags

Flushing the cache Windows Vista and later:

Rundll32.exe apphelp.dll,ShimFlushCache

Flushing the cache Windows XP and Windows Server 2003

Rundll32.exe kernel32.dll,BaseFlushAppcompatCache