2016-05-22 20:27:02 +00:00
/*
2017-09-08 20:33:40 +00:00
* PROJECT : apphelp_apitest
* LICENSE : GPL - 2.0 + ( https : //spdx.org/licenses/GPL-2.0+)
* PURPOSE : Tests for shim - database api ' s
* COPYRIGHT : Copyright 2012 Detlef Riekenberg
* Copyright 2013 Mislav Blažević
* Copyright 2015 - 2017 Mark Jansen ( mark . jansen @ reactos . org )
2016-05-22 20:27:02 +00:00
*/
# include <ntstatus.h>
# define WIN32_NO_STATUS
# include <windows.h>
# include <shlwapi.h>
# include <winnt.h>
# ifdef __REACTOS__
# include <ntndk.h>
# else
# include <winternl.h>
# endif
# include <winerror.h>
# include <stdio.h>
# include <initguid.h>
# include "wine/test.h"
2016-09-03 16:20:52 +00:00
# include "apphelp_apitest.h"
2016-05-28 21:46:24 +00:00
2016-05-22 20:27:02 +00:00
# define DOS_PATH 0
2016-09-03 16:20:52 +00:00
# define HID_DATABASE_FULLPATH 2
# define SDB_DATABASE_MAIN_SHIM 0x80030000
2016-05-22 20:27:02 +00:00
# define TAGID_NULL 0x0
# define TAGID_ROOT 0x0
# define _TAGID_ROOT 12
# define TAG_TYPE_MASK 0xF000
# define TAG_TYPE_NULL 0x1000
# define TAG_TYPE_BYTE 0x2000
# define TAG_TYPE_WORD 0x3000
# define TAG_TYPE_DWORD 0x4000
# define TAG_TYPE_QWORD 0x5000
# define TAG_TYPE_STRINGREF 0x6000
# define TAG_TYPE_LIST 0x7000
# define TAG_TYPE_STRING 0x8000
# define TAG_TYPE_BINARY 0x9000
# define TAG_NULL 0x0
2016-05-22 20:39:41 +00:00
# define TAG_INCLUDE (0x1 | TAG_TYPE_NULL)
2016-05-22 20:27:02 +00:00
# define TAG_MATCH_MODE (0x1 | TAG_TYPE_WORD)
2016-05-22 20:39:41 +00:00
# define TAG_SIZE (0x1 | TAG_TYPE_DWORD)
# define TAG_CHECKSUM (0x3 | TAG_TYPE_DWORD)
# define TAG_MODULE_TYPE (0x6 | TAG_TYPE_DWORD)
# define TAG_VERFILEOS (0x9 | TAG_TYPE_DWORD)
# define TAG_VERFILETYPE (0xA | TAG_TYPE_DWORD)
# define TAG_PE_CHECKSUM (0xB | TAG_TYPE_DWORD)
# define TAG_PROBLEMSEVERITY (0x10 | TAG_TYPE_DWORD)
# define TAG_HTMLHELPID (0x15 | TAG_TYPE_DWORD)
# define TAG_FLAGS (0x17 | TAG_TYPE_DWORD)
# define TAG_LAYER_TAGID (0x1A | TAG_TYPE_DWORD)
# define TAG_LINKER_VERSION (0x1C | TAG_TYPE_DWORD)
# define TAG_LINK_DATE (0x1D | TAG_TYPE_DWORD)
# define TAG_UPTO_LINK_DATE (0x1E | TAG_TYPE_DWORD)
# define TAG_APP_NAME_RC_ID (0x24 | TAG_TYPE_DWORD)
# define TAG_VENDOR_NAME_RC_ID (0x25 | TAG_TYPE_DWORD)
# define TAG_SUMMARY_MSG_RC_ID (0x26 | TAG_TYPE_DWORD)
# define TAG_OS_PLATFORM (0x23 | TAG_TYPE_DWORD)
# define TAG_TIME (0x1 | TAG_TYPE_QWORD)
# define TAG_BIN_FILE_VERSION (0x2 | TAG_TYPE_QWORD)
# define TAG_BIN_PRODUCT_VERSION (0x3 | TAG_TYPE_QWORD)
# define TAG_UPTO_BIN_PRODUCT_VERSION (0x6 | TAG_TYPE_QWORD)
# define TAG_UPTO_BIN_FILE_VERSION (0xD | TAG_TYPE_QWORD)
2016-05-22 20:27:02 +00:00
# define TAG_FLAG_LUA (0x10 | TAG_TYPE_QWORD)
2016-05-22 20:39:41 +00:00
# define TAG_DATABASE (0x1 | TAG_TYPE_LIST)
# define TAG_INEXCLUD (0x3 | TAG_TYPE_LIST)
# define TAG_EXE (0x7 | TAG_TYPE_LIST)
# define TAG_MATCHING_FILE (0x8 | TAG_TYPE_LIST)
# define TAG_SHIM_REF (0x9| TAG_TYPE_LIST)
# define TAG_LAYER (0xB | TAG_TYPE_LIST)
# define TAG_APPHELP (0xD | TAG_TYPE_LIST)
# define TAG_LINK (0xE | TAG_TYPE_LIST)
2016-05-22 20:27:02 +00:00
# define TAG_STRINGTABLE (0x801 | TAG_TYPE_LIST)
# define TAG_STRINGTABLE_ITEM (0x801 | TAG_TYPE_STRING)
2016-05-22 20:39:41 +00:00
# define TAG_NAME (0x1 | TAG_TYPE_STRINGREF)
# define TAG_MODULE (0x3 | TAG_TYPE_STRINGREF)
# define TAG_VENDOR (0x5 | TAG_TYPE_STRINGREF)
# define TAG_APP_NAME (0x6 | TAG_TYPE_STRINGREF)
# define TAG_COMMAND_LINE (0x8 | TAG_TYPE_STRINGREF)
# define TAG_COMPANY_NAME (0x9 | TAG_TYPE_STRINGREF)
2017-07-14 20:35:11 +00:00
# define TAG_WILDCARD_NAME (0xB | TAG_TYPE_STRINGREF)
2016-05-22 20:39:41 +00:00
# define TAG_PRODUCT_NAME (0x10 | TAG_TYPE_STRINGREF)
# define TAG_PRODUCT_VERSION (0x11 | TAG_TYPE_STRINGREF)
# define TAG_FILE_DESCRIPTION (0x12 | TAG_TYPE_STRINGREF)
# define TAG_FILE_VERSION (0x13 | TAG_TYPE_STRINGREF)
# define TAG_ORIGINAL_FILENAME (0x14 | TAG_TYPE_STRINGREF)
# define TAG_INTERNAL_NAME (0x15 | TAG_TYPE_STRINGREF)
# define TAG_LEGAL_COPYRIGHT (0x16 | TAG_TYPE_STRINGREF)
# define TAG_APPHELP_DETAILS (0x18 | TAG_TYPE_STRINGREF)
# define TAG_LINK_URL (0x19 | TAG_TYPE_STRINGREF)
# define TAG_APPHELP_TITLE (0x1B | TAG_TYPE_STRINGREF)
# define TAG_COMPILER_VERSION (0x22 | TAG_TYPE_STRINGREF)
2016-05-22 20:27:02 +00:00
# define TAG_GENERAL (0x2 | TAG_TYPE_NULL)
2016-05-22 20:39:41 +00:00
# define TAG_EXE_ID (0x4 | TAG_TYPE_BINARY)
2016-05-22 20:27:02 +00:00
# define TAG_DATA_BITS (0x5 | TAG_TYPE_BINARY)
2016-05-22 20:39:41 +00:00
# define TAG_DATABASE_ID (0x7 | TAG_TYPE_BINARY)
2016-05-22 20:27:02 +00:00
2016-10-30 19:39:43 +00:00
2016-05-22 20:27:02 +00:00
static HMODULE hdll ;
static LPCWSTR ( WINAPI * pSdbTagToString ) ( TAG ) ;
static PDB ( WINAPI * pSdbOpenDatabase ) ( LPCWSTR , PATH_TYPE ) ;
static PDB ( WINAPI * pSdbCreateDatabase ) ( LPCWSTR , PATH_TYPE ) ;
2016-05-22 20:39:41 +00:00
static BOOL ( WINAPI * pSdbGetDatabaseVersion ) ( LPCWSTR , PDWORD , PDWORD ) ;
2016-05-22 20:27:02 +00:00
static void ( WINAPI * pSdbCloseDatabase ) ( PDB ) ;
static void ( WINAPI * pSdbCloseDatabaseWrite ) ( PDB ) ;
static TAG ( WINAPI * pSdbGetTagFromTagID ) ( PDB , TAGID ) ;
static BOOL ( WINAPI * pSdbWriteNULLTag ) ( PDB , TAG ) ;
static BOOL ( WINAPI * pSdbWriteWORDTag ) ( PDB , TAG , WORD ) ;
static BOOL ( WINAPI * pSdbWriteDWORDTag ) ( PDB , TAG , DWORD ) ;
static BOOL ( WINAPI * pSdbWriteQWORDTag ) ( PDB , TAG , QWORD ) ;
static BOOL ( WINAPI * pSdbWriteBinaryTagFromFile ) ( PDB , TAG , LPCWSTR ) ;
static BOOL ( WINAPI * pSdbWriteStringTag ) ( PDB , TAG , LPCWSTR ) ;
static BOOL ( WINAPI * pSdbWriteStringRefTag ) ( PDB , TAG , TAGID ) ;
static TAGID ( WINAPI * pSdbBeginWriteListTag ) ( PDB , TAG ) ;
static BOOL ( WINAPI * pSdbEndWriteListTag ) ( PDB , TAGID ) ;
2016-05-22 20:39:41 +00:00
static TAGID ( WINAPI * pSdbFindFirstTag ) ( PDB , TAGID , TAG ) ;
static TAGID ( WINAPI * pSdbFindNextTag ) ( PDB , TAGID , TAGID ) ;
2016-10-30 19:39:43 +00:00
static TAGID ( WINAPI * pSdbFindFirstNamedTag ) ( PDB , TAGID , TAGID , TAGID , LPCWSTR ) ;
2016-05-22 20:27:02 +00:00
static WORD ( WINAPI * pSdbReadWORDTag ) ( PDB , TAGID , WORD ) ;
static DWORD ( WINAPI * pSdbReadDWORDTag ) ( PDB , TAGID , DWORD ) ;
static QWORD ( WINAPI * pSdbReadQWORDTag ) ( PDB , TAGID , QWORD ) ;
static BOOL ( WINAPI * pSdbReadBinaryTag ) ( PDB , TAGID , PBYTE , DWORD ) ;
static BOOL ( WINAPI * pSdbReadStringTag ) ( PDB , TAGID , LPWSTR , DWORD ) ;
static DWORD ( WINAPI * pSdbGetTagDataSize ) ( PDB , TAGID ) ;
static PVOID ( WINAPI * pSdbGetBinaryTagData ) ( PDB , TAGID ) ;
static LPWSTR ( WINAPI * pSdbGetStringTagPtr ) ( PDB , TAGID ) ;
static TAGID ( WINAPI * pSdbGetFirstChild ) ( PDB , TAGID ) ;
static TAGID ( WINAPI * pSdbGetNextChild ) ( PDB , TAGID , TAGID ) ;
2016-05-22 20:39:41 +00:00
static BOOL ( WINAPI * pSdbGetDatabaseID ) ( PDB , GUID * ) ;
static BOOL ( WINAPI * pSdbGUIDToString ) ( CONST GUID * , PCWSTR , SIZE_T ) ;
2016-09-03 16:20:52 +00:00
static HSDB ( WINAPI * pSdbInitDatabase ) ( DWORD , LPCWSTR ) ;
static void ( WINAPI * pSdbReleaseDatabase ) ( HSDB ) ;
2017-06-10 20:31:58 +00:00
static BOOL ( WINAPI * pSdbGetMatchingExe ) ( HSDB hsdb , LPCWSTR path , LPCWSTR module_name , LPCWSTR env , DWORD flags , PSDBQUERYRESULT_VISTA result ) ;
2016-09-03 16:20:52 +00:00
static BOOL ( WINAPI * pSdbTagRefToTagID ) ( HSDB hSDB , TAGREF trWhich , PDB * ppdb , TAGID * ptiWhich ) ;
2016-10-30 19:39:43 +00:00
static BOOL ( WINAPI * pSdbTagIDToTagRef ) ( HSDB hSDB , PDB pdb , TAGID tiWhich , TAGREF * ptrWhich ) ;
static TAGREF ( WINAPI * pSdbGetLayerTagRef ) ( HSDB hsdb , LPCWSTR layerName ) ;
static LONGLONG ( WINAPI * pSdbMakeIndexKeyFromString ) ( LPCWSTR ) ;
2016-08-29 15:19:55 +00:00
2016-05-22 20:27:02 +00:00
2016-10-30 19:39:43 +00:00
DEFINE_GUID ( GUID_DATABASE_TEST , 0xe39b0eb0 , 0x55db , 0x450b , 0x9b , 0xd4 , 0xd2 , 0x0c , 0x94 , 0x84 , 0x26 , 0x0f ) ;
DEFINE_GUID ( GUID_MAIN_DATABASE , 0x11111111 , 0x1111 , 0x1111 , 0x11 , 0x11 , 0x11 , 0x11 , 0x11 , 0x11 , 0x11 , 0x11 ) ;
2016-05-28 21:46:24 +00:00
2016-05-22 20:27:02 +00:00
static void Write ( HANDLE file , LPCVOID buffer , DWORD size )
{
DWORD dwWritten = 0 ;
WriteFile ( file , buffer , size , & dwWritten , NULL ) ;
}
static void test_Sdb ( void )
{
2016-10-30 19:39:43 +00:00
static const WCHAR temp [ ] = L " temp " ;
static const WCHAR path1 [ ] = L " temp.sdb " ;
static const WCHAR path2 [ ] = L " temp2.bin " ;
static const WCHAR tag_size_string [ ] = L " SIZE " ;
static const WCHAR tag_flag_lua_string [ ] = L " FLAG_LUA " ;
static const WCHAR invalid_tag [ ] = L " InvalidTag " ;
2016-05-22 20:27:02 +00:00
static const TAG tags [ 5 ] = {
TAG_SIZE , TAG_FLAG_LUA , TAG_NAME ,
TAG_STRINGTABLE , TAG_STRINGTABLE_ITEM
} ;
2016-10-30 19:39:43 +00:00
WCHAR buffer [ 6 ] = { 0 } ;
2016-05-22 20:27:02 +00:00
PDB pdb ;
QWORD qword ;
DWORD dword ;
WORD word ;
BOOL ret ;
HANDLE file ; /* temp file created for testing purpose */
TAG tag ;
TAGID tagid , ptagid , stringref = 6 ;
LPCWSTR string ;
PBYTE binary ;
2016-05-22 20:39:41 +00:00
pdb = pSdbCreateDatabase ( path1 , DOS_PATH ) ;
2016-10-30 19:39:43 +00:00
ok ( pdb ! = NULL , " failed to create database \n " ) ;
if ( pdb ! = NULL )
2016-05-22 20:27:02 +00:00
{
ret = pSdbWriteDWORDTag ( pdb , tags [ 0 ] , 0xDEADBEEF ) ;
2016-10-30 19:39:43 +00:00
ok ( ret , " failed to write DWORD tag \n " ) ;
2016-05-22 20:27:02 +00:00
ret = pSdbWriteQWORDTag ( pdb , tags [ 1 ] , 0xDEADBEEFBABE ) ;
2016-10-30 19:39:43 +00:00
ok ( ret , " failed to write QWORD tag \n " ) ;
2016-05-22 20:27:02 +00:00
ret = pSdbWriteStringRefTag ( pdb , tags [ 2 ] , stringref ) ;
2016-10-30 19:39:43 +00:00
ok ( ret , " failed to write stringref tag \n " ) ;
2016-05-22 20:27:02 +00:00
tagid = pSdbBeginWriteListTag ( pdb , tags [ 3 ] ) ;
2016-10-30 19:39:43 +00:00
ok ( tagid ! = TAGID_NULL , " unexpected NULL tagid \n " ) ;
2016-05-22 20:39:41 +00:00
ret = pSdbWriteStringTag ( pdb , tags [ 4 ] , temp ) ;
2016-10-30 19:39:43 +00:00
ok ( ret , " failed to write string tag \n " ) ;
2016-05-22 20:27:02 +00:00
ret = pSdbWriteNULLTag ( pdb , TAG_GENERAL ) ;
2016-10-30 19:39:43 +00:00
ok ( ret , " failed to write NULL tag \n " ) ;
2016-05-22 20:27:02 +00:00
ret = pSdbWriteWORDTag ( pdb , TAG_MATCH_MODE , 0xACE ) ;
2016-10-30 19:39:43 +00:00
ok ( ret , " failed to write WORD tag \n " ) ;
2016-05-22 20:27:02 +00:00
ret = pSdbEndWriteListTag ( pdb , tagid ) ;
2016-10-30 19:39:43 +00:00
ok ( ret , " failed to update list size \n " ) ;
2016-05-22 20:27:02 +00:00
/* [Err ][SdbCloseDatabase ] Failed to close the file. */
pSdbCloseDatabaseWrite ( pdb ) ;
}
/* [Err ][SdbGetDatabaseID ] Failed to get root tag */
2016-05-22 20:39:41 +00:00
pdb = pSdbOpenDatabase ( path1 , DOS_PATH ) ;
2016-05-22 20:27:02 +00:00
ok ( pdb ! = NULL , " unexpected NULL handle \n " ) ;
2016-10-30 19:39:43 +00:00
if ( pdb )
2016-05-22 20:27:02 +00:00
{
tagid = pSdbGetFirstChild ( pdb , TAGID_ROOT ) ;
ok ( tagid = = _TAGID_ROOT , " unexpected tagid %u, expected %u \n " , tagid , _TAGID_ROOT ) ;
tag = pSdbGetTagFromTagID ( pdb , tagid ) ;
ok ( tag = = TAG_SIZE , " unexpected tag 0x%x, expected 0x%x \n " , tag , TAG_SIZE ) ;
string = pSdbTagToString ( tag ) ;
ok ( lstrcmpW ( string , tag_size_string ) = = 0 , " unexpected string %s, expected %s \n " ,
2016-10-30 19:39:43 +00:00
wine_dbgstr_w ( string ) , wine_dbgstr_w ( tag_size_string ) ) ;
2016-05-22 20:27:02 +00:00
dword = pSdbReadDWORDTag ( pdb , tagid , 0 ) ;
ok ( dword = = 0xDEADBEEF , " unexpected value %u, expected 0xDEADBEEF \n " , dword ) ;
tagid = pSdbGetNextChild ( pdb , TAGID_ROOT , tagid ) ;
ok ( tagid = = _TAGID_ROOT + sizeof ( TAG ) + sizeof ( DWORD ) , " unexpected tagid %u, expected %u \n " ,
2016-10-30 19:39:43 +00:00
tagid , _TAGID_ROOT + sizeof ( TAG ) + sizeof ( DWORD ) ) ;
2016-05-22 20:27:02 +00:00
tag = pSdbGetTagFromTagID ( pdb , tagid ) ;
2016-10-30 19:39:43 +00:00
ok ( tag = = TAG_FLAG_LUA , " unexpected tag 0x%x, expected 0x%x \n " , tag , TAG_FLAG_LUA ) ;
2016-05-22 20:27:02 +00:00
string = pSdbTagToString ( tag ) ;
2016-10-30 19:39:43 +00:00
if ( g_WinVersion > = WINVER_VISTA )
{
ok ( lstrcmpW ( string , tag_flag_lua_string ) = = 0 , " unexpected string %s, expected %s \n " ,
wine_dbgstr_w ( string ) , wine_dbgstr_w ( tag_flag_lua_string ) ) ;
}
else
{
ok ( lstrcmpW ( string , invalid_tag ) = = 0 , " unexpected string %s, expected %s \n " ,
wine_dbgstr_w ( string ) , wine_dbgstr_w ( invalid_tag ) ) ;
}
2016-05-22 20:27:02 +00:00
qword = pSdbReadQWORDTag ( pdb , tagid , 0 ) ;
ok ( qword = = 0xDEADBEEFBABE , " unexpected value 0x%I64x, expected 0xDEADBEEFBABE \n " , qword ) ;
tagid = pSdbGetNextChild ( pdb , TAGID_ROOT , tagid ) ;
string = pSdbGetStringTagPtr ( pdb , tagid ) ;
2016-10-30 19:39:43 +00:00
ok ( string & & ( lstrcmpW ( string , temp ) = = 0 ) , " unexpected string %s, expected %s \n " ,
2016-05-22 20:39:41 +00:00
wine_dbgstr_w ( string ) , wine_dbgstr_w ( temp ) ) ;
2016-05-22 20:27:02 +00:00
ptagid = pSdbGetNextChild ( pdb , TAGID_ROOT , tagid ) ;
tagid = pSdbGetFirstChild ( pdb , ptagid ) ;
string = pSdbGetStringTagPtr ( pdb , tagid ) ;
2016-10-30 19:39:43 +00:00
ok ( string & & ( lstrcmpW ( string , temp ) = = 0 ) , " unexpected string %s, expected %s \n " ,
2016-05-22 20:39:41 +00:00
wine_dbgstr_w ( string ) , wine_dbgstr_w ( temp ) ) ;
2016-05-22 20:27:02 +00:00
2016-10-30 19:39:43 +00:00
ok ( pSdbReadStringTag ( pdb , tagid , buffer , 6 ) , " failed to write string to buffer \n " ) ;
2016-05-22 20:27:02 +00:00
/* [Err ][SdbpReadTagData ] Buffer too small. Avail: 6, Need: 10. */
2016-10-30 19:39:43 +00:00
ok ( ! pSdbReadStringTag ( pdb , tagid , buffer , 3 ) , " string was written to buffer, but failure was expected " ) ;
ok ( pSdbGetTagDataSize ( pdb , tagid ) = = 5 * sizeof ( WCHAR ) , " string has unexpected size \n " ) ;
2016-05-22 20:27:02 +00:00
tagid = pSdbGetNextChild ( pdb , ptagid , tagid ) ;
tag = pSdbGetTagFromTagID ( pdb , tagid ) ;
2016-10-30 19:39:43 +00:00
ok ( tag = = TAG_GENERAL , " unexpected tag 0x%x, expected 0x%x \n " , tag , TAG_GENERAL ) ;
ok ( pSdbGetTagDataSize ( pdb , tagid ) = = 0 , " null tag with size > 0 \n " ) ;
2016-05-22 20:27:02 +00:00
tagid = pSdbGetNextChild ( pdb , ptagid , tagid ) ;
word = pSdbReadWORDTag ( pdb , tagid , 0 ) ;
2016-10-30 19:39:43 +00:00
ok ( word = = 0xACE , " unexpected value 0x%x, expected 0x%x \n " , word , 0xACE ) ;
2016-05-22 20:27:02 +00:00
pSdbCloseDatabase ( pdb ) ;
}
2016-05-22 20:39:41 +00:00
DeleteFileW ( path1 ) ;
2016-05-22 20:27:02 +00:00
file = CreateFileW ( path2 , GENERIC_WRITE , 0 , NULL , OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL ) ;
2016-10-30 19:39:43 +00:00
ok ( file ! = INVALID_HANDLE_VALUE , " failed to open file \n " ) ;
2016-05-22 20:27:02 +00:00
Write ( file , & qword , 8 ) ;
CloseHandle ( file ) ;
2016-05-22 20:39:41 +00:00
pdb = pSdbCreateDatabase ( path1 , DOS_PATH ) ;
2016-05-22 20:27:02 +00:00
ok ( pdb ! = NULL , " unexpected NULL handle \n " ) ;
2016-10-30 19:39:43 +00:00
if ( pdb )
2016-05-22 20:27:02 +00:00
{
ret = pSdbWriteBinaryTagFromFile ( pdb , TAG_DATA_BITS , path2 ) ;
ok ( ret , " failed to write tag from binary file \n " ) ;
pSdbCloseDatabaseWrite ( pdb ) ; /* [Err ][SdbCloseDatabase ] Failed to close the file. */
DeleteFileW ( path2 ) ;
2016-10-30 19:39:43 +00:00
/* FIXME: doesnt work on win10?! */
2016-05-22 20:39:41 +00:00
pdb = pSdbOpenDatabase ( path1 , DOS_PATH ) ;
2017-06-26 10:26:57 +00:00
if ( g_WinVersion < WINVER_WIN10 )
{
/* ERROR,SdbOpenDatabaseEx,845,Failed to open SDB - File size too large or small. */
ok ( pdb ! = NULL , " unexpected NULL handle \n " ) ;
}
2016-10-30 19:39:43 +00:00
if ( pdb )
{
binary = ( PBYTE ) pSdbGetBinaryTagData ( pdb , _TAGID_ROOT ) ;
ok ( memcmp ( binary , & qword , 8 ) = = 0 , " binary data is corrupt \n " ) ;
ret = pSdbReadBinaryTag ( pdb , _TAGID_ROOT , ( PBYTE ) buffer , 12 ) ;
ok ( ret , " failed to read binary tag \n " ) ;
ok ( memcmp ( buffer , & qword , 8 ) = = 0 , " binary data is corrupt \n " ) ;
pSdbCloseDatabase ( pdb ) ;
}
2016-05-22 20:27:02 +00:00
}
2016-05-22 20:39:41 +00:00
DeleteFileW ( path1 ) ;
}
2016-06-02 18:59:04 +00:00
/*
- Show that a stringtable is automatically generated ,
2016-06-05 21:26:07 +00:00
- Show that entries in the stringtable are re - used ,
2016-06-02 18:59:04 +00:00
- validate multiple lists ( for the length )
2016-10-30 19:39:43 +00:00
*/
2016-06-02 18:59:04 +00:00
static void test_write_ex ( void )
{
WCHAR path1 [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , ' . ' , ' s ' , ' d ' , ' b ' , 0 } ;
WCHAR test1 [ ] = { ' T ' , ' E ' , ' S ' , ' T ' , 0 } ;
WCHAR test2 [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , 0 } ;
PDB pdb ;
TAGID tagdb , tagstr ;
TAG tag ;
DWORD size ;
BOOL ret ;
2016-06-05 21:26:07 +00:00
LPWSTR ptr ;
2016-06-02 18:59:04 +00:00
/* Write a small database */
pdb = pSdbCreateDatabase ( path1 , DOS_PATH ) ;
ok ( pdb ! = NULL , " Expected a valid database \n " ) ;
if ( ! pdb )
return ;
tagdb = pSdbBeginWriteListTag ( pdb , TAG_DATABASE ) ;
ok ( tagdb = = 12 , " Expected tag to be 12, was %u \n " , tagdb ) ;
ret = pSdbWriteStringTag ( pdb , TAG_NAME , test1 ) ;
2016-06-05 21:26:07 +00:00
ret = pSdbWriteStringTag ( pdb , TAG_NAME , test2 ) ;
2016-06-02 18:59:04 +00:00
ok ( ret , " Expected SdbWriteStringTag to succeed \n " ) ;
ret = pSdbEndWriteListTag ( pdb , tagdb ) ;
ok ( ret , " Expected SdbEndWriteListTag to succeed \n " ) ;
tagdb = pSdbBeginWriteListTag ( pdb , TAG_DATABASE ) ;
2016-06-05 21:26:07 +00:00
ok ( tagdb = = 30 , " Expected tag to be 24, was %u \n " , tagdb ) ;
ret = pSdbWriteStringTag ( pdb , TAG_NAME , test1 ) ;
2016-06-02 18:59:04 +00:00
ret = pSdbWriteStringTag ( pdb , TAG_NAME , test2 ) ;
ok ( ret , " Expected SdbWriteStringTag to succeed \n " ) ;
ret = pSdbEndWriteListTag ( pdb , tagdb ) ;
ok ( ret , " Expected SdbEndWriteListTag to succeed \n " ) ;
pSdbCloseDatabaseWrite ( pdb ) ;
/* Now validate it's contents */
pdb = pSdbOpenDatabase ( path1 , DOS_PATH ) ;
ok ( pdb ! = NULL , " Expected a valid database \n " ) ;
if ( ! pdb )
return ;
2016-06-05 21:26:07 +00:00
2016-06-02 18:59:04 +00:00
tagdb = pSdbFindFirstTag ( pdb , TAGID_ROOT , TAG_DATABASE ) ;
ok ( tagdb = = 12 , " Expected tag to be 12, was %u \n " , tagdb ) ;
size = pSdbGetTagDataSize ( pdb , tagdb ) ;
2016-06-05 21:26:07 +00:00
ok ( size = = 12 , " Expected size to be 12, was %u \n " , size ) ;
2016-06-02 18:59:04 +00:00
tagstr = pSdbFindFirstTag ( pdb , tagdb , TAG_NAME ) ;
ok ( tagstr = = 18 , " Expected string tag to be 18, was %u \n " , tagstr ) ;
tag = pSdbGetTagFromTagID ( pdb , tagstr ) ;
ok ( tag = = TAG_NAME , " Expected tag to be TAG_NAME, was 0x%x \n " , ( DWORD ) tag ) ;
size = pSdbGetTagDataSize ( pdb , tagstr ) ;
ok ( size = = 4 , " Expected size to be 4, was 0x%x \n " , size ) ;
2016-06-05 21:26:07 +00:00
tagstr = pSdbFindNextTag ( pdb , tagdb , tagstr ) ;
ok ( tagstr = = 24 , " Expected string tag to be 24, was %u \n " , tagstr ) ;
tag = pSdbGetTagFromTagID ( pdb , tagstr ) ;
ok ( tag = = TAG_NAME , " Expected tag to be TAG_NAME, was 0x%x \n " , ( DWORD ) tag ) ;
size = pSdbGetTagDataSize ( pdb , tagstr ) ;
ok ( size = = 4 , " Expected size to be 4, was 0x%x \n " , size ) ;
2016-06-02 18:59:04 +00:00
tagdb = pSdbFindNextTag ( pdb , TAGID_ROOT , tagdb ) ;
2016-06-05 21:26:07 +00:00
ok ( tagdb = = 30 , " Expected tag to be 30, was %u \n " , tagdb ) ;
2016-06-02 18:59:04 +00:00
size = pSdbGetTagDataSize ( pdb , tagdb ) ;
2016-06-05 21:26:07 +00:00
ok ( size = = 12 , " Expected size to be 12, was %u \n " , size ) ;
2016-06-02 18:59:04 +00:00
tagstr = pSdbFindFirstTag ( pdb , tagdb , TAG_NAME ) ;
2016-06-05 21:26:07 +00:00
ok ( tagstr = = 36 , " Expected string tag to be 36, was %u \n " , tagstr ) ;
2016-06-02 18:59:04 +00:00
tag = pSdbGetTagFromTagID ( pdb , tagstr ) ;
ok ( tag = = TAG_NAME , " Expected tag to be TAG_NAME, was 0x%x \n " , ( DWORD ) tag ) ;
size = pSdbGetTagDataSize ( pdb , tagstr ) ;
ok ( size = = 4 , " Expected size to be 4, was %u \n " , size ) ;
2016-06-05 21:26:07 +00:00
tagstr = pSdbFindNextTag ( pdb , tagdb , tagstr ) ;
ok ( tagstr = = 42 , " Expected string tag to be 42, was %u \n " , tagstr ) ;
tag = pSdbGetTagFromTagID ( pdb , tagstr ) ;
ok ( tag = = TAG_NAME , " Expected tag to be TAG_NAME, was 0x%x \n " , ( DWORD ) tag ) ;
size = pSdbGetTagDataSize ( pdb , tagstr ) ;
ok ( size = = 4 , " Expected size to be 4, was 0x%x \n " , size ) ;
2016-06-02 18:59:04 +00:00
tagdb = pSdbFindFirstTag ( pdb , TAGID_ROOT , TAG_STRINGTABLE ) ;
2016-06-05 21:26:07 +00:00
ok ( tagdb = = 48 , " Expected tag to be 48, was %u \n " , tagdb ) ;
2016-06-02 18:59:04 +00:00
size = pSdbGetTagDataSize ( pdb , tagdb ) ;
ok ( size = = 32 , " Expected size to be 32, was %u \n " , size ) ;
2016-06-05 21:26:07 +00:00
2016-06-02 18:59:04 +00:00
tagstr = pSdbGetFirstChild ( pdb , tagdb ) ;
2016-06-05 21:26:07 +00:00
ok ( tagstr = = 54 , " Expected string tag to be 54, was %u \n " , tagstr ) ;
2016-06-02 18:59:04 +00:00
tag = pSdbGetTagFromTagID ( pdb , tagstr ) ;
ok ( tag = = TAG_STRINGTABLE_ITEM , " Expected tag to be TAG_STRINGTABLE_ITEM, was 0x%x \n " , ( DWORD ) tag ) ;
size = pSdbGetTagDataSize ( pdb , tagstr ) ;
ok ( size = = 10 , " Expected size to be 10, was %u \n " , size ) ;
2016-06-05 21:26:07 +00:00
ptr = pSdbGetStringTagPtr ( pdb , tagstr ) ;
ok ( ptr ! = NULL , " Expected a valid pointer \n " ) ;
if ( ptr )
ok ( ! wcscmp ( ptr , test1 ) , " Expected ptr to be %s, was %s \n " , wine_dbgstr_w ( test1 ) , wine_dbgstr_w ( ptr ) ) ;
2016-06-02 18:59:04 +00:00
tagstr = pSdbGetNextChild ( pdb , tagdb , tagstr ) ;
2016-06-05 21:26:07 +00:00
ok ( tagstr = = 70 , " Expected string tag to be 70, was %u \n " , tagstr ) ;
2016-06-02 18:59:04 +00:00
tag = pSdbGetTagFromTagID ( pdb , tagstr ) ;
ok ( tag = = TAG_STRINGTABLE_ITEM , " Expected tag to be TAG_STRINGTABLE_ITEM, was 0x%x \n " , ( DWORD ) tag ) ;
size = pSdbGetTagDataSize ( pdb , tagstr ) ;
ok ( size = = 10 , " Expected size to be 10, was %u \n " , size ) ;
2016-06-05 21:26:07 +00:00
ptr = pSdbGetStringTagPtr ( pdb , tagstr ) ;
ok ( ptr ! = NULL , " Expected a valid pointer \n " ) ;
if ( ptr )
ok ( ! wcscmp ( ptr , test2 ) , " Expected ptr to be %s, was %s \n " , wine_dbgstr_w ( test2 ) , wine_dbgstr_w ( ptr ) ) ;
2016-06-02 18:59:04 +00:00
pSdbCloseDatabase ( pdb ) ;
}
2016-06-05 21:26:07 +00:00
static void write_db_strings ( const WCHAR * name , const WCHAR * data [ ] , size_t count )
{
PDB pdb ;
size_t n ;
BOOL ret ;
pdb = pSdbCreateDatabase ( name , DOS_PATH ) ;
ok ( pdb ! = NULL , " Failed to create db for case %u \n " , count ) ;
for ( n = 0 ; n < count ; + + n )
{
ret = pSdbWriteStringTag ( pdb , TAG_NAME , data [ n ] ) ;
ok ( ret , " Failed to write string %u/%u \n " , n , count ) ;
}
pSdbCloseDatabaseWrite ( pdb ) ;
}
static void test_stringtable ( )
{
static const WCHAR path1 [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , ' . ' , ' s ' , ' d ' , ' b ' , 0 } ;
static const WCHAR test1 [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , ' 1 ' , 0 } ;
static const WCHAR test2 [ ] = { ' T ' , ' e ' , ' s ' , ' t ' , ' 1 ' , 0 } ;
static const WCHAR test3 [ ] = { ' T ' , ' E ' , ' s ' , ' t ' , ' 1 ' , 0 } ;
static const WCHAR test4 [ ] = { ' T ' , ' E ' , ' S ' , ' T ' , ' 1 ' , 0 } ;
static const WCHAR test5 [ ] = { ' T ' , ' E ' , ' S ' , ' T ' , ' 2 ' , 0 } ;
static const WCHAR lipsum [ ] = { ' L ' , ' o ' , ' r ' , ' e ' , ' m ' , ' ' , ' i ' , ' p ' , ' s ' , ' u ' , ' m ' , ' ' , ' d ' , ' o ' , ' l ' , ' o ' , ' r ' , ' ' , ' s ' , ' i ' , ' t ' , ' ' , ' a ' , ' m ' , ' e ' , ' t ' , ' , ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' c ' , ' t ' , ' e ' , ' t ' , ' u ' , ' r ' , ' ' , ' a ' , ' d ' , ' i ' , ' p ' , ' i ' , ' s ' , ' c ' , ' i ' , ' n ' , ' g ' , ' ' , ' e ' , ' l ' , ' i ' , ' t ' , ' . ' , ' ' , ' N ' , ' u ' , ' l ' , ' l ' , ' a ' , ' ' , ' a ' , ' n ' , ' t ' , ' e ' , ' ' , ' r ' , ' i ' , ' s ' , ' u ' , ' s ' , ' , ' , ' ' , ' m ' , ' a ' , ' l ' , ' e ' , ' s ' , ' u ' , ' a ' , ' d ' , ' a ' , ' ' , ' s ' , ' e ' , ' d ' , ' ' , ' i ' , ' a ' , ' c ' , ' u ' , ' l ' , ' i ' , ' s ' , ' ' , ' l ' , ' u ' , ' c ' , ' t ' , ' u ' , ' s ' , ' , ' , ' ' , ' o ' , ' r ' , ' n ' , ' a ' , ' r ' , ' e ' , ' ' , ' p ' , ' u ' , ' l ' , ' v ' , ' i ' , ' n ' , ' a ' , ' r ' , ' ' , ' v ' , ' e ' , ' l ' , ' i ' , ' t ' , ' . ' , ' ' , ' L ' , ' o ' , ' r ' , ' e ' , ' m ' , ' ' , ' i ' , ' p ' , ' s ' , ' u ' , ' m ' , ' ' , ' d ' , ' o ' , ' l ' , ' o ' , ' r ' , ' ' , ' s ' , ' i ' , ' t ' , ' ' , ' a ' , ' m ' , ' e ' , ' t ' , ' , ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' c ' , ' t ' , ' e ' , ' t ' , ' u ' , ' r ' , ' ' , ' a ' , ' d ' , ' i ' , ' p ' , ' i ' , ' s ' , ' c ' , ' i ' , ' n ' , ' g ' , ' ' , ' e ' , ' l ' , ' i ' , ' t ' , ' . ' , ' ' , ' I ' , ' n ' , ' t ' , ' e ' , ' g ' , ' e ' , ' r ' , ' ' , ' q ' , ' u ' , ' i ' , ' s ' , ' ' , ' f ' , ' e ' , ' l ' , ' i ' , ' s ' , ' ' , ' u ' , ' t ' , ' ' , ' l ' , ' e ' , ' o ' , ' ' , ' e ' , ' l ' , ' e ' , ' i ' , ' f ' , ' e ' , ' n ' , ' d ' , ' ' , ' u ' , ' l ' , ' t ' , ' r ' , ' i ' , ' c ' , ' e ' , ' s ' , ' ' , ' f ' , ' i ' , ' n ' , ' i ' , ' b ' , ' u ' , ' s ' , ' ' , ' e ' , ' u ' , ' ' , ' d ' , ' o ' , ' l ' , ' o ' , ' r ' , ' . ' , ' ' , ' I ' , ' n ' , ' ' , ' b ' , ' i ' , ' b ' , ' e ' , ' n ' , ' d ' , ' u ' , ' m ' , ' , ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' ' , ' e ' , ' u ' , ' ' , ' f ' , ' a ' , ' u ' , ' c ' , ' i ' , ' b ' , ' u ' , ' s ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' q ' , ' u ' , ' a ' , ' t ' , ' , ' , ' ' , ' n ' , ' i ' , ' s ' , ' i ' , ' ' , ' m ' , ' a ' , ' g ' , ' n ' , ' a ' , ' ' , ' v ' , ' e ' , ' n ' , ' e ' , ' n ' , ' a ' , ' t ' , ' i ' , ' s ' , ' ' , ' j ' , ' u ' , ' s ' , ' t ' , ' o ' , ' , ' , ' ' , ' a ' , ' t ' , ' ' , ' t ' , ' r ' , ' i ' , ' s ' , ' t ' , ' i ' , ' q ' , ' u ' , ' e ' , ' ' , ' m ' , ' e ' , ' t ' , ' u ' , ' s ' , ' ' , ' d ' , ' o ' , ' l ' , ' o ' , ' r ' , ' ' , ' u ' , ' t ' , ' ' , ' r ' , ' i ' , ' s ' , ' u ' , ' s ' , ' . ' , ' ' , ' N ' , ' u ' , ' n ' , ' c ' , ' ' , ' e ' , ' u ' , ' ' , ' o ' , ' d ' , ' i ' , ' o ' , ' ' , ' d ' , ' i ' , ' g ' , ' n ' , ' i ' , ' s ' , ' s ' , ' i ' , ' m ' , ' , ' , ' ' , ' o ' , ' r ' , ' n ' , ' a ' , ' r ' , ' e ' , ' ' , ' a ' , ' n ' , ' t ' , ' e ' , ' ' , ' g ' , ' r ' , ' a ' , ' v ' , ' i ' , ' d ' , ' a ' , ' , ' , ' ' , ' l ' , ' o ' , ' b ' , ' o ' , ' r ' , ' t ' , ' i ' , ' s ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' . ' , ' ' , ' C ' , ' r ' , ' a ' , ' s ' , ' ' , ' s ' , ' e ' , ' m ' , ' ' , ' e ' , ' x ' , ' , ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' c ' , ' t ' , ' e ' , ' t ' , ' u ' , ' r ' , ' ' , ' p ' , ' u ' , ' l ' , ' v ' , ' i ' , ' n ' , ' a ' , ' r ' , ' ' , ' t ' , ' i ' , ' n ' , ' c ' , ' i ' , ' d ' , ' u ' , ' n ' , ' t ' , ' ' , ' e ' , ' u ' , ' , ' , ' ' , ' c ' , ' o ' , ' n ' , ' g ' , ' u ' , ' e ' , ' ' , ' a ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' . ' , ' ' , ' C ' , ' u ' , ' r ' , ' a ' , ' b ' , ' i ' , ' t ' , ' u ' , ' r ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' ' , ' e ' , ' r ' , ' a ' , ' t ' , ' , ' , ' ' , ' p ' , ' e ' , ' l ' , ' l ' , ' e ' , ' n ' , ' t ' , ' e ' , ' s ' , ' q ' , ' u ' , ' e ' , ' ' , ' e ' , ' t ' , ' ' , ' n ' , ' i ' , ' b ' , ' h ' , ' ' , ' q ' , ' u ' , ' i ' , ' s ' , ' , ' , ' ' , ' i ' , ' n ' , ' t ' , ' e ' , ' r ' , ' d ' , ' u ' , ' m ' , ' ' , ' t ' , ' e ' , ' m ' , ' p ' , ' o ' , ' r ' , ' ' , ' o ' , ' d ' , ' i ' , ' o ' , ' . ' , ' ' , ' E ' , ' t ' , ' i ' , ' a ' , ' m ' , ' ' , ' s ' , ' a ' , ' p ' , ' i ' , ' e ' , ' n ' , ' ' , ' s ' , ' a ' , ' p ' , ' i ' , ' e ' , ' n ' , ' , ' , ' ' , ' a ' , ' l ' , ' i ' , ' q ' , ' u ' , ' a ' , ' m ' , ' ' , ' u ' , ' t ' , ' ' , ' a ' , ' l ' , ' i ' , ' q ' , ' u ' , ' a ' , ' m ' , ' ' , ' a ' , ' t ' , ' , ' , ' ' , ' s ' , ' a ' , ' g ' , ' i ' , ' t ' , ' t ' , ' i ' , ' s ' , ' ' , ' e ' , ' u ' , ' ' , ' m ' , ' a ' , ' g ' , ' n ' , ' a ' , ' . ' , ' ' , ' M ' , ' a ' , ' e ' , ' c ' , ' e ' , ' n ' , ' a ' , ' s ' , ' ' , ' m ' , ' a ' , ' g ' , ' n ' , ' a ' , ' ' , ' m ' , ' a ' , ' g ' , ' n ' , ' a ' , ' , ' , ' ' , ' s ' , ' u ' , ' s ' , ' c ' , ' i ' , ' p ' , ' i ' , ' t ' , ' ' , ' u ' , ' t ' , ' ' , ' l ' , ' o ' , ' r ' , ' e ' , ' m ' , ' ' , ' u ' , ' t ' , ' , ' , ' ' , ' v ' , ' a ' , ' r ' , ' i ' , ' u ' , ' s ' , ' ' , ' p ' , ' r ' , ' e ' , ' t ' , ' i ' , ' u ' , ' m ' , ' ' , ' f ' , ' e ' , ' l ' , ' i ' , ' s ' , ' . ' , ' ' , ' I ' , ' n ' , ' t ' , ' e ' , ' g ' , ' e ' , ' r ' , ' ' , ' t ' , ' i ' , ' n ' , ' c ' , ' i ' , ' d ' , ' u ' , ' n ' , ' t ' , ' , ' , ' ' , ' m ' , ' e ' , ' t ' , ' u ' , ' s ' , ' ' , ' v ' , ' e ' , ' l ' , ' ' , ' s ' , ' o ' , ' l ' , ' l ' , ' i ' , ' c ' , ' i ' , ' t ' , ' u ' , ' d ' , ' i ' , ' n ' , ' ' , ' f ' , ' i ' , ' n ' , ' i ' , ' b ' , ' u ' , ' s ' , ' , ' , ' ' , ' f ' , ' e ' , ' l ' , ' i ' , ' s ' , ' ' , ' e ' , ' r ' , ' a ' , ' t ' , ' ' , ' m ' , ' o ' , ' l ' , ' e ' , ' s ' , ' t ' , ' i ' , ' e ' , ' ' , ' u ' , ' r ' , ' n ' , ' a ' , ' , ' , ' ' , ' a ' , ' ' , ' c ' , ' o ' , ' n ' , ' d ' , ' i ' , ' m ' , ' e ' , ' n ' , ' t ' , ' u ' , ' m ' , ' ' , ' a ' , ' u ' , ' g ' , ' u ' , ' e ' , ' ' , ' a ' , ' r ' , ' c ' , ' u ' , ' ' , ' v ' , ' i ' , ' t ' , ' a ' , ' e ' , ' ' , ' r ' , ' i ' , ' s ' , ' u ' , ' s ' , ' . ' , ' ' , ' E ' , ' t ' , ' i ' , ' a ' , ' m ' , ' ' , ' i ' , ' d ' , ' ' , ' s ' , ' a ' , ' g ' , ' i ' , ' t ' , ' t ' , ' i ' , ' s ' , ' ' , ' q ' , ' u ' , ' a ' , ' m ' , ' . ' , ' ' , ' M ' , ' o ' , ' r ' , ' b ' , ' i ' , ' ' , ' a ' , ' ' , ' u ' , ' l ' , ' t ' , ' r ' , ' i ' , ' c ' , ' i ' , ' e ' , ' s ' , ' ' , ' n ' , ' u ' , ' n ' , ' c ' , ' . ' , ' ' , ' P ' , ' h ' , ' a ' , ' s ' , ' e ' , ' l ' , ' l ' , ' u ' , ' s ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' ' , ' r ' , ' i ' , ' s ' , ' u ' , ' s ' , ' , ' , ' ' , ' c ' , ' u ' , ' r ' , ' s ' , ' u ' , ' s ' , ' ' , ' u ' , ' l ' , ' l ' , ' a ' , ' m ' , ' c ' , ' o ' , ' r ' , ' p ' , ' e ' , ' r ' , ' ' , ' m ' , ' a ' , ' s ' , ' s ' , ' a ' , ' ' , ' s ' , ' e ' , ' d ' , ' , ' , ' ' , ' d ' , ' i ' , ' g ' , ' n ' , ' i ' , ' s ' , ' s ' , ' i ' , ' m ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' q ' , ' u ' , ' a ' , ' t ' , ' ' , ' l ' , ' i ' , ' g ' , ' u ' , ' l ' , ' a ' , ' . ' , ' ' , ' A ' , ' l ' , ' i ' , ' q ' , ' u ' , ' a ' , ' m ' , ' ' , ' t ' , ' u ' , ' r ' , ' p ' , ' i ' , ' s ' , ' ' , ' a ' , ' r ' , ' c ' , ' u ' , ' , ' , ' ' , ' a ' , ' c ' , ' c ' , ' u ' , ' m ' , ' s ' , ' a ' , ' n ' , ' ' , ' q ' , ' u ' , ' i ' , ' s ' , ' ' , ' s ' , ' a ' , ' p ' , ' i ' , ' e ' , ' n ' , ' ' , ' v ' , ' i ' , ' t ' , ' a ' , ' e ' , ' , ' , ' ' , ' l ' , ' a ' , ' c ' , ' i ' , ' n ' , ' i ' , ' a ' , ' ' , ' e ' , ' u ' , ' i ' , ' s ' , ' m ' , ' o ' , ' d ' , ' ' , ' n ' , ' i ' , ' s ' , ' l ' , ' . ' , ' ' , ' M ' , ' a ' , ' u ' , ' r ' , ' i ' , ' s ' , ' ' , ' i ' , ' d ' , ' ' , ' f ' , ' e ' , ' l ' , ' i ' , ' s ' , ' ' , ' s ' , ' e ' , ' m ' , ' . ' , 0 } ;
/* Last char changed from '.' to '!' */
static const WCHAR lipsum2 [ ] = { ' L ' , ' o ' , ' r ' , ' e ' , ' m ' , ' ' , ' i ' , ' p ' , ' s ' , ' u ' , ' m ' , ' ' , ' d ' , ' o ' , ' l ' , ' o ' , ' r ' , ' ' , ' s ' , ' i ' , ' t ' , ' ' , ' a ' , ' m ' , ' e ' , ' t ' , ' , ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' c ' , ' t ' , ' e ' , ' t ' , ' u ' , ' r ' , ' ' , ' a ' , ' d ' , ' i ' , ' p ' , ' i ' , ' s ' , ' c ' , ' i ' , ' n ' , ' g ' , ' ' , ' e ' , ' l ' , ' i ' , ' t ' , ' . ' , ' ' , ' N ' , ' u ' , ' l ' , ' l ' , ' a ' , ' ' , ' a ' , ' n ' , ' t ' , ' e ' , ' ' , ' r ' , ' i ' , ' s ' , ' u ' , ' s ' , ' , ' , ' ' , ' m ' , ' a ' , ' l ' , ' e ' , ' s ' , ' u ' , ' a ' , ' d ' , ' a ' , ' ' , ' s ' , ' e ' , ' d ' , ' ' , ' i ' , ' a ' , ' c ' , ' u ' , ' l ' , ' i ' , ' s ' , ' ' , ' l ' , ' u ' , ' c ' , ' t ' , ' u ' , ' s ' , ' , ' , ' ' , ' o ' , ' r ' , ' n ' , ' a ' , ' r ' , ' e ' , ' ' , ' p ' , ' u ' , ' l ' , ' v ' , ' i ' , ' n ' , ' a ' , ' r ' , ' ' , ' v ' , ' e ' , ' l ' , ' i ' , ' t ' , ' . ' , ' ' , ' L ' , ' o ' , ' r ' , ' e ' , ' m ' , ' ' , ' i ' , ' p ' , ' s ' , ' u ' , ' m ' , ' ' , ' d ' , ' o ' , ' l ' , ' o ' , ' r ' , ' ' , ' s ' , ' i ' , ' t ' , ' ' , ' a ' , ' m ' , ' e ' , ' t ' , ' , ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' c ' , ' t ' , ' e ' , ' t ' , ' u ' , ' r ' , ' ' , ' a ' , ' d ' , ' i ' , ' p ' , ' i ' , ' s ' , ' c ' , ' i ' , ' n ' , ' g ' , ' ' , ' e ' , ' l ' , ' i ' , ' t ' , ' . ' , ' ' , ' I ' , ' n ' , ' t ' , ' e ' , ' g ' , ' e ' , ' r ' , ' ' , ' q ' , ' u ' , ' i ' , ' s ' , ' ' , ' f ' , ' e ' , ' l ' , ' i ' , ' s ' , ' ' , ' u ' , ' t ' , ' ' , ' l ' , ' e ' , ' o ' , ' ' , ' e ' , ' l ' , ' e ' , ' i ' , ' f ' , ' e ' , ' n ' , ' d ' , ' ' , ' u ' , ' l ' , ' t ' , ' r ' , ' i ' , ' c ' , ' e ' , ' s ' , ' ' , ' f ' , ' i ' , ' n ' , ' i ' , ' b ' , ' u ' , ' s ' , ' ' , ' e ' , ' u ' , ' ' , ' d ' , ' o ' , ' l ' , ' o ' , ' r ' , ' . ' , ' ' , ' I ' , ' n ' , ' ' , ' b ' , ' i ' , ' b ' , ' e ' , ' n ' , ' d ' , ' u ' , ' m ' , ' , ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' ' , ' e ' , ' u ' , ' ' , ' f ' , ' a ' , ' u ' , ' c ' , ' i ' , ' b ' , ' u ' , ' s ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' q ' , ' u ' , ' a ' , ' t ' , ' , ' , ' ' , ' n ' , ' i ' , ' s ' , ' i ' , ' ' , ' m ' , ' a ' , ' g ' , ' n ' , ' a ' , ' ' , ' v ' , ' e ' , ' n ' , ' e ' , ' n ' , ' a ' , ' t ' , ' i ' , ' s ' , ' ' , ' j ' , ' u ' , ' s ' , ' t ' , ' o ' , ' , ' , ' ' , ' a ' , ' t ' , ' ' , ' t ' , ' r ' , ' i ' , ' s ' , ' t ' , ' i ' , ' q ' , ' u ' , ' e ' , ' ' , ' m ' , ' e ' , ' t ' , ' u ' , ' s ' , ' ' , ' d ' , ' o ' , ' l ' , ' o ' , ' r ' , ' ' , ' u ' , ' t ' , ' ' , ' r ' , ' i ' , ' s ' , ' u ' , ' s ' , ' . ' , ' ' , ' N ' , ' u ' , ' n ' , ' c ' , ' ' , ' e ' , ' u ' , ' ' , ' o ' , ' d ' , ' i ' , ' o ' , ' ' , ' d ' , ' i ' , ' g ' , ' n ' , ' i ' , ' s ' , ' s ' , ' i ' , ' m ' , ' , ' , ' ' , ' o ' , ' r ' , ' n ' , ' a ' , ' r ' , ' e ' , ' ' , ' a ' , ' n ' , ' t ' , ' e ' , ' ' , ' g ' , ' r ' , ' a ' , ' v ' , ' i ' , ' d ' , ' a ' , ' , ' , ' ' , ' l ' , ' o ' , ' b ' , ' o ' , ' r ' , ' t ' , ' i ' , ' s ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' . ' , ' ' , ' C ' , ' r ' , ' a ' , ' s ' , ' ' , ' s ' , ' e ' , ' m ' , ' ' , ' e ' , ' x ' , ' , ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' c ' , ' t ' , ' e ' , ' t ' , ' u ' , ' r ' , ' ' , ' p ' , ' u ' , ' l ' , ' v ' , ' i ' , ' n ' , ' a ' , ' r ' , ' ' , ' t ' , ' i ' , ' n ' , ' c ' , ' i ' , ' d ' , ' u ' , ' n ' , ' t ' , ' ' , ' e ' , ' u ' , ' , ' , ' ' , ' c ' , ' o ' , ' n ' , ' g ' , ' u ' , ' e ' , ' ' , ' a ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' . ' , ' ' , ' C ' , ' u ' , ' r ' , ' a ' , ' b ' , ' i ' , ' t ' , ' u ' , ' r ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' ' , ' e ' , ' r ' , ' a ' , ' t ' , ' , ' , ' ' , ' p ' , ' e ' , ' l ' , ' l ' , ' e ' , ' n ' , ' t ' , ' e ' , ' s ' , ' q ' , ' u ' , ' e ' , ' ' , ' e ' , ' t ' , ' ' , ' n ' , ' i ' , ' b ' , ' h ' , ' ' , ' q ' , ' u ' , ' i ' , ' s ' , ' , ' , ' ' , ' i ' , ' n ' , ' t ' , ' e ' , ' r ' , ' d ' , ' u ' , ' m ' , ' ' , ' t ' , ' e ' , ' m ' , ' p ' , ' o ' , ' r ' , ' ' , ' o ' , ' d ' , ' i ' , ' o ' , ' . ' , ' ' , ' E ' , ' t ' , ' i ' , ' a ' , ' m ' , ' ' , ' s ' , ' a ' , ' p ' , ' i ' , ' e ' , ' n ' , ' ' , ' s ' , ' a ' , ' p ' , ' i ' , ' e ' , ' n ' , ' , ' , ' ' , ' a ' , ' l ' , ' i ' , ' q ' , ' u ' , ' a ' , ' m ' , ' ' , ' u ' , ' t ' , ' ' , ' a ' , ' l ' , ' i ' , ' q ' , ' u ' , ' a ' , ' m ' , ' ' , ' a ' , ' t ' , ' , ' , ' ' , ' s ' , ' a ' , ' g ' , ' i ' , ' t ' , ' t ' , ' i ' , ' s ' , ' ' , ' e ' , ' u ' , ' ' , ' m ' , ' a ' , ' g ' , ' n ' , ' a ' , ' . ' , ' ' , ' M ' , ' a ' , ' e ' , ' c ' , ' e ' , ' n ' , ' a ' , ' s ' , ' ' , ' m ' , ' a ' , ' g ' , ' n ' , ' a ' , ' ' , ' m ' , ' a ' , ' g ' , ' n ' , ' a ' , ' , ' , ' ' , ' s ' , ' u ' , ' s ' , ' c ' , ' i ' , ' p ' , ' i ' , ' t ' , ' ' , ' u ' , ' t ' , ' ' , ' l ' , ' o ' , ' r ' , ' e ' , ' m ' , ' ' , ' u ' , ' t ' , ' , ' , ' ' , ' v ' , ' a ' , ' r ' , ' i ' , ' u ' , ' s ' , ' ' , ' p ' , ' r ' , ' e ' , ' t ' , ' i ' , ' u ' , ' m ' , ' ' , ' f ' , ' e ' , ' l ' , ' i ' , ' s ' , ' . ' , ' ' , ' I ' , ' n ' , ' t ' , ' e ' , ' g ' , ' e ' , ' r ' , ' ' , ' t ' , ' i ' , ' n ' , ' c ' , ' i ' , ' d ' , ' u ' , ' n ' , ' t ' , ' , ' , ' ' , ' m ' , ' e ' , ' t ' , ' u ' , ' s ' , ' ' , ' v ' , ' e ' , ' l ' , ' ' , ' s ' , ' o ' , ' l ' , ' l ' , ' i ' , ' c ' , ' i ' , ' t ' , ' u ' , ' d ' , ' i ' , ' n ' , ' ' , ' f ' , ' i ' , ' n ' , ' i ' , ' b ' , ' u ' , ' s ' , ' , ' , ' ' , ' f ' , ' e ' , ' l ' , ' i ' , ' s ' , ' ' , ' e ' , ' r ' , ' a ' , ' t ' , ' ' , ' m ' , ' o ' , ' l ' , ' e ' , ' s ' , ' t ' , ' i ' , ' e ' , ' ' , ' u ' , ' r ' , ' n ' , ' a ' , ' , ' , ' ' , ' a ' , ' ' , ' c ' , ' o ' , ' n ' , ' d ' , ' i ' , ' m ' , ' e ' , ' n ' , ' t ' , ' u ' , ' m ' , ' ' , ' a ' , ' u ' , ' g ' , ' u ' , ' e ' , ' ' , ' a ' , ' r ' , ' c ' , ' u ' , ' ' , ' v ' , ' i ' , ' t ' , ' a ' , ' e ' , ' ' , ' r ' , ' i ' , ' s ' , ' u ' , ' s ' , ' . ' , ' ' , ' E ' , ' t ' , ' i ' , ' a ' , ' m ' , ' ' , ' i ' , ' d ' , ' ' , ' s ' , ' a ' , ' g ' , ' i ' , ' t ' , ' t ' , ' i ' , ' s ' , ' ' , ' q ' , ' u ' , ' a ' , ' m ' , ' . ' , ' ' , ' M ' , ' o ' , ' r ' , ' b ' , ' i ' , ' ' , ' a ' , ' ' , ' u ' , ' l ' , ' t ' , ' r ' , ' i ' , ' c ' , ' i ' , ' e ' , ' s ' , ' ' , ' n ' , ' u ' , ' n ' , ' c ' , ' . ' , ' ' , ' P ' , ' h ' , ' a ' , ' s ' , ' e ' , ' l ' , ' l ' , ' u ' , ' s ' , ' ' , ' e ' , ' r ' , ' o ' , ' s ' , ' ' , ' r ' , ' i ' , ' s ' , ' u ' , ' s ' , ' , ' , ' ' , ' c ' , ' u ' , ' r ' , ' s ' , ' u ' , ' s ' , ' ' , ' u ' , ' l ' , ' l ' , ' a ' , ' m ' , ' c ' , ' o ' , ' r ' , ' p ' , ' e ' , ' r ' , ' ' , ' m ' , ' a ' , ' s ' , ' s ' , ' a ' , ' ' , ' s ' , ' e ' , ' d ' , ' , ' , ' ' , ' d ' , ' i ' , ' g ' , ' n ' , ' i ' , ' s ' , ' s ' , ' i ' , ' m ' , ' ' , ' c ' , ' o ' , ' n ' , ' s ' , ' e ' , ' q ' , ' u ' , ' a ' , ' t ' , ' ' , ' l ' , ' i ' , ' g ' , ' u ' , ' l ' , ' a ' , ' . ' , ' ' , ' A ' , ' l ' , ' i ' , ' q ' , ' u ' , ' a ' , ' m ' , ' ' , ' t ' , ' u ' , ' r ' , ' p ' , ' i ' , ' s ' , ' ' , ' a ' , ' r ' , ' c ' , ' u ' , ' , ' , ' ' , ' a ' , ' c ' , ' c ' , ' u ' , ' m ' , ' s ' , ' a ' , ' n ' , ' ' , ' q ' , ' u ' , ' i ' , ' s ' , ' ' , ' s ' , ' a ' , ' p ' , ' i ' , ' e ' , ' n ' , ' ' , ' v ' , ' i ' , ' t ' , ' a ' , ' e ' , ' , ' , ' ' , ' l ' , ' a ' , ' c ' , ' i ' , ' n ' , ' i ' , ' a ' , ' ' , ' e ' , ' u ' , ' i ' , ' s ' , ' m ' , ' o ' , ' d ' , ' ' , ' n ' , ' i ' , ' s ' , ' l ' , ' . ' , ' ' , ' M ' , ' a ' , ' u ' , ' r ' , ' i ' , ' s ' , ' ' , ' i ' , ' d ' , ' ' , ' f ' , ' e ' , ' l ' , ' i ' , ' s ' , ' ' , ' s ' , ' e ' , ' m ' , ' ! ' , 0 } ;
static const WCHAR empty [ ] = { 0 } ;
static const WCHAR * all [ ] = { test1 , test2 , test3 , test4 , test5 , lipsum , lipsum2 , empty } ;
static const TAGID expected_str [ ] = { 0xc , 0x12 , 0x18 , 0x1e , 0x24 , 0x2a , 0x30 , 0x36 } ;
static const TAGID expected_tab [ ] = { 6 , 0x18 , 0x2a , 0x3c , 0x4e , 0x60 , 0x846 , 0x102c } ;
size_t n , j ;
for ( n = 0 ; n < ( sizeof ( all ) / sizeof ( all [ 0 ] ) ) ; + + n )
{
PDB pdb ;
TAGID tagstr , table , expected_table ;
write_db_strings ( path1 , all , n + 1 ) ;
pdb = pSdbOpenDatabase ( path1 , DOS_PATH ) ;
ok ( pdb ! = NULL , " Expected a valid database \n " ) ;
if ( ! pdb )
{
DeleteFileW ( path1 ) ;
continue ;
}
tagstr = pSdbFindFirstTag ( pdb , TAGID_ROOT , TAG_NAME ) ;
for ( j = 0 ; j < = n ; + + j )
{
ok ( tagstr = = expected_str [ j ] , " Expected tagstr to be 0x%x, was 0x%x for %u/%u \n " , expected_str [ j ] , tagstr , j , n ) ;
if ( tagstr )
{
LPWSTR data ;
DWORD size ;
TAG tag = pSdbGetTagFromTagID ( pdb , tagstr ) ;
ok ( tag = = TAG_NAME , " Expected tag to be TAG_NAME, was 0x%x for %u/%u \n " , tag , j , n ) ;
size = pSdbGetTagDataSize ( pdb , tagstr ) ;
ok ( size = = 4 , " Expected datasize to be 4, was %u for %u/%u \n " , size , j , n ) ;
data = pSdbGetStringTagPtr ( pdb , tagstr ) ;
ok ( data & & ! wcsicmp ( data , all [ j ] ) , " Expected data to be %s was %s for %u/%u \n " , wine_dbgstr_w ( all [ j ] ) , wine_dbgstr_w ( data ) , j , n ) ;
}
tagstr = pSdbFindNextTag ( pdb , TAGID_ROOT , tagstr ) ;
}
ok ( tagstr = = TAGID_NULL , " Expected to be at the end for %u \n " , n ) ;
table = pSdbFindFirstTag ( pdb , TAGID_ROOT , TAG_STRINGTABLE ) ;
expected_table = 0xc + ( n + 1 ) * 6 ;
ok ( table = = expected_table , " Expected to find a stringtable at 0x%x instead of 0x%x for %u \n " , expected_table , table , n ) ;
if ( table )
{
tagstr = pSdbFindFirstTag ( pdb , table , TAG_STRINGTABLE_ITEM ) ;
for ( j = 0 ; j < = n ; + + j )
{
ok ( tagstr = = ( expected_tab [ j ] + expected_table ) , " Expected tagstr to be 0x%x, was 0x%x for %u/%u \n " , ( expected_tab [ j ] + expected_table ) , tagstr , j , n ) ;
if ( tagstr )
{
LPWSTR data ;
DWORD size , expected_size ;
TAG tag = pSdbGetTagFromTagID ( pdb , tagstr ) ;
ok ( tag = = TAG_STRINGTABLE_ITEM , " Expected tag to be TAG_NAME, was 0x%x for %u/%u \n " , tag , j , n ) ;
size = pSdbGetTagDataSize ( pdb , tagstr ) ;
expected_size = ( lstrlenW ( all [ j ] ) + 1 ) * 2 ;
ok ( size = = expected_size , " Expected datasize to be %u, was %u for %u/%u \n " , expected_size , size , j , n ) ;
data = pSdbGetStringTagPtr ( pdb , tagstr ) ;
ok ( data & & ! wcsicmp ( data , all [ j ] ) , " Expected data to be %s was %s for %u/%u \n " , wine_dbgstr_w ( all [ j ] ) , wine_dbgstr_w ( data ) , j , n ) ;
}
tagstr = pSdbFindNextTag ( pdb , TAGID_ROOT , tagstr ) ;
}
ok ( tagstr = = TAGID_NULL , " Expected to be at the end for %u \n " , n ) ;
}
pSdbCloseDatabase ( pdb ) ;
DeleteFileW ( path1 ) ;
}
}
2017-06-26 10:26:57 +00:00
static void match_strw_attr_imp ( PDB pdb , TAGID parent , TAG find , const WCHAR * compare )
2016-05-22 20:39:41 +00:00
{
TAGID attr = pSdbFindFirstTag ( pdb , parent , find ) ;
winetest_ok ( attr ! = TAG_NULL , " Could not find: %x \n " , find ) ;
if ( attr ! = TAG_NULL )
{
LPWSTR name = pSdbGetStringTagPtr ( pdb , attr ) ;
winetest_ok ( name ! = NULL , " Could not convert attr to str. \n " ) ;
if ( name )
{
2017-06-26 10:26:57 +00:00
winetest_ok ( wcscmp ( name , compare ) = = 0 , " Expected tagid %x to be %s, was %s \n " , attr , wine_dbgstr_w ( compare ) , wine_dbgstr_w ( name ) ) ;
2016-05-22 20:39:41 +00:00
}
}
}
static void match_dw_attr_imp ( PDB pdb , TAGID parent , TAG find , DWORD compare )
{
TAGID attr = pSdbFindFirstTag ( pdb , parent , find ) ;
winetest_ok ( attr ! = TAG_NULL , " Could not find: %x \n " , find ) ;
if ( attr ! = TAG_NULL )
{
DWORD val = pSdbReadDWORDTag ( pdb , attr , 0x1234567 ) ;
winetest_ok ( val = = compare , " Expected tagid %x to be 0x%x, was 0x%x \n " , attr , compare , val ) ;
}
}
static void match_qw_attr_imp ( PDB pdb , TAGID parent , TAG find , QWORD compare )
{
TAGID attr = pSdbFindFirstTag ( pdb , parent , find ) ;
winetest_ok ( attr ! = TAG_NULL , " Could not find: %x \n " , find ) ;
if ( attr ! = TAG_NULL )
{
QWORD val = pSdbReadQWORDTag ( pdb , attr , 0x123456789abcdef ) ;
winetest_ok ( val = = compare , " Expected tagid %x to be 0x%I64x, was 0x%I64x \n " , attr , compare , val ) ;
}
}
static void match_guid_attr_imp ( PDB pdb , TAGID parent , TAG find , const GUID * compare )
{
TAGID attr = pSdbFindFirstTag ( pdb , parent , find ) ;
winetest_ok ( attr ! = TAG_NULL , " Could not find: %x \n " , find ) ;
if ( attr ! = TAG_NULL )
{
2016-10-30 19:39:43 +00:00
GUID guid = { 0 } ;
2016-05-22 20:39:41 +00:00
BOOL result = pSdbReadBinaryTag ( pdb , attr , ( PBYTE ) & guid , sizeof ( guid ) ) ;
winetest_ok ( result , " expected pSdbReadBinaryTag not to fail. \n " ) ;
2016-10-30 19:39:43 +00:00
winetest_ok ( IsEqualGUID ( guid , * compare ) , " expected guids to be equal(%s:%s) \n " , wine_dbgstr_guid ( & guid ) , wine_dbgstr_guid ( compare ) ) ;
2016-05-22 20:39:41 +00:00
}
}
2017-06-26 10:26:57 +00:00
# define match_strw_attr (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_strw_attr_imp
2016-05-22 20:39:41 +00:00
# define match_dw_attr (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_dw_attr_imp
# define match_qw_attr (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_qw_attr_imp
# define match_guid_attr (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_guid_attr_imp
//The application name cannot contain any of the following characters:
// \ / < > : * ? | "
static void check_db_properties ( PDB pdb , TAGID root )
{
TAGID iter = pSdbFindFirstTag ( pdb , root , TAG_DATABASE_ID ) ;
ok ( iter ! = TAGID_NULL , " expected a result, got TAGID_NULL \n " ) ;
2016-10-30 19:39:43 +00:00
if ( iter ! = TAGID_NULL )
2016-05-22 20:39:41 +00:00
{
2016-10-30 19:39:43 +00:00
GUID guid = { 0 } , guid2 = { 0 } ;
2016-05-22 20:39:41 +00:00
BOOL result = pSdbReadBinaryTag ( pdb , iter , ( PBYTE ) & guid , sizeof ( guid ) ) ;
ok ( result , " expected SdbReadBinaryTag not to fail. \n " ) ;
2016-10-30 19:39:43 +00:00
if ( result )
2016-05-22 20:39:41 +00:00
{
WCHAR guid_wstr [ 50 ] ;
result = pSdbGUIDToString ( & guid , guid_wstr , 50 ) ;
ok ( result , " expected SdbGUIDToString not to fail. \n " ) ;
2016-10-30 19:39:43 +00:00
if ( result )
2016-05-22 20:39:41 +00:00
{
char guid_str [ 50 ] ;
2016-10-30 19:39:43 +00:00
WideCharToMultiByte ( CP_ACP , 0 , guid_wstr , - 1 , guid_str , sizeof ( guid_str ) , NULL , NULL ) ;
2016-05-28 21:46:24 +00:00
ok_str ( guid_str , " {e39b0eb0-55db-450b-9bd4-d20c9484260f} " ) ;
2016-05-22 20:39:41 +00:00
}
2016-10-30 19:39:43 +00:00
ok ( pSdbGetDatabaseID ( pdb , & guid2 ) , " expected SdbGetDatabaseID not to fail. \n " ) ;
ok ( IsEqualGUID ( guid , guid2 ) , " expected guids to be equal(%s:%s) \n " , wine_dbgstr_guid ( & guid ) , wine_dbgstr_guid ( & guid2 ) ) ;
2016-05-22 20:39:41 +00:00
}
}
2016-05-28 21:46:24 +00:00
match_qw_attr ( pdb , root , TAG_TIME , 0x1d1b91a02c0d63e ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , root , TAG_COMPILER_VERSION , L " 2.1.0.3 " ) ;
match_strw_attr ( pdb , root , TAG_NAME , L " apphelp_test1 " ) ;
2016-05-22 20:39:41 +00:00
match_dw_attr ( pdb , root , TAG_OS_PLATFORM , 1 ) ;
}
static void check_db_layer ( PDB pdb , TAGID layer )
{
TAGID shimref , inexclude , is_include ;
ok ( layer ! = TAGID_NULL , " Expected a valid layer, got NULL \n " ) ;
2016-10-30 19:39:43 +00:00
if ( ! layer )
2016-05-22 20:39:41 +00:00
return ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , layer , TAG_NAME , L " TestNewMode " ) ;
2016-05-22 20:39:41 +00:00
shimref = pSdbFindFirstTag ( pdb , layer , TAG_SHIM_REF ) ;
ok ( shimref ! = TAGID_NULL , " Expected a valid shim ref, got NULL \n " ) ;
2016-10-30 19:39:43 +00:00
if ( ! shimref )
2016-05-22 20:39:41 +00:00
return ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , shimref , TAG_NAME , L " VirtualRegistry " ) ;
match_strw_attr ( pdb , shimref , TAG_COMMAND_LINE , L " ThemeActive " ) ;
2016-05-22 20:39:41 +00:00
inexclude = pSdbFindFirstTag ( pdb , shimref , TAG_INEXCLUD ) ;
ok ( inexclude ! = TAGID_NULL , " Expected a valid in/exclude ref, got NULL \n " ) ;
2016-10-30 19:39:43 +00:00
if ( ! inexclude )
2016-05-22 20:39:41 +00:00
return ;
is_include = pSdbFindFirstTag ( pdb , inexclude , TAG_INCLUDE ) ;
2016-05-28 21:46:24 +00:00
ok ( is_include = = TAGID_NULL , " Expected a NULL include ref, but got one anyway. \n " ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , inexclude , TAG_MODULE , L " exclude.dll " ) ;
2016-05-22 20:39:41 +00:00
inexclude = pSdbFindNextTag ( pdb , shimref , inexclude ) ;
ok ( inexclude ! = TAGID_NULL , " Expected a valid in/exclude ref, got NULL \n " ) ;
2016-10-30 19:39:43 +00:00
if ( ! inexclude )
2016-05-22 20:39:41 +00:00
return ;
is_include = pSdbFindFirstTag ( pdb , inexclude , TAG_INCLUDE ) ;
2016-05-28 21:46:24 +00:00
ok ( is_include ! = TAGID_NULL , " Expected a valid include ref, got NULL \n " ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , inexclude , TAG_MODULE , L " include.dll " ) ;
2016-05-22 20:39:41 +00:00
}
static void check_matching_file ( PDB pdb , TAGID exe , TAGID matching_file , int num )
{
ok ( matching_file ! = TAGID_NULL , " Expected to find atleast 1 matching file. \n " ) ;
2016-10-30 19:39:43 +00:00
if ( matching_file = = TAGID_NULL )
2016-05-22 20:39:41 +00:00
return ;
ok ( num < 4 , " Too many matches, expected only 4! \n " ) ;
if ( num > = 4 )
return ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , matching_file , TAG_NAME , L " * " ) ;
match_strw_attr ( pdb , matching_file , TAG_COMPANY_NAME , L " CompanyName " ) ;
match_strw_attr ( pdb , matching_file , TAG_PRODUCT_NAME , L " ProductName " ) ;
match_strw_attr ( pdb , matching_file , TAG_PRODUCT_VERSION , L " 1.0.0.1 " ) ;
match_strw_attr ( pdb , matching_file , TAG_FILE_VERSION , L " 1.0.0.0 " ) ;
2016-05-22 20:39:41 +00:00
2016-10-30 19:39:43 +00:00
if ( num = = 0 | | num = = 3 )
2016-05-22 20:39:41 +00:00
{
match_qw_attr ( pdb , matching_file , TAG_UPTO_BIN_PRODUCT_VERSION , 0x1000000000001 ) ;
match_qw_attr ( pdb , matching_file , TAG_UPTO_BIN_FILE_VERSION , 0x1000000000000 ) ;
}
2016-10-30 19:39:43 +00:00
if ( num = = 1 | | num = = 3 )
2016-05-22 20:39:41 +00:00
{
2016-05-28 21:46:24 +00:00
match_dw_attr ( pdb , matching_file , TAG_PE_CHECKSUM , 0xbaad ) ;
2016-05-22 20:39:41 +00:00
}
2016-10-30 19:39:43 +00:00
if ( num ! = 0 )
2016-05-22 20:39:41 +00:00
{
match_qw_attr ( pdb , matching_file , TAG_BIN_PRODUCT_VERSION , 0x1000000000001 ) ;
match_qw_attr ( pdb , matching_file , TAG_BIN_FILE_VERSION , 0x1000000000000 ) ;
}
2016-10-30 19:39:43 +00:00
if ( num = = 3 )
2016-05-22 20:39:41 +00:00
{
match_dw_attr ( pdb , matching_file , TAG_SIZE , 0x800 ) ;
2016-05-28 21:46:24 +00:00
match_dw_attr ( pdb , matching_file , TAG_CHECKSUM , 0x178bd629 ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , matching_file , TAG_FILE_DESCRIPTION , L " FileDescription " ) ;
2016-05-22 20:39:41 +00:00
match_dw_attr ( pdb , matching_file , TAG_MODULE_TYPE , 3 ) ;
match_dw_attr ( pdb , matching_file , TAG_VERFILEOS , 4 ) ;
match_dw_attr ( pdb , matching_file , TAG_VERFILETYPE , 1 ) ;
2016-05-28 21:46:24 +00:00
match_dw_attr ( pdb , matching_file , TAG_LINKER_VERSION , 0x40002 ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , matching_file , TAG_ORIGINAL_FILENAME , L " OriginalFilename " ) ;
match_strw_attr ( pdb , matching_file , TAG_INTERNAL_NAME , L " InternalName " ) ;
match_strw_attr ( pdb , matching_file , TAG_LEGAL_COPYRIGHT , L " LegalCopyright " ) ;
2016-05-28 21:46:24 +00:00
match_dw_attr ( pdb , matching_file , TAG_LINK_DATE , 0x12345 ) ;
match_dw_attr ( pdb , matching_file , TAG_UPTO_LINK_DATE , 0x12345 ) ;
2016-05-22 20:39:41 +00:00
}
2016-10-30 19:39:43 +00:00
if ( num > 3 )
2016-05-22 20:39:41 +00:00
{
ok ( 0 , " unknown case: %d \n " , num ) ;
}
matching_file = pSdbFindNextTag ( pdb , exe , matching_file ) ;
2016-10-30 19:39:43 +00:00
if ( num = = 2 )
2016-05-22 20:39:41 +00:00
{
ok ( matching_file ! = TAGID_NULL , " Did expect a secondary match on %d \n " , num ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , matching_file , TAG_NAME , L " test_checkfile.txt " ) ;
2016-05-22 20:39:41 +00:00
match_dw_attr ( pdb , matching_file , TAG_SIZE , 0x4 ) ;
match_dw_attr ( pdb , matching_file , TAG_CHECKSUM , 0xb0b0b0b0 ) ;
}
else
{
ok ( matching_file = = TAGID_NULL , " Did not expect a secondary match on %d \n " , num ) ;
}
}
2016-09-03 16:20:52 +00:00
// "C:\WINDOWS\system32\pcaui.exe" /g {bf39e0e6-c61c-4a22-8802-3ea8ad00b655} /x {4e50c93f-b863-4dfa-bae2-d80ef4ce5c89} /a "apphelp_name_allow" /v "apphelp_vendor_allow" /s "Allow it!" /b 1 /f 0 /k 0 /e "C:\Users\Mark\AppData\Local\Temp\apphelp_test\test_allow.exe" /u "http://reactos.org/allow" /c
// "C:\WINDOWS\system32\pcaui.exe" /g {fa150915-1244-4169-a4ba-fc098c442840} /x {156720e1-ef98-4d04-965a-d85de05e6d9f} /a "apphelp_name_disallow" /v "apphelp_vendor_disallow" /s "Not allowed!" /b 2 /f 0 /k 0 /e "C:\Users\Mark\AppData\Local\Temp\apphelp_test\test_disallow.exe" /u "http://reactos.org/disallow" /c
2016-05-22 20:39:41 +00:00
static void check_matching_apphelp ( PDB pdb , TAGID apphelp , int num )
{
2016-10-30 19:39:43 +00:00
if ( num = = 0 )
2016-05-22 20:39:41 +00:00
{
/*
[ Window Title ]
Program Compatibility Assistant
[ Main Instruction ]
This program has known compatibility issues
[ Expanded Information ]
Allow it !
[ ^ ] Hide details [ ] Don ' t show this message again [ Check for solutions online ] [ Run program ] [ Cancel ]
*/
match_dw_attr ( pdb , apphelp , TAG_FLAGS , 1 ) ;
match_dw_attr ( pdb , apphelp , TAG_PROBLEMSEVERITY , 1 ) ;
2016-05-28 21:46:24 +00:00
match_dw_attr ( pdb , apphelp , TAG_HTMLHELPID , 1 ) ;
match_dw_attr ( pdb , apphelp , TAG_APP_NAME_RC_ID , 0x6f0072 ) ;
match_dw_attr ( pdb , apphelp , TAG_VENDOR_NAME_RC_ID , 0x720067 ) ;
2016-05-22 20:39:41 +00:00
match_dw_attr ( pdb , apphelp , TAG_SUMMARY_MSG_RC_ID , 0 ) ;
}
else
{
/*
[ Window Title ]
Program Compatibility Assistant
[ Main Instruction ]
This program is blocked due to compatibility issues
[ Expanded Information ]
Not allowed !
[ ^ ] Hide details [ Check for solutions online ] [ Cancel ]
*/
match_dw_attr ( pdb , apphelp , TAG_FLAGS , 1 ) ;
match_dw_attr ( pdb , apphelp , TAG_PROBLEMSEVERITY , 2 ) ;
2016-05-28 21:46:24 +00:00
match_dw_attr ( pdb , apphelp , TAG_HTMLHELPID , 2 ) ;
match_dw_attr ( pdb , apphelp , TAG_APP_NAME_RC_ID , 0x320020 ) ;
match_dw_attr ( pdb , apphelp , TAG_VENDOR_NAME_RC_ID , 0x38002e ) ;
2016-05-22 20:39:41 +00:00
match_dw_attr ( pdb , apphelp , TAG_SUMMARY_MSG_RC_ID , 0 ) ;
}
apphelp = pSdbFindNextTag ( pdb , apphelp , apphelp ) ;
ok ( apphelp = = TAGID_NULL , " Did not expect a secondary match on %d \n " , num ) ;
}
static void check_matching_layer ( PDB pdb , TAGID layer , int num )
{
2016-10-30 19:39:43 +00:00
if ( num = = 2 )
2016-05-22 20:39:41 +00:00
{
match_dw_attr ( pdb , layer , TAG_LAYER_TAGID , 0x18e ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , layer , TAG_NAME , L " TestNewMode " ) ;
2016-05-22 20:39:41 +00:00
}
else
{
TAGID layer_tagid = pSdbFindFirstTag ( pdb , layer , TAG_LAYER_TAGID ) ;
ok ( layer_tagid = = TAGID_NULL , " expected not to find a layer tagid, got %x \n " , layer_tagid ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , layer , TAG_NAME , L " WinSrv03 " ) ;
2016-05-22 20:39:41 +00:00
}
}
static struct
{
2017-06-26 10:26:57 +00:00
const WCHAR * name ;
const WCHAR * app_name ;
const WCHAR * vendor ;
2016-05-22 20:39:41 +00:00
GUID exe_id ;
2017-06-26 10:26:57 +00:00
const WCHAR * extra_file ;
2016-05-22 20:39:41 +00:00
DWORD dwLayerCount ;
TAGREF atrExes_0 ;
2016-09-03 16:20:52 +00:00
DWORD adwExeFlags_0 ;
2016-05-22 20:39:41 +00:00
TAGREF atrLayers_0 ;
2016-09-03 16:20:52 +00:00
TAGREF trApphelp ;
const char * env_var ;
} test_exedata [ 5 ] = {
2016-05-22 20:39:41 +00:00
{
2017-06-26 10:26:57 +00:00
L " test_allow.exe " ,
L " apphelp_name_allow " ,
L " apphelp_vendor_allow " ,
2016-10-30 19:39:43 +00:00
{ 0x4e50c93f , 0xb863 , 0x4dfa , { 0xba , 0xe2 , 0xd8 , 0x0e , 0xf4 , 0xce , 0x5c , 0x89 } } ,
2016-05-22 20:39:41 +00:00
NULL ,
0 ,
0x1c6 ,
2016-09-03 16:20:52 +00:00
0x1000 ,
2016-05-22 20:39:41 +00:00
0 ,
2016-09-03 16:20:52 +00:00
0x1c6 ,
NULL ,
2016-05-22 20:39:41 +00:00
} ,
{
2017-06-26 10:26:57 +00:00
L " test_disallow.exe " ,
L " apphelp_name_disallow " ,
L " apphelp_vendor_disallow " ,
2016-10-30 19:39:43 +00:00
{ 0x156720e1 , 0xef98 , 0x4d04 , { 0x96 , 0x5a , 0xd8 , 0x5d , 0xe0 , 0x5e , 0x6d , 0x9f } } ,
2016-05-22 20:39:41 +00:00
NULL ,
0 ,
0x256 ,
2016-09-03 16:20:52 +00:00
0x3000 ,
2016-05-22 20:39:41 +00:00
0 ,
2016-09-03 16:20:52 +00:00
0x256 ,
NULL ,
2016-05-22 20:39:41 +00:00
} ,
{
2017-06-26 10:26:57 +00:00
L " test_new.exe " ,
L " fixnew_name " ,
L " fixnew_vendor " ,
2016-10-30 19:39:43 +00:00
{ 0xce70ef69 , 0xa21d , 0x408b , { 0x84 , 0x5b , 0xf9 , 0x9e , 0xac , 0x06 , 0x09 , 0xe7 } } ,
2017-06-26 10:26:57 +00:00
L " test_checkfile.txt " ,
2016-05-22 20:39:41 +00:00
1 ,
0x2ec ,
2016-09-03 16:20:52 +00:00
0 ,
2016-05-22 20:39:41 +00:00
0x18e ,
2016-09-03 16:20:52 +00:00
0 ,
NULL ,
2016-05-22 20:39:41 +00:00
} ,
{
2017-06-26 10:26:57 +00:00
L " test_w2k3.exe " ,
L " fix_name " ,
L " fix_vendor " ,
2016-10-30 19:39:43 +00:00
{ 0xb4ead144 , 0xf640 , 0x4e4b , { 0x94 , 0xc4 , 0x0c , 0x7f , 0xa8 , 0x66 , 0x23 , 0xb0 } } ,
2016-05-22 20:39:41 +00:00
NULL ,
0 ,
0x37c ,
0 ,
2016-09-03 16:20:52 +00:00
0 ,
0 ,
NULL ,
} ,
{
2017-06-26 10:26:57 +00:00
L " test_unknown_file.exe " ,
L " apphelp_name_allow " ,
L " apphelp_vendor_allow " ,
2016-10-30 19:39:43 +00:00
{ 0x00000000 , 0x0000 , 0x0000 , { 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 } } ,
2016-09-03 16:20:52 +00:00
NULL ,
1 ,
0 ,
0 ,
0x18e ,
0 ,
" TestNewMode " ,
2016-05-22 20:39:41 +00:00
} ,
} ;
static void check_db_exes ( PDB pdb , TAGID root )
{
int num = 0 ;
TAGID exe = pSdbFindFirstTag ( pdb , root , TAG_EXE ) ;
2016-10-30 19:39:43 +00:00
TAGID altExe = pSdbFindFirstNamedTag ( pdb , root , TAG_EXE , TAG_NAME , L " test_allow.exe " ) ;
ok_hex ( altExe , ( int ) exe ) ;
2016-05-22 20:39:41 +00:00
while ( exe ! = TAGID_NULL )
{
TAGID apphelp , layer ;
ok ( num < 4 , " Too many matches, expected only 4! \n " ) ;
2016-10-30 19:39:43 +00:00
if ( num > = 4 )
2016-05-22 20:39:41 +00:00
break ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , exe , TAG_NAME , test_exedata [ num ] . name ) ;
match_strw_attr ( pdb , exe , TAG_APP_NAME , test_exedata [ num ] . app_name ) ;
match_strw_attr ( pdb , exe , TAG_VENDOR , test_exedata [ num ] . vendor ) ;
2016-05-22 20:39:41 +00:00
match_guid_attr ( pdb , exe , TAG_EXE_ID , & test_exedata [ num ] . exe_id ) ;
check_matching_file ( pdb , exe , pSdbFindFirstTag ( pdb , exe , TAG_MATCHING_FILE ) , num ) ;
apphelp = pSdbFindFirstTag ( pdb , exe , TAG_APPHELP ) ;
2016-10-30 19:39:43 +00:00
if ( num = = 0 | | num = = 1 )
2016-05-22 20:39:41 +00:00
{
ok ( apphelp ! = TAGID_NULL , " Expected to find a valid apphelp match on %d. \n " , num ) ;
2016-10-30 19:39:43 +00:00
if ( apphelp )
2016-05-22 20:39:41 +00:00
check_matching_apphelp ( pdb , apphelp , num ) ;
}
else
{
ok ( apphelp = = TAGID_NULL , " Did not expect an apphelp match on %d \n " , num ) ;
}
layer = pSdbFindFirstTag ( pdb , exe , TAG_LAYER ) ;
2016-10-30 19:39:43 +00:00
if ( num = = 2 | | num = = 3 )
2016-05-22 20:39:41 +00:00
{
ok ( layer ! = TAGID_NULL , " Expected to find a valid layer match on %d. \n " , num ) ;
2016-10-30 19:39:43 +00:00
if ( layer )
2016-05-22 20:39:41 +00:00
check_matching_layer ( pdb , layer , num ) ;
}
else
{
ok ( layer = = TAGID_NULL , " Did not expect a layer match on %d \n " , num ) ;
}
+ + num ;
exe = pSdbFindNextTag ( pdb , root , exe ) ;
}
ok ( num = = 4 , " Expected to find 4 exe tags, found: %d \n " , num ) ;
}
static struct
{
DWORD htmlhelpid ;
2017-06-26 10:26:57 +00:00
const WCHAR * link ;
const WCHAR * apphelp_title ;
const WCHAR * apphelp_details ;
2016-05-22 20:39:41 +00:00
} test_layerdata [ 2 ] = {
{
2016-05-28 21:46:24 +00:00
2 ,
2017-06-26 10:26:57 +00:00
L " http://reactos.org/disallow " ,
L " apphelp_name_disallow " ,
L " Not allowed! " ,
2016-05-22 20:39:41 +00:00
} ,
2016-05-28 21:46:24 +00:00
{
1 ,
2017-06-26 10:26:57 +00:00
L " http://reactos.org/allow " ,
L " apphelp_name_allow " ,
L " Allow it! " ,
2016-05-28 21:46:24 +00:00
} ,
2016-05-22 20:39:41 +00:00
} ;
static void check_db_apphelp ( PDB pdb , TAGID root )
{
int num = 0 ;
TAGID apphelp = pSdbFindFirstTag ( pdb , root , TAG_APPHELP ) ;
while ( apphelp ! = TAGID_NULL )
{
TAGID link ;
ok ( num < 2 , " Too many matches, expected only 4! \n " ) ;
2016-10-30 19:39:43 +00:00
if ( num > = 2 )
2016-05-22 20:39:41 +00:00
break ;
match_dw_attr ( pdb , apphelp , TAG_HTMLHELPID , test_layerdata [ num ] . htmlhelpid ) ;
link = pSdbFindFirstTag ( pdb , apphelp , TAG_LINK ) ;
ok ( link ! = TAGID_NULL , " expected to find a link tag \n " ) ;
if ( link ! = TAGID_NULL )
{
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , link , TAG_LINK_URL , test_layerdata [ num ] . link ) ;
2016-05-22 20:39:41 +00:00
}
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , apphelp , TAG_APPHELP_TITLE , test_layerdata [ num ] . apphelp_title ) ;
match_strw_attr ( pdb , apphelp , TAG_APPHELP_DETAILS , test_layerdata [ num ] . apphelp_details ) ;
2016-05-22 20:39:41 +00:00
apphelp = pSdbFindNextTag ( pdb , root , apphelp ) ;
num + + ;
}
ok ( num = = 2 , " Expected to find 2 layer tags, found: %d \n " , num ) ;
}
static void test_CheckDatabaseManually ( void )
{
static const WCHAR path [ ] = { ' t ' , ' e ' , ' s ' , ' t ' , ' _ ' , ' d ' , ' b ' , ' . ' , ' s ' , ' d ' , ' b ' , 0 } ;
TAGID root ;
PDB pdb ;
BOOL ret ;
DWORD ver_hi , ver_lo ;
2017-06-26 10:26:57 +00:00
test_create_db ( L " test_db.sdb " , g_WinVersion > = WINVER_WIN10 ) ;
2016-05-22 20:39:41 +00:00
/* both ver_hi and ver_lo cannot be null, it'll crash. */
ver_hi = ver_lo = 0x12345678 ;
ret = pSdbGetDatabaseVersion ( path , & ver_hi , & ver_lo ) ;
2016-10-30 19:39:43 +00:00
ok ( ret , " Expected SdbGetDatabaseVersion to succeed \n " ) ;
if ( g_WinVersion > = WINVER_WIN10 )
{
ok ( ver_hi = = 3 , " Expected ver_hi to be 3, was: %d \n " , ver_hi ) ;
ok ( ver_lo = = 0 , " Expected ver_lo to be 0, was: %d \n " , ver_lo ) ;
}
else
{
ok ( ver_hi = = 2 , " Expected ver_hi to be 2, was: %d \n " , ver_hi ) ;
ok ( ver_lo = = 1 , " Expected ver_lo to be 1, was: %d \n " , ver_lo ) ;
}
2016-05-22 20:39:41 +00:00
ver_hi = ver_lo = 0x12345678 ;
ret = pSdbGetDatabaseVersion ( NULL , & ver_hi , & ver_lo ) ;
2016-10-30 19:39:43 +00:00
if ( g_WinVersion > = WINVER_WIN10 )
{
ok ( ! ret , " Expected SdbGetDatabaseVersion to fail \n " ) ;
ok ( ver_hi = = 0 , " Expected ver_hi to be 0, was: 0x%x \n " , ver_hi ) ;
ok ( ver_lo = = 0 , " Expected ver_lo to be 0, was: 0x%x \n " , ver_lo ) ;
}
else
{
ok ( ret , " Expected SdbGetDatabaseVersion to succeed \n " ) ;
ok ( ver_hi = = 0x12345678 , " Expected ver_hi to be 0x12345678, was: 0x%x \n " , ver_hi ) ;
ok ( ver_lo = = 0x12345678 , " Expected ver_lo to be 0x12345678, was: 0x%x \n " , ver_lo ) ;
}
2016-05-22 20:39:41 +00:00
ver_hi = ver_lo = 0x12345678 ;
ret = pSdbGetDatabaseVersion ( path + 1 , & ver_hi , & ver_lo ) ;
2016-10-30 19:39:43 +00:00
if ( g_WinVersion > = WINVER_WIN10 )
{
ok ( ! ret , " Expected SdbGetDatabaseVersion to fail \n " ) ;
ok ( ver_hi = = 0 , " Expected ver_hi to be 0, was: 0x%x \n " , ver_hi ) ;
ok ( ver_lo = = 0 , " Expected ver_lo to be 0, was: 0x%x \n " , ver_lo ) ;
}
else
{
ok ( ret , " Expected SdbGetDatabaseVersion to succeed \n " ) ;
ok ( ver_hi = = 0x12345678 , " Expected ver_hi to be 0x12345678, was: 0x%x \n " , ver_hi ) ;
ok ( ver_lo = = 0x12345678 , " Expected ver_lo to be 0x12345678, was: 0x%x \n " , ver_lo ) ;
}
2016-05-22 20:39:41 +00:00
pdb = pSdbOpenDatabase ( path , DOS_PATH ) ;
ok ( pdb ! = NULL , " unexpected NULL handle \n " ) ;
root = pSdbFindFirstTag ( pdb , TAGID_ROOT , TAG_DATABASE ) ;
ok ( root ! = TAGID_NULL , " expected to find a root tag \n " ) ;
if ( root ! = TAGID_NULL )
{
2016-10-30 19:39:43 +00:00
TAGID tagLayer = pSdbFindFirstTag ( pdb , root , TAG_LAYER ) ;
TAGID tagAlt = pSdbFindFirstNamedTag ( pdb , root , TAG_LAYER , TAG_NAME , L " TestNewMode " ) ;
TAGID tagAlt2 = pSdbFindFirstNamedTag ( pdb , root , TAG_LAYER , TAG_NAME , L " TESTNEWMODE " ) ;
TAGID tagAlt3 = pSdbFindFirstNamedTag ( pdb , root , TAG_LAYER , TAG_NAME , L " testnewmode " ) ;
ok_hex ( tagLayer , ( int ) tagAlt ) ;
ok_hex ( tagLayer , ( int ) tagAlt2 ) ;
ok_hex ( tagLayer , ( int ) tagAlt3 ) ;
2016-05-22 20:39:41 +00:00
check_db_properties ( pdb , root ) ;
2016-10-30 19:39:43 +00:00
check_db_layer ( pdb , tagLayer ) ;
2016-05-22 20:39:41 +00:00
check_db_exes ( pdb , root ) ;
check_db_apphelp ( pdb , root ) ;
}
pSdbCloseDatabase ( pdb ) ;
DeleteFileA ( " test_db.sdb " ) ;
2016-05-22 20:27:02 +00:00
}
2016-09-03 16:20:52 +00:00
static void test_is_testdb ( PDB pdb )
{
2016-10-30 19:39:43 +00:00
if ( pdb )
2016-09-03 16:20:52 +00:00
{
GUID guid ;
memset ( & guid , 0 , sizeof ( guid ) ) ;
2016-10-30 19:39:43 +00:00
ok ( pSdbGetDatabaseID ( pdb , & guid ) , " expected SdbGetDatabaseID not to fail. \n " ) ;
ok ( IsEqualGUID ( guid , GUID_DATABASE_TEST ) , " Expected SdbGetDatabaseID to return the test db GUID, was: %s \n " , wine_dbgstr_guid ( & guid ) ) ;
2016-09-03 16:20:52 +00:00
}
else
{
skip ( " Not checking DB GUID, received a null pdb \n " ) ;
}
}
2017-06-26 10:26:57 +00:00
static BOOL IsUserAdmin ( )
{
BOOL Result ;
SID_IDENTIFIER_AUTHORITY NtAuthority = { SECURITY_NT_AUTHORITY } ;
PSID AdministratorsGroup ;
Result = AllocateAndInitializeSid ( & NtAuthority , 2 ,
SECURITY_BUILTIN_DOMAIN_RID ,
DOMAIN_ALIAS_RID_ADMINS ,
0 , 0 , 0 , 0 , 0 , 0 ,
& AdministratorsGroup ) ;
if ( Result )
{
if ( ! CheckTokenMembership ( NULL , AdministratorsGroup , & Result ) )
Result = FALSE ;
FreeSid ( AdministratorsGroup ) ;
}
return Result ;
}
2016-10-30 19:39:43 +00:00
template < typename SDBQUERYRESULT_T >
static void check_adwExeFlags ( DWORD adwExeFlags_0 , SDBQUERYRESULT_T & query , const char * file , int line , int cur )
{
ok_ ( file , line ) ( query . adwExeFlags [ 0 ] = = adwExeFlags_0 , " Expected adwExeFlags[0] to be 0x%x, was: 0x%x for %d \n " , adwExeFlags_0 , query . adwExeFlags [ 0 ] , cur ) ;
for ( size_t n = 1 ; n < _countof ( query . atrExes ) ; + + n )
ok_ ( file , line ) ( query . adwExeFlags [ n ] = = 0 , " Expected adwExeFlags[%d] to be 0, was: %x for %d \n " , n , query . adwExeFlags [ 0 ] , cur ) ;
}
template < >
void check_adwExeFlags ( DWORD , SDBQUERYRESULT_2k3 & , const char * , int , int )
{
}
2016-09-03 16:20:52 +00:00
2016-10-30 19:39:43 +00:00
template < typename SDBQUERYRESULT_T >
2017-06-26 10:26:57 +00:00
static void test_mode_generic ( const WCHAR * workdir , HSDB hsdb , int cur )
2016-09-03 16:20:52 +00:00
{
2017-06-26 10:26:57 +00:00
WCHAR exename [ MAX_PATH ] , testfile [ MAX_PATH ] ;
2016-09-03 16:20:52 +00:00
BOOL ret ;
2016-10-30 19:39:43 +00:00
SDBQUERYRESULT_T query ;
2016-09-03 16:20:52 +00:00
PDB pdb ;
TAGID tagid ;
TAGREF trApphelp ;
DWORD expect_flags = 0 , adwExeFlags_0 , exe_count ;
2017-03-04 20:27:39 +00:00
UNICODE_STRING exenameNT ;
2016-09-03 16:20:52 +00:00
memset ( & query , 0xab , sizeof ( query ) ) ;
2017-06-26 10:26:57 +00:00
swprintf ( exename , L " %s \\ %s " , workdir , test_exedata [ cur ] . name ) ;
2016-09-03 16:20:52 +00:00
if ( test_exedata [ cur ] . extra_file )
2017-06-26 10:26:57 +00:00
swprintf ( testfile , L " %s \\ %s " , workdir , test_exedata [ cur ] . extra_file ) ;
2016-09-03 16:20:52 +00:00
test_create_exe ( exename , 0 ) ;
if ( test_exedata [ cur ] . extra_file )
{
/* First we try without the file at all. */
2017-06-26 10:26:57 +00:00
DeleteFileW ( testfile ) ;
ret = pSdbGetMatchingExe ( hsdb , exename , NULL , NULL , 0 , ( SDBQUERYRESULT_VISTA * ) & query ) ;
2016-09-03 16:20:52 +00:00
ok ( ret = = 0 , " SdbGetMatchingExe should have failed for %d. \n " , cur ) ;
/* Now re-try with the correct file */
test_create_file ( testfile , " aaaa " , 4 ) ;
}
#if 0
// Results seem to be cached based on filename, until we can invalidate this, do not test the same filename twice!
2017-06-26 10:26:57 +00:00
DeleteFileW ( exename ) ;
2016-09-03 16:20:52 +00:00
// skip exports
test_create_exe ( exename , 1 ) ;
ret = pSdbGetMatchingExe ( hsdb , exenameW , NULL , NULL , 0 , & query ) ;
ok ( ret = = 0 , " SdbGetMatchingExe should have failed for %d. \n " , cur ) ;
2017-06-26 10:26:57 +00:00
DeleteFileW ( exename ) ;
2016-09-03 16:20:52 +00:00
test_create_exe ( exename , 0 ) ;
# endif
if ( test_exedata [ cur ] . env_var )
{
SetEnvironmentVariableA ( " __COMPAT_LAYER " , test_exedata [ cur ] . env_var ) ;
}
2017-06-26 10:26:57 +00:00
ret = pSdbGetMatchingExe ( hsdb , exename , NULL , NULL , 0 , ( SDBQUERYRESULT_VISTA * ) & query ) ;
2016-09-03 16:20:52 +00:00
ok ( ret , " SdbGetMatchingExe should not fail for %d. \n " , cur ) ;
exe_count = ( test_exedata [ cur ] . env_var = = NULL ) ? 1 : 0 ;
ok ( query . dwExeCount = = exe_count , " Expected dwExeCount to be %d, was %d for %d \n " , exe_count , query . dwExeCount , cur ) ;
ok ( query . dwLayerCount = = test_exedata [ cur ] . dwLayerCount , " Expected dwLayerCount to be %d, was %d for %d \n " , test_exedata [ cur ] . dwLayerCount , query . dwLayerCount , cur ) ;
ok ( query . dwCustomSDBMap = = 1 , " Expected dwCustomSDBMap to be 1, was %d for %d \n " , query . dwCustomSDBMap , cur ) ;
ok ( query . dwLayerFlags = = 0 , " Expected dwLayerFlags to be 0, was 0x%x for %d \n " , query . dwLayerFlags , cur ) ;
trApphelp = ( g_WinVersion < WINVER_WIN10 ) ? 0 : test_exedata [ cur ] . trApphelp ;
ok ( query . trApphelp = = trApphelp , " Expected trApphelp to be 0x%x, was 0x%x for %d \n " , trApphelp , query . trApphelp , cur ) ;
if ( g_WinVersion < WINVER_WIN7 )
expect_flags = 0 ;
else if ( g_WinVersion < WINVER_WIN8 )
expect_flags = 1 ;
else if ( g_WinVersion < WINVER_WIN10 )
expect_flags = 0x101 ;
else
2017-06-26 10:26:57 +00:00
{
2016-10-30 19:39:43 +00:00
expect_flags = 0x121 ; /* for 2 and 3, this becomes 101 when not elevated. */
2017-06-26 10:26:57 +00:00
if ( ( cur = = 2 | | cur = = 3 ) & & ! IsUserAdmin ( ) )
expect_flags & = ~ 0x20 ;
}
2016-09-03 16:20:52 +00:00
if ( test_exedata [ cur ] . env_var )
expect_flags & = ~ 0x100 ;
ok ( query . dwFlags = = expect_flags , " Expected dwFlags to be 0x%x, was 0x%x for %d \n " , expect_flags , query . dwFlags , cur ) ;
ok ( query . atrExes [ 0 ] = = test_exedata [ cur ] . atrExes_0 , " Expected atrExes[0] to be 0x%x, was: 0x%x for %d \n " , test_exedata [ cur ] . atrExes_0 , query . atrExes [ 0 ] , cur ) ;
2016-10-30 19:39:43 +00:00
for ( size_t n = 1 ; n < _countof ( query . atrExes ) ; + + n )
2016-09-03 16:20:52 +00:00
ok ( query . atrExes [ n ] = = 0 , " Expected atrExes[%d] to be 0, was: %x for %d \n " , n , query . atrExes [ n ] , cur ) ;
adwExeFlags_0 = ( g_WinVersion < WINVER_WIN10 ) ? 0 : test_exedata [ cur ] . adwExeFlags_0 ;
2016-10-30 19:39:43 +00:00
check_adwExeFlags ( adwExeFlags_0 , query , __FILE__ , __LINE__ , cur ) ;
2016-09-03 16:20:52 +00:00
ok ( query . atrLayers [ 0 ] = = test_exedata [ cur ] . atrLayers_0 , " Expected atrLayers[0] to be 0x%x, was: %x for %d \n " , test_exedata [ cur ] . atrLayers_0 , query . atrLayers [ 0 ] , cur ) ;
2016-10-30 19:39:43 +00:00
for ( size_t n = 1 ; n < _countof ( query . atrLayers ) ; + + n )
2016-09-03 16:20:52 +00:00
ok ( query . atrLayers [ n ] = = 0 , " Expected atrLayers[%d] to be 0, was: %x for %d \n " , n , query . atrLayers [ 0 ] , cur ) ;
2016-10-30 19:39:43 +00:00
if ( g_WinVersion > = WINVER_VISTA )
ok ( IsEqualGUID ( query . rgGuidDB [ 0 ] , GUID_DATABASE_TEST ) , " Expected rgGuidDB[0] to be the test db GUID, was: %s for %d \n " , wine_dbgstr_guid ( & query . rgGuidDB [ 0 ] ) , cur ) ;
else
ok ( IsEqualGUID ( query . rgGuidDB [ 0 ] , GUID_MAIN_DATABASE ) , " Expected rgGuidDB[0] to be the main db GUID, was: %s for %d \n " , wine_dbgstr_guid ( & query . rgGuidDB [ 0 ] ) , cur ) ;
for ( size_t n = 1 ; n < _countof ( query . rgGuidDB ) ; + + n )
ok ( IsEqualGUID ( query . rgGuidDB [ n ] , GUID_NULL ) , " Expected rgGuidDB[%d] to be GUID_NULL, was: %s for %d \n " , n , wine_dbgstr_guid ( & query . rgGuidDB [ n ] ) , cur ) ;
2016-09-03 16:20:52 +00:00
if ( query . atrExes [ 0 ] )
{
pdb = ( PDB ) 0x12345678 ;
tagid = 0x76543210 ;
ret = pSdbTagRefToTagID ( hsdb , query . atrExes [ 0 ] , & pdb , & tagid ) ;
ok ( ret , " SdbTagRefToTagID failed for %d. \n " , cur ) ;
ok ( pdb ! = NULL & & pdb ! = ( PDB ) 0x12345678 , " SdbTagRefToTagID failed to return a pdb for %d. \n " , cur ) ;
ok ( tagid ! = 0 & & tagid ! = 0x76543210 , " SdbTagRefToTagID failed to return a tagid for %d. \n " , cur ) ;
if ( pdb & & pdb ! = ( PDB ) 0x12345678 )
{
2016-10-30 19:39:43 +00:00
TAGREF tr = 0x12345678 ;
2016-09-03 16:20:52 +00:00
TAG tag = pSdbGetTagFromTagID ( pdb , tagid ) ;
test_is_testdb ( pdb ) ;
ok ( tag = = TAG_EXE , " Expected tag to be TAG_EXE, was 0x%x for %d. \n " , tag , cur ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , tagid , TAG_NAME , test_exedata [ cur ] . name ) ;
2016-10-30 19:39:43 +00:00
/* And back again */
ret = pSdbTagIDToTagRef ( hsdb , pdb , tagid , & tr ) ;
ok ( ret , " SdbTagIDToTagRef failed for %d. \n " , cur ) ;
ok ( tr = = query . atrExes [ 0 ] , " Expected tr to be 0x%x, was 0x%x for %d. \n " , query . atrExes [ 0 ] , tr , cur ) ;
2016-09-03 16:20:52 +00:00
}
else
{
skip ( " Skipping a bunch of tests because of an invalid pointer \n " ) ;
}
}
if ( test_exedata [ cur ] . atrLayers_0 )
{
pdb = ( PDB ) 0x12345678 ;
tagid = 0x76543210 ;
ret = pSdbTagRefToTagID ( hsdb , query . atrLayers [ 0 ] , & pdb , & tagid ) ;
ok ( ret , " SdbTagRefToTagID failed for %d. \n " , cur ) ;
ok ( pdb ! = NULL & & pdb ! = ( PDB ) 0x12345678 , " SdbTagRefToTagID failed to return a pdb for %d. \n " , cur ) ;
ok ( tagid ! = 0 & & tagid ! = 0x76543210 , " SdbTagRefToTagID failed to return a tagid for %d. \n " , cur ) ;
if ( pdb & & pdb ! = ( PDB ) 0x12345678 )
{
2016-10-30 19:39:43 +00:00
TAGREF tr = 0x12345678 ;
2016-09-03 16:20:52 +00:00
TAG tag = pSdbGetTagFromTagID ( pdb , tagid ) ;
test_is_testdb ( pdb ) ;
ok ( tag = = TAG_LAYER , " Expected tag to be TAG_LAYER, was 0x%x for %d. \n " , tag , cur ) ;
2017-06-26 10:26:57 +00:00
match_strw_attr ( pdb , tagid , TAG_NAME , L " TestNewMode " ) ;
2016-10-30 19:39:43 +00:00
/* And back again */
ret = pSdbTagIDToTagRef ( hsdb , pdb , tagid , & tr ) ;
ok ( ret , " SdbTagIDToTagRef failed for %d. \n " , cur ) ;
ok ( tr = = test_exedata [ cur ] . atrLayers_0 , " Expected tr to be 0x%x, was 0x%x for %d. \n " , test_exedata [ cur ] . atrLayers_0 , tr , cur ) ;
2016-09-03 16:20:52 +00:00
}
else
{
skip ( " Skipping a bunch of tests because of an invalid pointer \n " ) ;
}
}
pdb = ( PDB ) 0x12345678 ;
tagid = 0x76543210 ;
ret = pSdbTagRefToTagID ( hsdb , 0 , & pdb , & tagid ) ;
ok ( pdb ! = NULL & & pdb ! = ( PDB ) 0x12345678 , " Expected pdb to be set to a valid pdb, was: %p \n " , pdb ) ;
ok ( tagid = = 0 , " Expected tagid to be set to 0, was: 0x%x \n " , tagid ) ;
2017-03-04 20:27:39 +00:00
2017-06-26 10:26:57 +00:00
if ( RtlDosPathNameToNtPathName_U ( exename , & exenameNT , NULL , NULL ) )
2017-03-04 20:27:39 +00:00
{
2017-07-14 20:35:11 +00:00
/*
ERROR , AslPathGetLongFileNameLongpath , 110 , Long path conversion failed 123 [ c0000001 ]
ERROR , AslPathBuildSignatureLongpath , 1086 , AslPathGetLongFileNameLongpath failed for \ ? ? \ C : \ Users \ MARK ~ 1. DEV \ AppData \ Local \ Temp \ apphelp_test \ test_allow . exe [ c0000001 ]
*/
2017-06-10 20:31:58 +00:00
ret = pSdbGetMatchingExe ( hsdb , exenameNT . Buffer , NULL , NULL , 0 , ( SDBQUERYRESULT_VISTA * ) & query ) ;
2017-07-14 20:35:11 +00:00
ok ( ! ret , " SdbGetMatchingExe should not succeed for %d. \n " , cur ) ;
2017-03-04 20:27:39 +00:00
RtlFreeUnicodeString ( & exenameNT ) ;
}
2016-09-03 16:20:52 +00:00
if ( test_exedata [ cur ] . extra_file )
2017-06-26 10:26:57 +00:00
DeleteFileW ( testfile ) ;
DeleteFileW ( exename ) ;
2016-09-03 16:20:52 +00:00
if ( test_exedata [ cur ] . env_var )
{
SetEnvironmentVariableA ( " __COMPAT_LAYER " , NULL ) ;
}
}
2016-10-30 19:39:43 +00:00
template < typename SDBQUERYRESULT_T >
2016-09-03 16:20:52 +00:00
static void test_MatchApplications ( void )
{
2017-06-26 10:26:57 +00:00
WCHAR workdir [ MAX_PATH ] , dbpath [ MAX_PATH ] ;
2016-09-03 16:20:52 +00:00
BOOL ret ;
HSDB hsdb ;
2017-06-26 10:26:57 +00:00
ret = GetTempPathW ( _countof ( workdir ) , workdir ) ;
ok ( ret , " GetTempPathW error: %d \n " , GetLastError ( ) ) ;
wcscat ( workdir , L " apphelp_test " ) ;
2016-09-03 16:20:52 +00:00
2017-06-26 10:26:57 +00:00
ret = CreateDirectoryW ( workdir , NULL ) ;
ok ( ret , " CreateDirectoryW error: %d \n " , GetLastError ( ) ) ;
2016-09-03 16:20:52 +00:00
/* SdbInitDatabase needs an nt-path */
2017-06-26 10:26:57 +00:00
swprintf ( dbpath , L " \\ ?? \\ %s \\ test.sdb " , workdir ) ;
2016-09-03 16:20:52 +00:00
2016-10-30 19:39:43 +00:00
test_create_db ( dbpath + 4 , g_WinVersion > = WINVER_WIN10 ) ;
2016-09-03 16:20:52 +00:00
2017-06-26 10:26:57 +00:00
hsdb = pSdbInitDatabase ( HID_DATABASE_FULLPATH , dbpath ) ;
2016-09-03 16:20:52 +00:00
ok ( hsdb ! = NULL , " Expected a valid database handle \n " ) ;
if ( ! hsdb )
{
skip ( " SdbInitDatabase not implemented? \n " ) ;
}
else
{
/* now that our enviroment is setup, let's go ahead and run the actual tests.. */
2016-10-30 19:39:43 +00:00
size_t n ;
2016-09-03 16:20:52 +00:00
for ( n = 0 ; n < _countof ( test_exedata ) ; + + n )
2016-10-30 19:39:43 +00:00
test_mode_generic < SDBQUERYRESULT_T > ( workdir , hsdb , n ) ;
2016-09-03 16:20:52 +00:00
pSdbReleaseDatabase ( hsdb ) ;
}
2017-06-26 10:26:57 +00:00
DeleteFileW ( dbpath + 4 ) ;
2016-09-03 16:20:52 +00:00
2017-06-26 10:26:57 +00:00
ret = RemoveDirectoryW ( workdir ) ;
ok ( ret , " RemoveDirectoryW error: %d \n " , GetLastError ( ) ) ;
2016-09-03 16:20:52 +00:00
}
2017-06-26 14:58:08 +00:00
static BOOL write_raw_file ( const WCHAR * FileName , const void * Data , DWORD Size )
{
BOOL Success ;
DWORD dwWritten ;
HANDLE Handle = CreateFileW ( FileName , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL ) ;
if ( Handle = = INVALID_HANDLE_VALUE )
{
skip ( " Failed to create temp file %ls, error %u \n " , FileName , GetLastError ( ) ) ;
return FALSE ;
}
Success = WriteFile ( Handle , Data , Size , & dwWritten , NULL ) ;
ok ( Success = = TRUE , " WriteFile failed with %u \n " , GetLastError ( ) ) ;
ok ( dwWritten = = Size , " WriteFile wrote %u bytes instead of %u \n " , dwWritten , Size ) ;
CloseHandle ( Handle ) ;
return Success & & ( dwWritten = = Size ) ;
}
static bool extract_resource ( const WCHAR * Filename , LPCWSTR ResourceName )
{
HMODULE hMod = GetModuleHandleW ( NULL ) ;
HRSRC hRsrc = FindResourceW ( hMod , ResourceName , MAKEINTRESOURCEW ( RT_RCDATA ) ) ;
ok ( ! ! hRsrc , " Unable to find %s \n " , wine_dbgstr_w ( ResourceName ) ) ;
if ( ! hRsrc )
return false ;
HGLOBAL hGlobal = LoadResource ( hMod , hRsrc ) ;
DWORD Size = SizeofResource ( hMod , hRsrc ) ;
LPVOID pData = LockResource ( hGlobal ) ;
ok ( Size & & ! ! pData , " Unable to load %s \n " , wine_dbgstr_w ( ResourceName ) ) ;
if ( ! Size | | ! pData )
return false ;
BOOL Written = write_raw_file ( Filename , pData , Size ) ;
UnlockResource ( pData ) ;
return Written ;
}
template < typename SDBQUERYRESULT_T >
2017-07-14 20:35:11 +00:00
static void test_match_ex ( const WCHAR * workdir , HSDB hsdb )
2017-06-26 14:58:08 +00:00
{
WCHAR exename [ MAX_PATH ] ;
2017-07-14 20:35:11 +00:00
PWCHAR Vendor , AppName , TestName ;
2017-06-26 14:58:08 +00:00
SDBQUERYRESULT_T query ;
2017-07-14 20:35:11 +00:00
TAGID dbtag , exetag , tagid ;
2017-06-26 14:58:08 +00:00
BOOL ret , Succeed ;
PDB pdb ;
memset ( & query , 0xab , sizeof ( query ) ) ;
ret = pSdbTagRefToTagID ( hsdb , 0 , & pdb , & tagid ) ;
ok ( pdb ! = NULL & & pdb ! = ( PDB ) 0x12345678 , " Expected pdb to be set to a valid pdb, was: %p \n " , pdb ) ;
2017-07-14 20:35:11 +00:00
dbtag = pSdbFindFirstTag ( pdb , TAGID_ROOT , TAG_DATABASE ) ;
ok ( dbtag ! = TAGID_NULL , " Expected to get a valid TAG_DATABASE \n " ) ;
2017-06-26 14:58:08 +00:00
2017-07-14 20:35:11 +00:00
for ( exetag = pSdbFindFirstTag ( pdb , dbtag , TAG_EXE ) ; exetag ; exetag = pSdbFindNextTag ( pdb , dbtag , exetag ) )
2017-06-26 14:58:08 +00:00
{
2017-07-14 20:35:11 +00:00
tagid = pSdbFindFirstTag ( pdb , exetag , TAG_VENDOR ) ;
Vendor = pSdbGetStringTagPtr ( pdb , tagid ) ;
if ( ! Vendor )
continue ;
Succeed = ! wcsicmp ( Vendor , L " Succeed " ) ;
if ( ! Succeed & & wcsicmp ( Vendor , L " Fail " ) )
continue ;
tagid = pSdbFindFirstTag ( pdb , exetag , TAG_APP_NAME ) ;
AppName = pSdbGetStringTagPtr ( pdb , tagid ) ;
if ( ! AppName )
continue ;
2017-06-26 14:58:08 +00:00
2017-07-14 20:35:11 +00:00
tagid = pSdbFindFirstTag ( pdb , exetag , TAG_NAME ) ;
TestName = pSdbGetStringTagPtr ( pdb , tagid ) ;
if ( ! TestName )
continue ;
2017-06-26 14:58:08 +00:00
2017-07-14 20:35:11 +00:00
swprintf ( exename , L " %s \\ %s " , workdir , AppName ) ;
test_create_exe ( exename , 0 ) ;
2017-06-26 14:58:08 +00:00
2017-07-14 20:35:11 +00:00
ret = pSdbGetMatchingExe ( hsdb , exename , NULL , NULL , 0 , ( SDBQUERYRESULT_VISTA * ) & query ) ;
DWORD exe_count = Succeed ? 1 : 0 ;
2017-06-26 14:58:08 +00:00
2017-07-14 20:35:11 +00:00
if ( Succeed )
ok ( ret , " SdbGetMatchingExe should not fail for %s. \n " , wine_dbgstr_w ( TestName ) ) ;
else
ok ( ! ret , " SdbGetMatchingExe should not succeed for %s. \n " , wine_dbgstr_w ( TestName ) ) ;
2017-06-26 14:58:08 +00:00
2017-07-14 20:35:11 +00:00
ok ( query . dwExeCount = = exe_count , " Expected dwExeCount to be %d, was %d for %s \n " , exe_count , query . dwExeCount , wine_dbgstr_w ( TestName ) ) ;
DeleteFileW ( exename ) ;
}
2017-06-26 14:58:08 +00:00
}
template < typename SDBQUERYRESULT_T >
static void test_MatchApplicationsEx ( void )
{
WCHAR workdir [ MAX_PATH ] , dbpath [ MAX_PATH ] ;
BOOL ret ;
HSDB hsdb ;
ret = GetTempPathW ( _countof ( workdir ) , workdir ) ;
ok ( ret , " GetTempPathW error: %d \n " , GetLastError ( ) ) ;
lstrcatW ( workdir , L " apphelp_test " ) ;
ret = CreateDirectoryW ( workdir , NULL ) ;
ok ( ret , " CreateDirectoryW error: %d \n " , GetLastError ( ) ) ;
/* SdbInitDatabase needs an nt-path */
swprintf ( dbpath , L " \\ ?? \\ %s \\ test.sdb " , workdir ) ;
if ( extract_resource ( dbpath + 4 , MAKEINTRESOURCEW ( 101 ) ) )
{
hsdb = pSdbInitDatabase ( HID_DATABASE_FULLPATH , dbpath ) ;
ok ( hsdb ! = NULL , " Expected a valid database handle \n " ) ;
if ( ! hsdb )
{
skip ( " SdbInitDatabase not implemented? \n " ) ;
}
else
{
/* now that our enviroment is setup, let's go ahead and run the actual tests.. */
2017-07-14 20:35:11 +00:00
test_match_ex < SDBQUERYRESULT_T > ( workdir , hsdb ) ;
2017-06-26 14:58:08 +00:00
pSdbReleaseDatabase ( hsdb ) ;
}
}
else
{
ok ( 0 , " Unable to extract database \n " ) ;
}
DeleteFileW ( dbpath + 4 ) ;
ret = RemoveDirectoryW ( workdir ) ;
ok ( ret , " RemoveDirectoryW error: %d \n " , GetLastError ( ) ) ;
}
2016-09-03 16:20:52 +00:00
static void test_TagRef ( void )
{
2017-06-26 10:26:57 +00:00
WCHAR tmpdir [ MAX_PATH ] , dbpath [ MAX_PATH ] ;
2016-09-03 16:20:52 +00:00
BOOL ret ;
HSDB hsdb ;
PDB pdb ;
TAGID db ;
DWORD size ;
2016-10-30 19:39:43 +00:00
TAGREF tr ;
2016-09-03 16:20:52 +00:00
2017-06-26 10:26:57 +00:00
ret = GetTempPathW ( _countof ( tmpdir ) , tmpdir ) ;
2016-09-03 16:20:52 +00:00
ok ( ret , " GetTempPathA error: %d \n " , GetLastError ( ) ) ;
/* SdbInitDatabase needs an nt-path */
2017-06-26 10:26:57 +00:00
swprintf ( dbpath , L " \\ ?? \\ %stest.sdb " , tmpdir ) ;
2016-09-03 16:20:52 +00:00
2016-10-30 19:39:43 +00:00
test_create_db ( dbpath + 4 , g_WinVersion > = WINVER_WIN10 ) ;
2016-09-03 16:20:52 +00:00
2017-06-26 10:26:57 +00:00
hsdb = pSdbInitDatabase ( HID_DATABASE_FULLPATH , dbpath ) ;
2016-09-03 16:20:52 +00:00
/* HSDB is the only arg that can't be null */
ret = pSdbTagRefToTagID ( hsdb , 0 , NULL , NULL ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
size = test_get_db_size ( ) ;
pdb = ( PDB ) & db ;
db = 12345 ;
ret = pSdbTagRefToTagID ( hsdb , size - 1 , & pdb , & db ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( pdb ! = NULL , " Expected a result, got: %p \n " , pdb ) ;
ok ( db = = ( size - 1 ) , " Expected %u, got: %u \n " , size - 1 , db ) ;
2016-10-30 19:39:43 +00:00
/* Convert it back. */
tr = 0x12345678 ;
ret = pSdbTagIDToTagRef ( hsdb , pdb , db , & tr ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( tr = = ( size - 1 ) , " Expected %u, got: %u \n " , size - 1 , tr ) ;
2016-09-03 16:20:52 +00:00
pdb = ( PDB ) & db ;
db = 12345 ;
ret = pSdbTagRefToTagID ( hsdb , size , & pdb , & db ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( pdb ! = NULL , " Expected a result, got: %p \n " , pdb ) ;
2016-10-30 19:39:43 +00:00
ok ( db = = size , " Expected %u, got: %u \n " , size , db ) ;
tr = 0x12345678 ;
ret = pSdbTagIDToTagRef ( hsdb , pdb , db , & tr ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( tr = = size , " Expected %u, got: %u \n " , size , tr ) ;
2016-09-03 16:20:52 +00:00
pdb = ( PDB ) & db ;
db = 12345 ;
ret = pSdbTagRefToTagID ( hsdb , size + 1 , & pdb , & db ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( pdb ! = NULL , " Expected a result, got: %p \n " , pdb ) ;
ok ( db = = ( size + 1 ) , " Expected %u, got: %u \n " , size + 1 , db ) ;
2016-10-30 19:39:43 +00:00
tr = 0x12345678 ;
ret = pSdbTagIDToTagRef ( hsdb , pdb , db , & tr ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( tr = = ( size + 1 ) , " Expected %u, got: %u \n " , ( size + 1 ) , tr ) ;
2016-09-03 16:20:52 +00:00
pdb = ( PDB ) & db ;
db = 12345 ;
ret = pSdbTagRefToTagID ( hsdb , 0x0fffffff , & pdb , & db ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( pdb ! = NULL , " Expected a result, got: %p \n " , pdb ) ;
ok ( db = = 0x0fffffff , " Expected %u, got: %u \n " , 0x0fffffff , db ) ;
2016-10-30 19:39:43 +00:00
tr = 0x12345678 ;
ret = pSdbTagIDToTagRef ( hsdb , pdb , db , & tr ) ;
ok ( ret = = TRUE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( tr = = 0x0fffffff , " Expected %u, got: %u \n " , 0x0fffffff , tr ) ;
2016-09-03 16:20:52 +00:00
pdb = ( PDB ) & db ;
db = 12345 ;
ret = pSdbTagRefToTagID ( hsdb , 0x10000000 , & pdb , & db ) ;
ok ( ret = = FALSE , " Expected ret to be FALSE, was: %d \n " , ret ) ;
ok ( pdb = = NULL , " Expected no result, got: %p \n " , pdb ) ;
ok ( db = = 0 , " Expected no result, got: 0x%x \n " , db ) ;
2016-10-30 19:39:43 +00:00
tr = 0x12345678 ;
ret = pSdbTagIDToTagRef ( hsdb , pdb , 0x10000000 , & tr ) ;
ok ( ret = = FALSE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( tr = = 0 , " Expected %u, got: %u \n " , 0 , tr ) ;
2016-09-03 16:20:52 +00:00
pdb = NULL ;
db = TAGID_NULL ;
ret = pSdbTagRefToTagID ( hsdb , TAGID_ROOT , & pdb , NULL ) ;
ok ( ret ! = FALSE , " Expected ret to be TRUE, was: %d \n " , ret ) ;
ok ( pdb ! = NULL , " Expected pdb to be valid \n " ) ;
2016-10-30 19:39:43 +00:00
if ( pdb = = NULL )
2016-09-03 16:20:52 +00:00
{
skip ( " Cannot run tests without pdb \n " ) ;
}
else
{
db = pSdbFindFirstTag ( pdb , TAGID_ROOT , TAG_DATABASE ) ;
2016-10-30 19:39:43 +00:00
if ( db ! = TAGID_NULL )
2016-09-03 16:20:52 +00:00
{
TAGID child ;
child = pSdbGetFirstChild ( pdb , db ) ;
2016-10-30 19:39:43 +00:00
while ( child ! = TAGID_NULL )
2016-09-03 16:20:52 +00:00
{
PDB pdb_res ;
TAGID tagid_res ;
2016-10-30 19:39:43 +00:00
/* We are using a TAGID as a TAGREF here. */
2016-09-03 16:20:52 +00:00
ret = pSdbTagRefToTagID ( hsdb , child , & pdb_res , & tagid_res ) ;
ok ( ret , " Expected SdbTagRefToTagID to succeed \n " ) ;
2016-10-30 19:39:43 +00:00
/* For simple cases (primary DB) TAGREF == TAGID */
tr = 0x12345678 ;
ret = pSdbTagIDToTagRef ( hsdb , pdb_res , tagid_res , & tr ) ;
ok ( ret , " Expected SdbTagIDToTagRef to succeed \n " ) ;
ok_hex ( tr , ( int ) tagid_res ) ;
2016-09-03 16:20:52 +00:00
child = pSdbGetNextChild ( pdb , db , child ) ;
}
}
else
{
skip ( " Cannot run tests without valid db tag \n " ) ;
}
}
2016-10-30 19:39:43 +00:00
/* Get a tagref for our own layer */
tr = pSdbGetLayerTagRef ( hsdb , L " TestNewMode " ) ;
ok_hex ( tr , 0x18e ) ;
/* We cannot find a tagref from the main database. */
tr = pSdbGetLayerTagRef ( hsdb , L " 256Color " ) ;
ok_hex ( tr , 0 ) ;
pSdbReleaseDatabase ( hsdb ) ;
2017-06-26 10:26:57 +00:00
DeleteFileW ( dbpath + 4 ) ;
2016-09-03 16:20:52 +00:00
}
2016-08-29 15:19:55 +00:00
static void expect_indexA_imp ( const char * text , LONGLONG expected )
{
static WCHAR wide_string [ 100 ] = { 0 } ;
LONGLONG result ;
MultiByteToWideChar ( CP_ACP , 0 , text , - 1 , wide_string , 100 ) ;
result = pSdbMakeIndexKeyFromString ( wide_string ) ;
winetest_ok ( result = = expected , " Expected %s to result in %s, was: %s \n " , text , wine_dbgstr_longlong ( expected ) , wine_dbgstr_longlong ( result ) ) ;
}
# define expect_indexA (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_indexA_imp
static void test_IndexKeyFromString ( void )
{
2016-10-30 19:39:43 +00:00
#if 0
static WCHAR tmp [ ] = { 0xabba , 0xbcde , 0x2020 , 0x20 , 0x4444 , 0 } ;
static WCHAR tmp2 [ ] = { 0xabba , 0xbcde , 0x20 , 0x4444 , 0 } ;
static WCHAR tmp3 [ ] = { 0x20 , 0xbcde , 0x4041 , 0x4444 , 0 } ;
static WCHAR tmp4 [ ] = { 0x20 , 0xbcde , 0x4041 , 0x4444 , 0x4444 , 0 } ;
static WCHAR tmp5 [ ] = { 0x2020 , 0xbcde , 0x4041 , 0x4444 , 0x4444 , 0 } ;
2016-08-29 15:19:55 +00:00
static WCHAR tmp6 [ ] = { 0x20 , 0xbcde , 0x4041 , 0x4444 , 0x4444 , 0x4444 , 0 } ;
static WCHAR tmp7 [ ] = { 0xbcde , 0x4041 , 0x4444 , 0x4444 , 0x4444 , 0x4444 , 0x4444 , 0x4444 , 0x4444 , 0 } ;
static WCHAR tmp8 [ ] = { 0xbc00 , 0x4041 , 0x4444 , 0x4444 , 0x4444 , 0x4444 , 0x4444 , 0x4444 , 0x4444 , 0 } ;
2016-10-30 19:39:43 +00:00
# endif
2016-08-29 15:19:55 +00:00
#if 0
/* This crashes. */
pSdbMakeIndexKeyFromString ( NULL ) ;
# endif
expect_indexA ( " " , 0x0000000000000000 ) ;
expect_indexA ( " a " , 0x4100000000000000 ) ;
expect_indexA ( " aa " , 0x4141000000000000 ) ;
expect_indexA ( " aaa " , 0x4141410000000000 ) ;
expect_indexA ( " aaaa " , 0x4141414100000000 ) ;
expect_indexA ( " aaaaa " , 0x4141414141000000 ) ;
expect_indexA ( " aaaaaa " , 0x4141414141410000 ) ;
expect_indexA ( " aaaaaaa " , 0x4141414141414100 ) ;
expect_indexA ( " aaaaaaaa " , 0x4141414141414141 ) ;
expect_indexA ( " aaa aaaaa " , 0x4141412041414141 ) ;
/* Does not change */
expect_indexA ( " aaaaaaaaa " , 0x4141414141414141 ) ;
expect_indexA ( " aaaaaaaab " , 0x4141414141414141 ) ;
expect_indexA ( " aaaaaaaac " , 0x4141414141414141 ) ;
expect_indexA ( " aaaaaaaaF " , 0x4141414141414141 ) ;
/* Upcase */
expect_indexA ( " AAAAAAAA " , 0x4141414141414141 ) ;
expect_indexA ( " ABABABAB " , 0x4142414241424142 ) ;
expect_indexA ( " ABABABABZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ " , 0x4142414241424142 ) ;
2016-10-30 19:39:43 +00:00
#if 0
/* These fail, but is that because the codepoints are too weird, or because the func is not correct? */
2016-08-29 15:19:55 +00:00
result = pSdbMakeIndexKeyFromString ( tmp ) ;
ok ( result = = 0xbaabdebc20200000 , " Expected %s to result in %s, was: %s \n " , wine_dbgstr_w ( tmp ) ,
wine_dbgstr_longlong ( 0xbaabdebc20200000 ) , wine_dbgstr_longlong ( result ) ) ;
result = pSdbMakeIndexKeyFromString ( tmp2 ) ;
ok ( result = = 0xbaabdebc00000000 , " Expected %s to result in %s, was: %s \n " , wine_dbgstr_w ( tmp2 ) ,
wine_dbgstr_longlong ( 0xbaabdebc00000000 ) , wine_dbgstr_longlong ( result ) ) ;
result = pSdbMakeIndexKeyFromString ( tmp3 ) ;
ok ( result = = 0x20debc4140000000 , " Expected %s to result in %s, was: %s \n " , wine_dbgstr_w ( tmp3 ) ,
wine_dbgstr_longlong ( 0x20debc4140000000 ) , wine_dbgstr_longlong ( result ) ) ;
result = pSdbMakeIndexKeyFromString ( tmp4 ) ;
ok ( result = = 0x20debc4140000000 , " Expected %s to result in %s, was: %s \n " , wine_dbgstr_w ( tmp4 ) ,
wine_dbgstr_longlong ( 0x20debc4140000000 ) , wine_dbgstr_longlong ( result ) ) ;
result = pSdbMakeIndexKeyFromString ( tmp5 ) ;
ok ( result = = 0x2020debc41400000 , " Expected %s to result in %s, was: %s \n " , wine_dbgstr_w ( tmp5 ) ,
wine_dbgstr_longlong ( 0x2020debc41400000 ) , wine_dbgstr_longlong ( result ) ) ;
result = pSdbMakeIndexKeyFromString ( tmp6 ) ;
ok ( result = = 0x20debc4140444400 , " Expected %s to result in %s, was: %s \n " , wine_dbgstr_w ( tmp6 ) ,
wine_dbgstr_longlong ( 0x20debc4140444400 ) , wine_dbgstr_longlong ( result ) ) ;
result = pSdbMakeIndexKeyFromString ( tmp7 ) ;
ok ( result = = 0xdebc414044444444 , " Expected %s to result in %s, was: %s \n " , wine_dbgstr_w ( tmp7 ) ,
wine_dbgstr_longlong ( 0xdebc414044444444 ) , wine_dbgstr_longlong ( result ) ) ;
result = pSdbMakeIndexKeyFromString ( tmp8 ) ;
ok ( result = = 0xbc414044444444 , " Expected %s to result in %s, was: %s \n " , wine_dbgstr_w ( tmp8 ) ,
wine_dbgstr_longlong ( 0xbc414044444444 ) , wine_dbgstr_longlong ( result ) ) ;
2016-10-30 19:39:43 +00:00
# endif
2016-08-29 15:19:55 +00:00
}
2016-09-03 16:20:52 +00:00
static int validate_SDBQUERYRESULT_size ( )
{
2016-10-30 19:39:43 +00:00
unsigned char buffer [ SDBQUERYRESULT_EXPECTED_SIZE_VISTA * 2 ] ;
2016-09-03 16:20:52 +00:00
WCHAR path [ MAX_PATH ] ;
2016-10-30 19:39:43 +00:00
size_t n ;
2016-09-03 16:20:52 +00:00
memset ( buffer , 0xab , sizeof ( buffer ) ) ;
2016-10-30 19:39:43 +00:00
GetModuleFileNameW ( NULL , path , MAX_PATH ) ;
2017-06-10 20:31:58 +00:00
pSdbGetMatchingExe ( NULL , path , NULL , NULL , 0 , ( SDBQUERYRESULT_VISTA * ) buffer ) ;
2016-10-30 19:39:43 +00:00
if ( buffer [ 0 ] = = 0xab )
2016-09-03 16:20:52 +00:00
{
2016-10-30 19:39:43 +00:00
trace ( " SdbGetMatchingExe didnt do anything, cannot determine SDBQUERYRESULT size \n " ) ;
return 0 ;
}
if ( buffer [ SDBQUERYRESULT_EXPECTED_SIZE_2k3 ] = = 0xab & & buffer [ SDBQUERYRESULT_EXPECTED_SIZE_2k3 - 1 ] ! = 0xab )
{
return 1 ;
}
if ( buffer [ SDBQUERYRESULT_EXPECTED_SIZE_VISTA ] = = 0xab & & buffer [ SDBQUERYRESULT_EXPECTED_SIZE_VISTA - 1 ] ! = 0xab )
{
return 2 ;
}
for ( n = 0 ; n < _countof ( buffer ) ; + + n )
{
if ( buffer [ n ] ! = 0xab )
2016-09-03 16:20:52 +00:00
{
2016-10-30 19:39:43 +00:00
trace ( " Unknown size: %i \n " , n ) ;
break ;
2016-09-03 16:20:52 +00:00
}
}
2016-10-30 19:39:43 +00:00
return 0 ;
2016-09-03 16:20:52 +00:00
}
2016-08-29 15:19:55 +00:00
2016-05-22 20:27:02 +00:00
START_TEST ( db )
{
//SetEnvironmentVariable("SHIM_DEBUG_LEVEL", "4");
2016-09-03 16:20:52 +00:00
//SetEnvironmentVariable("SHIMENG_DEBUG_LEVEL", "4");
2016-05-22 20:27:02 +00:00
//SetEnvironmentVariable("DEBUGCHANNEL", "+apphelp");
2016-10-30 19:39:43 +00:00
silence_debug_output ( ) ;
2016-05-22 20:27:02 +00:00
hdll = LoadLibraryA ( " apphelp.dll " ) ;
2016-10-30 19:39:43 +00:00
/* We detect the apphelp version that is loaded, instead of the os we are running on.
This allows for easier testing multiple versions of the dll */
g_WinVersion = get_module_version ( hdll ) ;
trace ( " Apphelp version: 0x%x \n " , g_WinVersion ) ;
* ( void * * ) & pSdbTagToString = ( void * ) GetProcAddress ( hdll , " SdbTagToString " ) ;
* ( void * * ) & pSdbOpenDatabase = ( void * ) GetProcAddress ( hdll , " SdbOpenDatabase " ) ;
* ( void * * ) & pSdbCreateDatabase = ( void * ) GetProcAddress ( hdll , " SdbCreateDatabase " ) ;
* ( void * * ) & pSdbGetDatabaseVersion = ( void * ) GetProcAddress ( hdll , " SdbGetDatabaseVersion " ) ;
* ( void * * ) & pSdbCloseDatabase = ( void * ) GetProcAddress ( hdll , " SdbCloseDatabase " ) ;
* ( void * * ) & pSdbCloseDatabaseWrite = ( void * ) GetProcAddress ( hdll , " SdbCloseDatabaseWrite " ) ;
* ( void * * ) & pSdbGetTagFromTagID = ( void * ) GetProcAddress ( hdll , " SdbGetTagFromTagID " ) ;
* ( void * * ) & pSdbWriteNULLTag = ( void * ) GetProcAddress ( hdll , " SdbWriteNULLTag " ) ;
* ( void * * ) & pSdbWriteWORDTag = ( void * ) GetProcAddress ( hdll , " SdbWriteWORDTag " ) ;
* ( void * * ) & pSdbWriteDWORDTag = ( void * ) GetProcAddress ( hdll , " SdbWriteDWORDTag " ) ;
* ( void * * ) & pSdbWriteQWORDTag = ( void * ) GetProcAddress ( hdll , " SdbWriteQWORDTag " ) ;
* ( void * * ) & pSdbWriteBinaryTagFromFile = ( void * ) GetProcAddress ( hdll , " SdbWriteBinaryTagFromFile " ) ;
* ( void * * ) & pSdbWriteStringTag = ( void * ) GetProcAddress ( hdll , " SdbWriteStringTag " ) ;
* ( void * * ) & pSdbWriteStringRefTag = ( void * ) GetProcAddress ( hdll , " SdbWriteStringRefTag " ) ;
* ( void * * ) & pSdbBeginWriteListTag = ( void * ) GetProcAddress ( hdll , " SdbBeginWriteListTag " ) ;
* ( void * * ) & pSdbEndWriteListTag = ( void * ) GetProcAddress ( hdll , " SdbEndWriteListTag " ) ;
* ( void * * ) & pSdbFindFirstTag = ( void * ) GetProcAddress ( hdll , " SdbFindFirstTag " ) ;
* ( void * * ) & pSdbFindNextTag = ( void * ) GetProcAddress ( hdll , " SdbFindNextTag " ) ;
* ( void * * ) & pSdbFindFirstNamedTag = ( void * ) GetProcAddress ( hdll , " SdbFindFirstNamedTag " ) ;
* ( void * * ) & pSdbReadWORDTag = ( void * ) GetProcAddress ( hdll , " SdbReadWORDTag " ) ;
* ( void * * ) & pSdbReadDWORDTag = ( void * ) GetProcAddress ( hdll , " SdbReadDWORDTag " ) ;
* ( void * * ) & pSdbReadQWORDTag = ( void * ) GetProcAddress ( hdll , " SdbReadQWORDTag " ) ;
* ( void * * ) & pSdbReadBinaryTag = ( void * ) GetProcAddress ( hdll , " SdbReadBinaryTag " ) ;
* ( void * * ) & pSdbReadStringTag = ( void * ) GetProcAddress ( hdll , " SdbReadStringTag " ) ;
* ( void * * ) & pSdbGetTagDataSize = ( void * ) GetProcAddress ( hdll , " SdbGetTagDataSize " ) ;
* ( void * * ) & pSdbGetBinaryTagData = ( void * ) GetProcAddress ( hdll , " SdbGetBinaryTagData " ) ;
* ( void * * ) & pSdbGetStringTagPtr = ( void * ) GetProcAddress ( hdll , " SdbGetStringTagPtr " ) ;
* ( void * * ) & pSdbGetFirstChild = ( void * ) GetProcAddress ( hdll , " SdbGetFirstChild " ) ;
* ( void * * ) & pSdbGetNextChild = ( void * ) GetProcAddress ( hdll , " SdbGetNextChild " ) ;
* ( void * * ) & pSdbGetDatabaseID = ( void * ) GetProcAddress ( hdll , " SdbGetDatabaseID " ) ;
* ( void * * ) & pSdbGUIDToString = ( void * ) GetProcAddress ( hdll , " SdbGUIDToString " ) ;
* ( void * * ) & pSdbInitDatabase = ( void * ) GetProcAddress ( hdll , " SdbInitDatabase " ) ;
* ( void * * ) & pSdbReleaseDatabase = ( void * ) GetProcAddress ( hdll , " SdbReleaseDatabase " ) ;
* ( void * * ) & pSdbGetMatchingExe = ( void * ) GetProcAddress ( hdll , " SdbGetMatchingExe " ) ;
* ( void * * ) & pSdbTagRefToTagID = ( void * ) GetProcAddress ( hdll , " SdbTagRefToTagID " ) ;
* ( void * * ) & pSdbTagIDToTagRef = ( void * ) GetProcAddress ( hdll , " SdbTagIDToTagRef " ) ;
* ( void * * ) & pSdbMakeIndexKeyFromString = ( void * ) GetProcAddress ( hdll , " SdbMakeIndexKeyFromString " ) ;
* ( void * * ) & pSdbGetLayerTagRef = ( void * ) GetProcAddress ( hdll , " SdbGetLayerTagRef " ) ;
2016-05-22 20:27:02 +00:00
test_Sdb ( ) ;
2016-06-02 18:59:04 +00:00
test_write_ex ( ) ;
2016-06-05 21:26:07 +00:00
test_stringtable ( ) ;
2016-05-22 20:39:41 +00:00
test_CheckDatabaseManually ( ) ;
2016-10-30 19:39:43 +00:00
switch ( validate_SDBQUERYRESULT_size ( ) )
{
case 1 :
test_MatchApplications < SDBQUERYRESULT_2k3 > ( ) ;
2017-06-26 14:58:08 +00:00
test_MatchApplicationsEx < SDBQUERYRESULT_2k3 > ( ) ;
2016-10-30 19:39:43 +00:00
break ;
case 2 :
2017-06-10 20:31:58 +00:00
test_MatchApplications < SDBQUERYRESULT_VISTA > ( ) ;
2017-06-26 14:58:08 +00:00
test_MatchApplicationsEx < SDBQUERYRESULT_VISTA > ( ) ;
2016-10-30 19:39:43 +00:00
break ;
default :
2016-09-03 16:20:52 +00:00
skip ( " Skipping tests with SDBQUERYRESULT due to a wrong size reported \n " ) ;
2016-10-30 19:39:43 +00:00
break ;
}
2016-09-03 16:20:52 +00:00
test_TagRef ( ) ;
skip ( " test_SecondaryDB() \n " ) ;
2016-08-29 15:19:55 +00:00
test_IndexKeyFromString ( ) ;
2016-05-22 20:27:02 +00:00
}