68#define SHIMDATA_MAGIC 0xAC0DEDAB
69#define MAX_LAYER_LENGTH 256
176#define SDB_DATABASE_MAIN_SHIM 0x80030000
178#define SDBGMEF_IGNORE_ENVIRONMENT 0x1
196 ok(dwRead ==
size,
"Expected to read %u bytes, got %lu\n",
size, dwRead);
197 return dwRead ==
size;
221 if (peb.pShimData ==
NULL)
225 ok(dwRead ==
sizeof(mbi),
"Expected VQE to return %u, got %lu\n",
sizeof(mbi), dwRead);
226 if (dwRead ==
sizeof(mbi) || peb.pShimData ==
NULL)
242 static char proc_name[
MAX_PATH] = { 0 };
260 char buf[256] = { 0 };
274 ok(hsdb !=
NULL,
"Expected a valid handle\n");
278 TAGID tagid = 0xdeadbeef;
284 ret = pSdbTagRefToTagID(hsdb, trLayer, &
pdb, &tagid);
285 ok(
ret ==
TRUE,
"Expected pSdbTagRefToTagID to succeed\n");
289 ok(
pdb !=
NULL,
"Expected pdb to be a valid pointer\n");
290 ok(tagid != 0 && tagid != 0xdeadbeef,
"Expected tagid to be a valid tag id, was: 0x%x\n", tagid);
291 tag = pSdbGetTagFromTagID(
pdb, tagid);
292 ok(
tag == 0x700b,
"Expected tag to be 0x700b, was 0x%x\n", (
DWORD)
tag);
295 pSdbReleaseDatabase(hsdb);
316 ok(!
lstrcmpW(pShimData->
szModule, szApphelp),
"Expected pShimData->Module to be %s, was %s\n",
340 ok(pShimData->
unknown == 0x14c,
"Expected pShimData->unknown to be 0x14c, was 0x%x\n", pShimData->
unknown);
350 skip(
"Yet another unknown shimdata variant...\n");
389 ok(!
lstrcmpiW(pShimData->
szModule, szApphelp),
"Expected pShimData->Module to be %s, was %s\n",
416 ok(pShimData !=
NULL,
"Expected pShimData\n");
425 skip(
"Unknown shimdata (win10)\n");
444 static const char* layers[] = {
445 "256Color",
"NT4SP5",
"DisableNXHideUI",
"DisableNXShowUI",
446 "WIN2000SP3",
"640X480",
"HIGHDPIAWARE",
454 for (
n = 0;
n <= (
sizeof(layers) /
sizeof(layers[0])); ++
n)
465 ok(0,
"Unable to get process info (%u)!\n",
n);
472 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
473 ok(
info.AppCompatInfo ==
NULL,
"Expected AppCompatInfo to be NULL, was: %p\n",
info.AppCompatInfo);
476 ok(
info.pShimData ==
NULL,
"Expected pShimData to be NULL, was: %p\n",
info.pShimData);
486 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
487 ok(
info.AppCompatInfo ==
NULL,
"Expected AppCompatInfo to be NULL, was: %p\n",
info.AppCompatInfo);
488 ok(
info.pShimData !=
NULL,
"Expected pShimData to be valid, was NULL\n");
513 static const char* layers[] = {
514 "256Color",
"256Color",
"256Color",
"256Color",
515 "256Color",
"256Color",
"256Color",
"256Color" };
521 SetEnvironmentVariableA(
"__COMPAT_LAYER",
"256Color 256Color 256Color 256Color 256Color 256Color 256Color 256Color");
532 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
533 ok(
info.AppCompatInfo == 0,
"Expected AppCompatInfo to be 0, was: %p\n",
info.AppCompatInfo);
534 ok(
info.pShimData !=
NULL,
"Expected pShimData to be valid, was NULL\n");
549 ok(0,
"Unable to get process info!\n");
557 char layer[100] = { 0 };
558 WCHAR layerW[100] = { 0 };
559 strncpy(
layer, szLayerStart, szLayerEnd - szLayerStart);
567 return pSdbGetLayerTagRef(
g_LayerDB, layerW);
575 const char*
layer = layers, *nextlayer;
580 layer = nextlayer ? (nextlayer+1) :
NULL;
611 winetest_ok(
result->atrLayers[
n] == atrLayers[
n],
"Expected atrLayers[%u] to be %x, was %x\n",
634 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
685 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
692 const GUID rgGuidDB0 = {0x11111111, 0x1111, 0x1111, {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}};
696 "Expected input->dwLayerCount to be 1, was %u for %s\n",
699 "Expected input->dwCustomSDBMap to be 1, was %u for %s\n",
702 "Expected input->rgGuidDB[0] to be %s, was %s for %s\n",
707 "Expected output->dwLayerCount to be 0, was %u for %s\n",
710 "Expected output->dwCustomSDBMap to be 0, was %u for %s\n",
713 "Expected output->rgGuidDB[0] to be empty, was %s for %s\n",
728#define expect_layeronly (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_layeronly_imp
743 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
749 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
756 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
766 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
775 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
787 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
796 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
840#define RESET_CHECKRUNAPP_VARS()\
842 if (AppCompatData && AppCompatData != &Query) { RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData); } \
843 ExeType = IMAGE_FILE_MACHINE_I386; \
844 SxsDataSize = FusionFlags = Reason = 0; \
846 memset(&Query, 0, sizeof(Query)); \
847 AppCompatData = &Query; \
848 AppCompatDataSize = 123456; \
851#define CHECK_BASICS()\
854 ok(AppCompatData != NULL && AppCompatData != &Query, "Expected the pointer to be valid\n"); \
855 ok_hex(AppCompatDataSize, sizeof(SDBQUERYRESULT_VISTA)); \
856 ok(SxsData == NULL, "Expected the pointer to be NULL\n"); \
857 ok_hex(SxsDataSize, 0); \
858 ok_hex(FusionFlags, 0); \
862#define CHECKREASON(value, w10dum) (g_ModuleVersion < WINVER_WIN10 ? value : w10dum)
872 if (pApphelpCheckRunAppEx_w7)
879 if (pApphelpCheckRunAppEx_w10)
907 const int kTestBits = 0x70503;
909 if (!pApphelpCheckRunAppEx_w7 && !pApphelpCheckRunAppEx_w10)
911 skip(
"No usable ApphelpCheckRunAppEx\n");
920 DuplicatedEnv =
NULL;
951 for (
n = 0;
n < 32; ++
n)
953 ULONG ExpectedReason;
954 if (!(kTestBits & (1<<
n)))
957 ExpectedReason =
Reason = (1 <<
n);
962 if (ExpectedReason == 2)
964 else if (ExpectedReason == 0x100)
965 ExpectedReason = 0x30000;
967 ExpectedReason |= 0x30000;
988 for (
n = 0;
n < 32; ++
n)
990 ULONG ExpectedReason;
992 if (!(kTestBits & (1<<
n)))
994 ExpectedReason =
Reason = (1 <<
n);
999 if (ExpectedReason == 2)
1001 else if (ExpectedReason == 0x100)
1002 ExpectedReason = 0x50000;
1003 else if (ExpectedReason == 0x400)
1004 ExpectedReason = 0x30400;
1006 ExpectedReason |= 0x50000;
1010 if (ExpectedReason != 0x30400)
1031 for (
n = 0;
n < 32; ++
n)
1033 ULONG ExpectedReason;
1034 if (!(kTestBits & (1<<
n)))
1037 ExpectedReason =
Reason = (1 <<
n);
1042 if (ExpectedReason == 2)
1044 else if (ExpectedReason == 0x100)
1045 ExpectedReason = 0x50000;
1046 else if (ExpectedReason == 0x400)
1047 ExpectedReason = 0x30400;
1049 ExpectedReason |= 0x50000;
1071 for (
n = 0;
n < 32; ++
n)
1073 ULONG ExpectedReason;
1075 if (!(kTestBits & (1<<
n)))
1077 ExpectedReason =
Reason = (1 <<
n);
1082 if (ExpectedReason == 2)
1084 else if (ExpectedReason == 0x100)
1085 ExpectedReason = 0x50000;
1086 else if (ExpectedReason == 0x400)
1087 ExpectedReason = 0x30400;
1089 ExpectedReason |= 0x50000;
1113 for (
n = 0;
n < 32; ++
n)
1115 ULONG ExpectedReason;
1116 if (!(kTestBits & (1<<
n)))
1119 ExpectedReason =
Reason = (1 <<
n);
1124 if (ExpectedReason == 0x100)
1163 for (
n = 0;
n < 32; ++
n)
1165 ULONG ExpectedReason;
1166 if (!(kTestBits & (1<<
n)))
1170 ExpectedReason =
Reason = (1 <<
n);
1175 if (ExpectedReason == 2)
1177 else if (ExpectedReason == 0x100)
1178 ExpectedReason = 0x50000;
1179 else if (ExpectedReason == 0x400)
1180 ExpectedReason = 0x30400;
1182 ExpectedReason |= 0x50000;
1205 for (
n = 0;
n < 32; ++
n)
1207 ULONG ExpectedReason;
1208 if (!(kTestBits & (1<<
n)))
1212 ExpectedReason =
Reason = (1 <<
n);
1217 if (ExpectedReason == 2)
1219 else if (ExpectedReason == 0x100)
1220 ExpectedReason = 0x50000;
1221 else if (ExpectedReason == 0x400)
1222 ExpectedReason = 0x30400;
1224 ExpectedReason |= 0x50000;
1236 if (AppCompatData && AppCompatData != &
Query)
1237 RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData);
1284 skip(
"Unknown apphelp.dll version %x, cannot determine which ApphelpCheckRunApp(Ex) function to use\n",
g_ModuleVersion);
1293 memset(&QueryOffset, 0,
sizeof(QueryOffset));
1302 ShimDataType = pSdbGetAppCompatDataSize(&QueryOffset);
1313 skip(
"SdbGetAppCompatDataSize not functional\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)
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)
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
@ ProcessBasicInformation
#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 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_Win10(PVOID data)
static HANDLE create_proc(BOOL suspended)
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]
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)
LPWSTR WINAPI GetEnvironmentStringsW(void)
_Inout_ PERBANDINFO * pbi