9 #define WIN32_NO_STATUS 66 #define SHIMDATA_MAGIC 0xAC0DEDAB 67 #define MAX_LAYER_LENGTH 256 174 #define SDB_DATABASE_MAIN_SHIM 0x80030000 176 #define SDBGMEF_IGNORE_ENVIRONMENT 0x1 194 ok(dwRead ==
size,
"Expected to read %u bytes, got %lu\n",
size, dwRead);
195 return dwRead ==
size;
219 if (peb.pShimData ==
NULL)
223 ok(dwRead ==
sizeof(mbi),
"Expected VQE to return %u, got %lu\n",
sizeof(mbi), dwRead);
224 if (dwRead ==
sizeof(mbi) || peb.pShimData ==
NULL)
240 static char proc_name[
MAX_PATH] = { 0 };
258 char buf[256] = { 0 };
272 ok(hsdb !=
NULL,
"Expected a valid handle\n");
276 TAGID tagid = 0xdeadbeef;
282 ret = pSdbTagRefToTagID(hsdb, trLayer, &
pdb, &tagid);
283 ok(
ret ==
TRUE,
"Expected pSdbTagRefToTagID to succeed\n");
287 ok(
pdb !=
NULL,
"Expected pdb to be a valid pointer\n");
288 ok(tagid != 0 && tagid != 0xdeadbeef,
"Expected tagid to be a valid tag id, was: 0x%x\n", tagid);
289 tag = pSdbGetTagFromTagID(
pdb, tagid);
290 ok(
tag == 0x700b,
"Expected tag to be 0x700b, was 0x%x\n", (
DWORD)
tag);
293 pSdbReleaseDatabase(hsdb);
314 ok(!
lstrcmpW(pShimData->
szModule, szApphelp),
"Expected pShimData->Module to be %s, was %s\n",
338 ok(pShimData->
unknown == 0x14c,
"Expected pShimData->unknown to be 0x14c, was 0x%x\n", pShimData->
unknown);
348 skip(
"Yet another unknown shimdata variant...\n");
387 ok(!
lstrcmpiW(pShimData->
szModule, szApphelp),
"Expected pShimData->Module to be %s, was %s\n",
414 ok(pShimData !=
NULL,
"Expected pShimData\n");
423 skip(
"Unknown shimdata (win10)\n");
442 static const char* layers[] = {
443 "256Color",
"NT4SP5",
"DisableNXHideUI",
"DisableNXShowUI",
444 "WIN2000SP3",
"640X480",
"HIGHDPIAWARE",
452 for (
n = 0;
n <= (
sizeof(layers) /
sizeof(layers[0])); ++
n)
463 ok(0,
"Unable to get process info (%u)!\n",
n);
470 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
471 ok(
info.AppCompatInfo ==
NULL,
"Expected AppCompatInfo to be NULL, was: %p\n",
info.AppCompatInfo);
474 ok(
info.pShimData ==
NULL,
"Expected pShimData to be NULL, was: %p\n",
info.pShimData);
484 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
485 ok(
info.AppCompatInfo ==
NULL,
"Expected AppCompatInfo to be NULL, was: %p\n",
info.AppCompatInfo);
486 ok(
info.pShimData !=
NULL,
"Expected pShimData to be valid, was NULL\n");
511 static const char* layers[] = {
512 "256Color",
"256Color",
"256Color",
"256Color",
513 "256Color",
"256Color",
"256Color",
"256Color" };
519 SetEnvironmentVariableA(
"__COMPAT_LAYER",
"256Color 256Color 256Color 256Color 256Color 256Color 256Color 256Color");
530 ok(
info.AppCompatFlagsUser.QuadPart == 0,
"Expected AppCompatFlagsUser to be 0, was: %s\n",
wine_dbgstr_longlong(
info.AppCompatFlagsUser.QuadPart));
531 ok(
info.AppCompatInfo == 0,
"Expected AppCompatInfo to be 0, was: %p\n",
info.AppCompatInfo);
532 ok(
info.pShimData !=
NULL,
"Expected pShimData to be valid, was NULL\n");
547 ok(0,
"Unable to get process info!\n");
555 char layer[100] = { 0 };
556 WCHAR layerW[100] = { 0 };
557 strncpy(
layer, szLayerStart, szLayerEnd - szLayerStart);
565 return pSdbGetLayerTagRef(
g_LayerDB, layerW);
573 const char*
layer = layers, *nextlayer;
578 layer = nextlayer ? (nextlayer+1) :
NULL;
609 winetest_ok(
result->atrLayers[
n] == atrLayers[
n],
"Expected atrLayers[%u] to be %x, was %x\n",
632 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
683 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
690 const GUID rgGuidDB0 = {0x11111111, 0x1111, 0x1111, {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}};
694 "Expected input->dwLayerCount to be 1, was %u for %s\n",
697 "Expected input->dwCustomSDBMap to be 1, was %u for %s\n",
700 "Expected input->rgGuidDB[0] to be %s, was %s for %s\n",
705 "Expected output->dwLayerCount to be 0, was %u for %s\n",
708 "Expected output->dwCustomSDBMap to be 0, was %u for %s\n",
711 "Expected output->rgGuidDB[0] to be empty, was %s for %s\n",
726 #define expect_layeronly (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_layeronly_imp 741 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
747 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
754 ok(
ret ==
FALSE,
"Expected ret to be FALSE\n");
764 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
773 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
785 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
794 ok(
ret ==
TRUE,
"Expected ret to be TRUE\n");
838 #define RESET_CHECKRUNAPP_VARS()\ 840 if (AppCompatData && AppCompatData != &Query) { RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData); } \ 841 ExeType = IMAGE_FILE_MACHINE_I386; \ 842 SxsDataSize = FusionFlags = Reason = 0; \ 844 memset(&Query, 0, sizeof(Query)); \ 845 AppCompatData = &Query; \ 846 AppCompatDataSize = 123456; \ 849 #define CHECK_BASICS()\ 852 ok(AppCompatData != NULL && AppCompatData != &Query, "Expected the pointer to be valid\n"); \ 853 ok_hex(AppCompatDataSize, sizeof(SDBQUERYRESULT_VISTA)); \ 854 ok(SxsData == NULL, "Expected the pointer to be NULL\n"); \ 855 ok_hex(SxsDataSize, 0); \ 856 ok_hex(FusionFlags, 0); \ 860 #define CHECKREASON(value, w10dum) (g_ModuleVersion < WINVER_WIN10 ? value : w10dum) 870 if (pApphelpCheckRunAppEx_w7)
877 if (pApphelpCheckRunAppEx_w10)
905 const int kTestBits = 0x70503;
907 if (!pApphelpCheckRunAppEx_w7 && !pApphelpCheckRunAppEx_w10)
909 skip(
"No usable ApphelpCheckRunAppEx\n");
918 DuplicatedEnv =
NULL;
949 for (
n = 0;
n < 32; ++
n)
951 ULONG ExpectedReason;
952 if (!(kTestBits & (1<<
n)))
955 ExpectedReason =
Reason = (1 <<
n);
960 if (ExpectedReason == 2)
962 else if (ExpectedReason == 0x100)
963 ExpectedReason = 0x30000;
965 ExpectedReason |= 0x30000;
986 for (
n = 0;
n < 32; ++
n)
988 ULONG ExpectedReason;
990 if (!(kTestBits & (1<<
n)))
992 ExpectedReason =
Reason = (1 <<
n);
997 if (ExpectedReason == 2)
999 else if (ExpectedReason == 0x100)
1000 ExpectedReason = 0x50000;
1001 else if (ExpectedReason == 0x400)
1002 ExpectedReason = 0x30400;
1004 ExpectedReason |= 0x50000;
1008 if (ExpectedReason != 0x30400)
1029 for (
n = 0;
n < 32; ++
n)
1031 ULONG ExpectedReason;
1032 if (!(kTestBits & (1<<
n)))
1035 ExpectedReason =
Reason = (1 <<
n);
1040 if (ExpectedReason == 2)
1042 else if (ExpectedReason == 0x100)
1043 ExpectedReason = 0x50000;
1044 else if (ExpectedReason == 0x400)
1045 ExpectedReason = 0x30400;
1047 ExpectedReason |= 0x50000;
1069 for (
n = 0;
n < 32; ++
n)
1071 ULONG ExpectedReason;
1073 if (!(kTestBits & (1<<
n)))
1075 ExpectedReason =
Reason = (1 <<
n);
1080 if (ExpectedReason == 2)
1082 else if (ExpectedReason == 0x100)
1083 ExpectedReason = 0x50000;
1084 else if (ExpectedReason == 0x400)
1085 ExpectedReason = 0x30400;
1087 ExpectedReason |= 0x50000;
1111 for (
n = 0;
n < 32; ++
n)
1113 ULONG ExpectedReason;
1114 if (!(kTestBits & (1<<
n)))
1117 ExpectedReason =
Reason = (1 <<
n);
1122 if (ExpectedReason == 0x100)
1161 for (
n = 0;
n < 32; ++
n)
1163 ULONG ExpectedReason;
1164 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;
1203 for (
n = 0;
n < 32; ++
n)
1205 ULONG ExpectedReason;
1206 if (!(kTestBits & (1<<
n)))
1210 ExpectedReason =
Reason = (1 <<
n);
1215 if (ExpectedReason == 2)
1217 else if (ExpectedReason == 0x100)
1218 ExpectedReason = 0x50000;
1219 else if (ExpectedReason == 0x400)
1220 ExpectedReason = 0x30400;
1222 ExpectedReason |= 0x50000;
1234 if (AppCompatData && AppCompatData != &
Query)
1235 RtlFreeHeap(RtlGetProcessHeap(), 0, AppCompatData);
1282 skip(
"Unknown apphelp.dll version %x, cannot determine which ApphelpCheckRunApp(Ex) function to use\n",
g_ModuleVersion);
1291 memset(&QueryOffset, 0,
sizeof(QueryOffset));
1300 ShimDataType = pSdbGetAppCompatDataSize(&QueryOffset);
1311 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]
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)
GLenum GLuint GLenum GLsizei const GLchar * buf
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
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
GLuint GLuint GLsizei count
ULARGE_INTEGER AppCompatFlagsUser
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE 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
NTSTATUS NTAPI NtQueryInformationProcess(IN HANDLE ProcessHandle, IN PROCESSINFOCLASS ProcessInformationClass, OUT PVOID ProcessInformation, IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL)
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
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)
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
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
SDBQUERYRESULT_VISTA Query
char * wine_dbgstr_w(const wchar_t *wstr)
#define EXCEPTION_EXECUTE_HANDLER
#define offsetof(TYPE, MEMBER)
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)
#define ok_hex(expression, result)
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,...)
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 OBJ_CASE_INSENSITIVE
#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]
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)
PVOID PVOID PWCHAR PVOID USHORT PULONG PVOID PULONG SdbQueryAppCompatDataSize
struct ShimData_Win10_v2 ShimData_Win10_v2