68#define SHIMDATA_MAGIC 0xAC0DEDAB
69#define MAX_LAYER_LENGTH 256
202#define SDB_DATABASE_MAIN_SHIM 0x80030000
204#define SDBGMEF_IGNORE_ENVIRONMENT 0x1
222 ok(dwRead ==
size,
"Expected to read %u bytes, got %lu\n",
size, dwRead);
223 return dwRead ==
size;
247 if (peb.pShimData ==
NULL)
251 ok(dwRead ==
sizeof(mbi),
"Expected VQE to return %u, got %lu\n",
sizeof(mbi), dwRead);
252 if (dwRead ==
sizeof(mbi) || peb.pShimData ==
NULL)
268 static char proc_name[
MAX_PATH] = { 0 };
286 char buf[256] = { 0 };
300 ok(hsdb !=
NULL,
"Expected a valid handle\n");
304 TAGID tagid = 0xdeadbeef;
310 ret = pSdbTagRefToTagID(hsdb, trLayer, &
pdb, &tagid);
311 ok(
ret ==
TRUE,
"Expected pSdbTagRefToTagID to succeed\n");
315 ok(
pdb !=
NULL,
"Expected pdb to be a valid pointer\n");
316 ok(tagid != 0 && tagid != 0xdeadbeef,
"Expected tagid to be a valid tag id, was: 0x%x\n", tagid);
317 tag = pSdbGetTagFromTagID(
pdb, tagid);
318 ok(
tag == 0x700b,
"Expected tag to be 0x700b, was 0x%x\n", (
DWORD)
tag);
321 pSdbReleaseDatabase(hsdb);
346 ok(!
lstrcmpW(pShimData->
szModule, szShimEng),
"Expected pShimData->Module to be %s, was %s\n",
377 ok(!
lstrcmpW(pShimData->
szModule, szApphelp),
"Expected pShimData->Module to be %s, was %s\n",
401 ok(pShimData->
unknown == 0x14c,
"Expected pShimData->unknown to be 0x14c, was 0x%x\n", pShimData->
unknown);
409 ok(!
lstrcmpiW(pShimData->
szModule, szApphelp),
"Expected pShimData->Module to be %s, was %s\n",
440 skip(
"Yet another unknown shimdata variant...\n");
479 ok(!
lstrcmpiW(pShimData->
szModule, szApphelp),
"Expected pShimData->Module to be %s, was %s\n",
506 ok(pShimData !=
NULL,
"Expected pShimData\n");
519 ok(pShimData !=
NULL,
"Expected pShimData\n");
528 skip(
"Unknown shimdata (win10)\n");
547 static const char* layers[] = {
548 "256Color",
"NT4SP5",
"DisableNXHideUI",
"DisableNXShowUI",
549 "WIN2000SP3",
"640X480",
"HIGHDPIAWARE",
557 for (
n = 0;
n <= (
sizeof(layers) /
sizeof(layers[0])); ++
n)
568 ok(0,
"Unable to get process info (%u)!\n",
n);
575 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
576 ok(
info.AppCompatInfo ==
NULL,
"Expected AppCompatInfo to be NULL, was: %p\n",
info.AppCompatInfo);
579 ok(
info.pShimData ==
NULL,
"Expected pShimData to be NULL, was: %p\n",
info.pShimData);
593 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
594 ok(
info.AppCompatInfo ==
NULL,
"Expected AppCompatInfo to be NULL, was: %p\n",
info.AppCompatInfo);
595 ok(
info.pShimData !=
NULL,
"Expected pShimData to be valid, was NULL\n");
624 static const char* layers[] = {
625 "256Color",
"256Color",
"256Color",
"256Color",
626 "256Color",
"256Color",
"256Color",
"256Color" };
632 SetEnvironmentVariableA(
"__COMPAT_LAYER",
"256Color 256Color 256Color 256Color 256Color 256Color 256Color 256Color");
643 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
644 ok(
info.AppCompatInfo == 0,
"Expected AppCompatInfo to be 0, was: %p\n",
info.AppCompatInfo);
645 ok(
info.pShimData !=
NULL,
"Expected pShimData to be valid, was NULL\n");
664 ok(0,
"Unable to get process info!\n");
672 char layer[100] = { 0 };
673 WCHAR layerW[100] = { 0 };
674 strncpy(
layer, szLayerStart, szLayerEnd - szLayerStart);
682 return pSdbGetLayerTagRef(
g_LayerDB, layerW);
690 const char*
layer = layers, *nextlayer;
695 layer = nextlayer ? (nextlayer+1) :
NULL;
726 winetest_ok(
result->atrLayers[
n] == atrLayers[
n],
"Expected atrLayers[%u] to be %x, was %x\n",
749 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
816 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
823 const GUID rgGuidDB0 = {0x11111111, 0x1111, 0x1111, {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}};
827 "Expected input->dwLayerCount to be 1, was %u for %s\n",
830 "Expected input->dwCustomSDBMap to be 1, was %u for %s\n",
833 "Expected input->rgGuidDB[0] to be %s, was %s for %s\n",
838 "Expected output->dwLayerCount to be 0, was %u for %s\n",
841 "Expected output->dwCustomSDBMap to be 0, was %u for %s\n",
844 "Expected output->rgGuidDB[0] to be empty, was %s for %s\n",
859#define expect_layeronly (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_layeronly_imp
874 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
880 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
887 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
897 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
906 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
918 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
927 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
971#define RESET_CHECKRUNAPP_VARS()\
973 if (AppCompatData && AppCompatData != &Query) { RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData); } \
974 ExeType = IMAGE_FILE_MACHINE_I386; \
975 SxsDataSize = FusionFlags = Reason = 0; \
977 memset(&Query, 0, sizeof(Query)); \
978 AppCompatData = &Query; \
979 AppCompatDataSize = 123456; \
982#define CHECK_BASICS()\
985 ok(AppCompatData != NULL && AppCompatData != &Query, "Expected the pointer to be valid\n"); \
986 ok_hex(AppCompatDataSize, sizeof(SDBQUERYRESULT_VISTA)); \
987 ok(SxsData == NULL, "Expected the pointer to be NULL\n"); \
988 ok_hex(SxsDataSize, 0); \
989 ok_hex(FusionFlags, 0); \
993#define CHECKREASON(value, w10dum) (g_ModuleVersion < WINVER_WIN10 ? value : w10dum)
1003 if (pApphelpCheckRunAppEx_w7)
1010 if (pApphelpCheckRunAppEx_w10)
1038 const int kTestBits = 0x70503;
1040 if (!pApphelpCheckRunAppEx_w7 && !pApphelpCheckRunAppEx_w10)
1042 skip(
"No usable ApphelpCheckRunAppEx\n");
1051 DuplicatedEnv =
NULL;
1082 for (
n = 0;
n < 32; ++
n)
1084 ULONG ExpectedReason;
1085 if (!(kTestBits & (1<<
n)))
1088 ExpectedReason =
Reason = (1 <<
n);
1093 if (ExpectedReason == 2)
1095 else if (ExpectedReason == 0x100)
1096 ExpectedReason = 0x30000;
1098 ExpectedReason |= 0x30000;
1119 for (
n = 0;
n < 32; ++
n)
1121 ULONG ExpectedReason;
1123 if (!(kTestBits & (1<<
n)))
1125 ExpectedReason =
Reason = (1 <<
n);
1130 if (ExpectedReason == 2)
1132 else if (ExpectedReason == 0x100)
1133 ExpectedReason = 0x50000;
1134 else if (ExpectedReason == 0x400)
1135 ExpectedReason = 0x30400;
1137 ExpectedReason |= 0x50000;
1141 if (ExpectedReason != 0x30400)
1162 for (
n = 0;
n < 32; ++
n)
1164 ULONG ExpectedReason;
1165 if (!(kTestBits & (1<<
n)))
1168 ExpectedReason =
Reason = (1 <<
n);
1173 if (ExpectedReason == 2)
1175 else if (ExpectedReason == 0x100)
1176 ExpectedReason = 0x50000;
1177 else if (ExpectedReason == 0x400)
1178 ExpectedReason = 0x30400;
1180 ExpectedReason |= 0x50000;
1202 for (
n = 0;
n < 32; ++
n)
1204 ULONG ExpectedReason;
1206 if (!(kTestBits & (1<<
n)))
1208 ExpectedReason =
Reason = (1 <<
n);
1213 if (ExpectedReason == 2)
1215 else if (ExpectedReason == 0x100)
1216 ExpectedReason = 0x50000;
1217 else if (ExpectedReason == 0x400)
1218 ExpectedReason = 0x30400;
1220 ExpectedReason |= 0x50000;
1244 for (
n = 0;
n < 32; ++
n)
1246 ULONG ExpectedReason;
1247 if (!(kTestBits & (1<<
n)))
1250 ExpectedReason =
Reason = (1 <<
n);
1255 if (ExpectedReason == 0x100)
1294 for (
n = 0;
n < 32; ++
n)
1296 ULONG ExpectedReason;
1297 if (!(kTestBits & (1<<
n)))
1301 ExpectedReason =
Reason = (1 <<
n);
1306 if (ExpectedReason == 2)
1308 else if (ExpectedReason == 0x100)
1309 ExpectedReason = 0x50000;
1310 else if (ExpectedReason == 0x400)
1311 ExpectedReason = 0x30400;
1313 ExpectedReason |= 0x50000;
1336 for (
n = 0;
n < 32; ++
n)
1338 ULONG ExpectedReason;
1339 if (!(kTestBits & (1<<
n)))
1343 ExpectedReason =
Reason = (1 <<
n);
1348 if (ExpectedReason == 2)
1350 else if (ExpectedReason == 0x100)
1351 ExpectedReason = 0x50000;
1352 else if (ExpectedReason == 0x400)
1353 ExpectedReason = 0x30400;
1355 ExpectedReason |= 0x50000;
1367 if (AppCompatData && AppCompatData != &
Query)
1368 RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData);
1417 skip(
"Unknown apphelp.dll version %x, cannot determine which ApphelpCheckRunApp(Ex) function to use\n",
g_ModuleVersion);
1426 memset(&QueryOffset, 0,
sizeof(QueryOffset));
1435 ShimDataType = pSdbGetAppCompatDataSize(&QueryOffset);
1446 skip(
"SdbGetAppCompatDataSize not functional\n");
1471 skip(
"FIXME: apphelp:env tests invalid for non-x86 platforms.\n");
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
ACPI_SIZE strlen(const char *String)
char * strchr(const char *String, int ch)
#define SHIMREG_DISABLE_LAYER
DWORD get_host_winver(void)
DWORD get_module_version(HMODULE mod)
void silence_debug_output(void)
#define ok_hex(expression, result)
#define ok_int(expression, result)
static const WCHAR nameW[]
#define FILE_NON_DIRECTORY_FILE
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
@ ProcessBasicInformation
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
static LPCWSTR LPCWSTR LPCWSTR env
#define NT_SUCCESS(StatCode)
#define ReadProcessMemory(a, b, c, d, e)
#define GetProcAddress(x, y)
#define INVALID_HANDLE_VALUE
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
#define GetEnvironmentVariableA(x, y, z)
BOOL WINAPI FreeEnvironmentStringsW(IN LPWSTR EnvironmentStrings)
BOOL WINAPI DECLSPEC_HOTPATCH SetEnvironmentVariableA(IN LPCSTR lpName, IN LPCSTR lpValue)
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
BOOL WINAPI TerminateProcess(IN HANDLE hProcess, IN UINT uExitCode)
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
LPWSTR WINAPI DECLSPEC_HOTPATCH GetEnvironmentStringsW(void)
BOOL WINAPI DestroyEnvironmentBlock(IN LPVOID lpEnvironment)
BOOL WINAPI CreateEnvironmentBlock(OUT LPVOID *lpEnvironment, IN HANDLE hToken, IN BOOL bInherit)
struct _FileName FileName
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
#define FILE_SYNCHRONOUS_IO_NONALERT
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum GLuint GLint GLint layer
GLenum GLenum GLenum input
#define OBJ_CASE_INSENSITIVE
#define EXCEPTION_EXECUTE_HANDLER
unsigned __int64 * PULONG64
static DWORD g_ModuleVersion
static void Test_layers(WCHAR szApphelp[256])
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG PULONG64 PULONG SomeFlag2
#define SDB_DATABASE_MAIN_SHIM
HANDLE xOpenFile(WCHAR *ApplicationName)
#define CHECKREASON(value, w10dum)
static void Test_ApphelpCheckRunApp(WCHAR szApphelp[256])
LPCWSTR LPCWSTR LPCWSTR DWORD PSDBQUERYRESULT_VISTA pQueryResult
PVOID PVOID PWCHAR PVOID USHORT ExeType
static void Validate_ShimData_Win8(PVOID data, WCHAR szApphelp[256], size_t count, const char *layers[])
static BOOL get_shiminfo(HANDLE proc, test_RemoteShimInfo *info)
static void expect_layeronly_imp(SDBQUERYRESULT_VISTA *result, const char *layers, DWORD flags)
static void ValidateShim(TAGREF trLayer, const char *name)
static void Validate_ShimData_Win2k3(PVOID data, size_t count, const char *layers[])
static void Test_GetMatchingExe(void)
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
TAGREF PDB TAGID * ptiWhich
static BOOL call_ApphelpCheckRunApp(HANDLE FileHandle, PWCHAR ApplicationName, PVOID Environment, USHORT ExeType, PULONG Reason, PVOID *SdbQueryAppCompatData, PULONG SdbQueryAppCompatDataSize, PVOID *SxsData, PULONG SxsDataSize, PULONG FusionFlags)
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID * SdbQueryAppCompatData
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG SxsDataSize
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG PULONG64 SomeFlag1
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID * SxsData
static void Validate_ShimData_Win10(PVOID data, WCHAR szApphelp[256], size_t count, const char *layers[])
PSDBQUERYRESULT_VISTA PVOID * ppData
LPCWSTR LPCWSTR szModuleName
static const SDBQUERYRESULT_VISTA empty_result
static void Test_Shimdata(SDBQUERYRESULT_VISTA *result, const WCHAR *szLayer)
static void Validate_EmptyShimData_Win8(PVOID data)
static void Validate_EmptyShimData_Win10(PVOID data)
static HANDLE create_proc(BOOL suspended)
static void Validate_ShimData_WinVista(PVOID data, size_t count, const char *layers[])
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG FusionFlags
PVOID PVOID PWCHAR PVOID Environment
static void create_environ(const char *layers[], size_t num)
static const SDBQUERYRESULT_VISTA almost_empty
PVOID PVOID PWCHAR PVOID PVOID Unk3
static void Validate_ShimData_Win10_v2(PVOID data, WCHAR szApphelp[256], size_t count, const char *layers[])
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG SdbQueryAppCompatDataSize
LPCWSTR LPCWSTR LPCWSTR pszEnvironment
LPCWSTR LPCWSTR LPCWSTR DWORD dwFlags
static DWORD g_ShimDataSize
static BOOL readproc(HANDLE proc, LPVOID address, PVOID target, DWORD size)
PVOID PVOID PWCHAR ApplicationName
static void Test_repeatlayer(WCHAR szApphelp[256])
static void Validate_ShimData_Win7(PVOID data, WCHAR szApphelp[256], size_t count, const char *layers[])
#define RESET_CHECKRUNAPP_VARS()
TAGREF find_layer(const char *szLayerStart, const char *szLayerEnd)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToNtPathName_U(_In_opt_z_ PCWSTR DosPathName, _Out_ PUNICODE_STRING NtPathName, _Out_opt_ PCWSTR *NtFileNamePart, _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo)
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define FILE_READ_ATTRIBUTES
#define FILE_SHARE_DELETE
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define IMAGE_FILE_MACHINE_POWERPCFP
NTSTATUS NTAPI NtQueryInformationProcess(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_ PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength)
#define IsEqualGUID(rguid1, rguid2)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define offsetof(TYPE, MEMBER)
static __inline const char * wine_dbgstr_guid(const GUID *id)
void __winetest_cdecl winetest_ok(int condition, const char *msg,...)
WCHAR unk4[MAX_LAYER_LENGTH]
WCHAR processname[MAX_PATH]
SDBQUERYRESULT_VISTA Query
WCHAR szLayer[MAX_LAYER_LENGTH]
WCHAR szLayerEnv[MAX_LAYER_LENGTH]
char padding2[0x2ae+0x54+0x2a+0x16+0x16]
SDBQUERYRESULT_VISTA Query
WCHAR unk5[MAX_LAYER_LENGTH]
WCHAR szLayerEnv[MAX_LAYER_LENGTH]
WCHAR processname[MAX_PATH-2]
WCHAR szLayer[MAX_LAYER_LENGTH]
TAGREF atrLayers[SDB_MAX_LAYERS]
TAGREF atrExes[SDB_MAX_EXES_2k3]
GUID rgGuidDB[SDB_MAX_SDBS]
SDBQUERYRESULT_VISTA Query
WCHAR szLayer[MAX_LAYER_LENGTH]
SDBQUERYRESULT_VISTA Query
WCHAR szLayerEnv[MAX_LAYER_LENGTH]
WCHAR szLayer[MAX_LAYER_LENGTH]
WCHAR unk4[MAX_LAYER_LENGTH]
WCHAR processname[MAX_PATH]
SDBQUERYRESULT_VISTA Query
ULARGE_INTEGER AppCompatFlagsUser
ULARGE_INTEGER AppCompatFlags
ULARGE_INTEGER AppCompatFlagsUser
ULARGE_INTEGER AppCompatFlags
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
SIZE_T NTAPI VirtualQueryEx(IN HANDLE hProcess, IN LPCVOID lpAddress, OUT PMEMORY_BASIC_INFORMATION lpBuffer, IN SIZE_T dwLength)
DWORD WINAPI GetLastError(void)
_Inout_ PERBANDINFO * pbi