9 #define WIN32_NO_STATUS 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");
static BOOL call_ApphelpCheckRunApp(HANDLE FileHandle, PWCHAR ApplicationName, PVOID Environment, USHORT ExeType, PULONG Reason, PVOID *SdbQueryAppCompatData, PULONG SdbQueryAppCompatDataSize, PVOID *SxsData, PULONG SxsDataSize, PULONG FusionFlags)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
PVOID PVOID PWCHAR PVOID Environment
WCHAR szLayer[MAX_LAYER_LENGTH]
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG FusionFlags
static UCHAR ULONG UCHAR ULONG UCHAR * output
static void Test_repeatlayer(WCHAR szApphelp[256])
WCHAR szLayerEnv[MAX_LAYER_LENGTH]
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
WCHAR processname[MAX_PATH-2]
#define OBJ_CASE_INSENSITIVE
char * strcat(char *DstString, const char *SrcString)
struct ShimData_QueryOffset ShimData_QueryOffset
#define SHIMREG_DISABLE_LAYER
static void Test_layers(WCHAR szApphelp[256])
ACPI_SIZE strlen(const char *String)
C_ASSERT(sizeof(ShimData_Win2k3)==392)
size_t __cdecl mbstowcs(_Out_writes_opt_z_(_MaxCount) wchar_t *_Dest, _In_z_ const char *_Source, _In_ size_t _MaxCount)
static void Validate_EmptyShimData_Win10(PVOID data)
struct ShimData_Win7 ShimData_Win7
char * wine_dbgstr_w(const wchar_t *wstr)
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
ULARGE_INTEGER AppCompatFlagsUser
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE Count)
GLuint GLuint GLsizei count
static void Test_Shimdata(SDBQUERYRESULT_VISTA *result, const WCHAR *szLayer)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define SDB_DATABASE_MAIN_SHIM
const char * wine_dbgstr_guid(const GUID *guid)
#define INVALID_HANDLE_VALUE
DWORD WINAPI GetLastError(VOID)
static HANDLE create_proc(BOOL suspended)
DWORD get_module_version(HMODULE mod)
#define ReadProcessMemory(a, b, c, d, e)
char padding2[0x2ae+0x54+0x2a+0x16+0x16]
static DWORD g_ModuleVersion
BOOL WINAPI CreateEnvironmentBlock(OUT LPVOID *lpEnvironment, IN HANDLE hToken, IN BOOL bInherit)
LPCWSTR LPCWSTR LPCWSTR DWORD PSDBQUERYRESULT_VISTA pQueryResult
#define ok_hex(expression, result)
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
ULARGE_INTEGER AppCompatFlagsUser
WCHAR szLayer[MAX_LAYER_LENGTH]
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
void(WINAPI *pSdbReleaseDatabase)(HSDB hsdb)
DWORD get_host_winver(void)
GLenum GLuint GLenum GLsizei const GLchar * buf
static void create_environ(const char *layers[], size_t num)
static BOOL readproc(HANDLE proc, LPVOID address, PVOID target, DWORD size)
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG PULONG64 SomeFlag1
static struct _test_info info[]
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
SDBQUERYRESULT_VISTA Query
#define offsetof(TYPE, MEMBER)
#define ok_int(expression, result)
LPCWSTR LPCWSTR LPCWSTR pszEnvironment
LPCWSTR LPCWSTR LPCWSTR DWORD dwFlags
_Inout_ PERBANDINFO * pbi
static BOOL get_shiminfo(HANDLE proc, test_RemoteShimInfo *info)
SDBQUERYRESULT_VISTA Query
static DWORD g_WinVersion
static const WCHAR nameW[]
SIZE_T NTAPI VirtualQueryEx(IN HANDLE hProcess, IN LPCVOID lpAddress, OUT PMEMORY_BASIC_INFORMATION lpBuffer, IN SIZE_T dwLength)
WCHAR processname[MAX_PATH]
GLenum GLuint GLint GLint layer
struct ShimData_Win2k3 ShimData_Win2k3
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)
WCHAR unk4[MAX_LAYER_LENGTH]
static void expect_layeronly_imp(SDBQUERYRESULT_VISTA *result, const char *layers, DWORD flags)
#define GetEnvironmentVariableA(x, y, z)
BOOL WINAPI FreeEnvironmentStringsW(IN LPWSTR EnvironmentStrings)
#define NT_SUCCESS(StatCode)
void __winetest_cdecl winetest_ok(int condition, const char *msg,...)
#define EXCEPTION_EXECUTE_HANDLER
static void Test_GetMatchingExe(void)
BOOL WINAPI DECLSPEC_HOTPATCH SetEnvironmentVariableA(IN LPCSTR lpName, IN LPCSTR lpValue)
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)
struct ShimData_Win10_v1 ShimData_Win10_v1
static const SDBQUERYRESULT_VISTA empty_result
struct test_RemoteShimInfo test_RemoteShimInfo
GUID rgGuidDB[SDB_MAX_SDBS]
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
static void Validate_ShimData_Win10_v2(PVOID data, WCHAR szApphelp[256], size_t count, const char *layers[])
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
static const SDBQUERYRESULT_VISTA almost_empty
DWORD(WINAPI *pSdbGetAppCompatDataSize)(PVOID pData)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define FILE_READ_ATTRIBUTES
PSDBQUERYRESULT_VISTA PVOID * ppData
static DWORD g_ShimDataSize
#define FILE_SHARE_DELETE
void silence_debug_output(void)
BOOL WINAPI DestroyEnvironmentBlock(IN LPVOID lpEnvironment)
#define FILE_NON_DIRECTORY_FILE
WCHAR szLayerEnv[MAX_LAYER_LENGTH]
static void ValidateShim(TAGREF trLayer, const char *name)
WCHAR szLayer[MAX_LAYER_LENGTH]
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
struct _FileName FileName
PVOID PVOID PWCHAR ApplicationName
TAGREF PDB TAGID * ptiWhich
GLenum GLenum GLenum input
PVOID PVOID PWCHAR PVOID USHORT ExeType
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG SxsDataSize
BOOL WINAPI TerminateProcess(IN HANDLE hProcess, IN UINT uExitCode)
TAGREF atrLayers[SDB_MAX_LAYERS]
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID PULONG PULONG PULONG64 PULONG SomeFlag2
static OUT PIO_STATUS_BLOCK IoStatusBlock
static void Test_ApphelpCheckRunApp(WCHAR szApphelp[256])
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
LPWSTR WINAPI GetEnvironmentStringsW(VOID)
static LPCWSTR LPCWSTR LPCWSTR env
ULARGE_INTEGER AppCompatFlags
char * strchr(const char *String, int ch)
#define FILE_SYNCHRONOUS_IO_NONALERT
WCHAR unk5[MAX_LAYER_LENGTH]
TAGREF atrExes[SDB_MAX_EXES_2k3]
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
ULARGE_INTEGER AppCompatFlags
#define InitializeObjectAttributes(p, n, a, r, s)
#define GetProcAddress(x, y)
unsigned __int64 * PULONG64
#define _SEH2_EXCEPT(...)
static void Validate_ShimData_Win2k3(PVOID data, size_t count, const char *layers[])
static void Validate_ShimData_Win7(PVOID data, WCHAR szApphelp[256], size_t count, const char *layers[])
LPCWSTR LPCWSTR szModuleName
#define _SEH2_GetExceptionCode()
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG PVOID * SxsData
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
SDBQUERYRESULT_VISTA Query
TAGREF find_layer(const char *szLayerStart, const char *szLayerEnd)
HANDLE xOpenFile(WCHAR *ApplicationName)
#define CHECKREASON(value, w10dum)
#define IMAGE_FILE_MACHINE_POWERPCFP
#define RESET_CHECKRUNAPP_VARS()
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID * SdbQueryAppCompatData
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
static void Validate_ShimData_Win10(PVOID data, WCHAR szApphelp[256], size_t count, const char *layers[])
PVOID PVOID PWCHAR PVOID PVOID Unk3
BOOL(WINAPI *pSdbGetMatchingExe)(HSDB hsdb
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)
NTSTATUS NTAPI NtQueryInformationProcess(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_ PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength)
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG SdbQueryAppCompatDataSize
struct ShimData_Win10_v2 ShimData_Win10_v2