ReactOS 0.4.16-dev-338-g34e76ad
db.cpp File Reference
#include <ntstatus.h>
#include <windows.h>
#include <shlwapi.h>
#include <winnt.h>
#include <winternl.h>
#include <winerror.h>
#include <stdio.h>
#include <initguid.h>
#include <pseh/pseh2.h>
#include "wine/test.h"
#include "apphelp_apitest.h"
Include dependency graph for db.cpp:

Go to the source code of this file.

Classes

struct  _DB_INFORMATION
 

Macros

#define WIN32_NO_STATUS
 
#define DOS_PATH   0
 
#define HID_DATABASE_FULLPATH   2
 
#define SDB_DATABASE_MAIN_SHIM   0x80030000
 
#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
 
#define TAG_INCLUDE   (0x1 | TAG_TYPE_NULL)
 
#define TAG_MATCH_MODE   (0x1 | TAG_TYPE_WORD)
 
#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)
 
#define TAG_FLAG_LUA   (0x10 | TAG_TYPE_QWORD)
 
#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)
 
#define TAG_DATA   (0xF | TAG_TYPE_LIST)
 
#define TAG_STRINGTABLE   (0x801 | TAG_TYPE_LIST)
 
#define TAG_STRINGTABLE_ITEM   (0x801 | TAG_TYPE_STRING)
 
#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)
 
#define TAG_WILDCARD_NAME   (0xB | TAG_TYPE_STRINGREF)
 
#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)
 
#define TAG_GENERAL   (0x2 | TAG_TYPE_NULL)
 
#define TAG_EXE_ID   (0x4 | TAG_TYPE_BINARY)
 
#define TAG_DATA_BITS   (0x5 | TAG_TYPE_BINARY)
 
#define TAG_DATABASE_ID   (0x7 | TAG_TYPE_BINARY)
 
#define match_strw_attr   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_strw_attr_imp
 
#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
 
#define expect_indexA   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_indexA_imp
 

Typedefs

typedef struct _DB_INFORMATION DB_INFORMATION
 
typedef struct _DB_INFORMATIONPDB_INFORMATION
 

Functions

static LPCWSTR (WINAPI *pSdbTagToString)(TAG)
 
static PDB (WINAPI *pSdbOpenDatabase)(LPCWSTR
 
static BOOL (WINAPI *pSdbGetDatabaseVersion)(LPCWSTR
 
static void (WINAPI *pSdbCloseDatabase)(PDB)
 
static TAG (WINAPI *pSdbGetTagFromTagID)(PDB
 
static TAGID (WINAPI *pSdbBeginWriteListTag)(PDB
 
static WORD (WINAPI *pSdbReadWORDTag)(PDB
 
static DWORD (WINAPI *pSdbReadDWORDTag)(PDB
 
static QWORD (WINAPI *pSdbReadQWORDTag)(PDB
 
static PVOID (WINAPI *pSdbGetBinaryTagData)(PDB
 
static LPWSTR (WINAPI *pSdbGetStringTagPtr)(PDB
 
static HSDB (WINAPI *pSdbInitDatabase)(DWORD
 
static TAGREF (WINAPI *pSdbGetLayerTagRef)(HSDB hsdb
 
static LONGLONG (WINAPI *pSdbMakeIndexKeyFromString)(LPCWSTR)
 
static VOID (WINAPI *pSdbFreeDatabaseInformation)(PDB_INFORMATION information)
 
 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)
 
static void Write (HANDLE file, LPCVOID buffer, DWORD size)
 
static void test_GetDatabaseInformationEmpty (PDB pdb)
 
static void test_Sdb (void)
 
static void test_write_ex (void)
 
static void write_db_strings (const WCHAR *name, const WCHAR *data[], size_t count)
 
static void test_stringtable ()
 
static void match_strw_attr_imp (PDB pdb, TAGID parent, TAG find, const WCHAR *compare)
 
static void match_dw_attr_imp (PDB pdb, TAGID parent, TAG find, DWORD compare)
 
static void match_qw_attr_imp (PDB pdb, TAGID parent, TAG find, QWORD compare)
 
static void match_guid_attr_imp (PDB pdb, TAGID parent, TAG find, const GUID *compare)
 
static void check_db_properties (PDB pdb, TAGID root)
 
static void check_db_layer (PDB pdb, TAGID layer)
 
static void check_matching_file (PDB pdb, TAGID exe, TAGID matching_file, int num)
 
static void check_matching_apphelp (PDB pdb, TAGID apphelp, int num)
 
static void check_matching_layer (PDB pdb, TAGID layer, int num)
 
static void check_db_exes (PDB pdb, TAGID root)
 
static void check_db_apphelp (PDB pdb, TAGID root)
 
static void test_GetDatabaseInformation (PDB pdb)
 
static void test_CheckDatabaseManually (void)
 
static void test_is_testdb (PDB pdb)
 
template<typename SDBQUERYRESULT_T >
static void check_adwExeFlags (DWORD adwExeFlags_0, SDBQUERYRESULT_T &query, const char *file, int line, size_t cur)
 
template<>
void check_adwExeFlags (DWORD, SDBQUERYRESULT_2k3 &, const char *, int, size_t)
 
template<typename SDBQUERYRESULT_T >
static void test_mode_generic (const WCHAR *workdir, HSDB hsdb, size_t cur)
 
template<typename SDBQUERYRESULT_T >
static void test_MatchApplications (void)
 
static BOOL write_raw_file (const WCHAR *FileName, const void *Data, DWORD Size)
 
static bool extract_resource (const WCHAR *Filename, LPCWSTR ResourceName)
 
template<typename SDBQUERYRESULT_T >
static void test_match_ex (const WCHAR *workdir, HSDB hsdb)
 
template<typename SDBQUERYRESULT_T >
static void test_MatchApplicationsEx (void)
 
static void test_TagRef (void)
 
static void test_DataTags (HSDB hsdb)
 
static void test_Data (void)
 
static void expect_indexA_imp (const char *text, LONGLONG expected)
 
static void test_IndexKeyFromString (void)
 
static int validate_SDBQUERYRESULT_size ()
 
 START_TEST (db)
 

Variables

static HMODULE hdll
 
static PATH_TYPE
 
static PDWORD
 
static TAGID
 
static TAG
 
static WORD
 
static DWORD
 
static QWORD
 
static LPCWSTR
 
static TAGID root
 
static TAGID TAGID find
 
static TAGID TAGID TAGID nametag
 
static TAGID TAGID TAGID LPCWSTR find_name
 
static PBYTE
 
static LPWSTR
 
static GUID *static PCWSTR
 
static GUID *static SIZE_T
 
static LPCWSTR path
 
static LPCWSTR LPCWSTR module_name
 
static LPCWSTR LPCWSTR LPCWSTR env
 
static LPCWSTR LPCWSTR LPCWSTR DWORD flags
 
static LPCWSTR LPCWSTR LPCWSTR DWORD PSDBQUERYRESULT_VISTA result
 
static TAGREF trWhich
 
static TAGREF PDBppdb
 
static TAGREF PDB TAGIDptiWhich
 
static PDB pdb
 
static PDB TAGID tiWhich
 
static PDB TAGID TAGREFptrWhich
 
static LPCWSTR layerName
 
static TAGREF LPCWSTR lpszDataName
 
static TAGREF LPCWSTR LPDWORD lpdwDataType
 
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
 
static TAGREF LPCWSTR LPDWORD LPVOID LPDWORD lpcbBufferSize
 
static TAGREF LPCWSTR LPDWORD LPVOID LPDWORD TAGREFptrData
 
static TAGID tiExe
 
static TAGID LPCWSTR LPDWORD LPVOID LPDWORD TAGIDptiData
 
static PDB_INFORMATION information
 
struct {
   const WCHAR *   name
 
   const WCHAR *   app_name
 
   const WCHAR *   vendor
 
   GUID   exe_id
 
   const WCHAR *   extra_file
 
   DWORD   dwLayerCount
 
   TAGREF   atrExes_0
 
   DWORD   adwExeFlags_0
 
   TAGREF   atrLayers_0
 
   TAGREF   trApphelp
 
   const char *   env_var
 
test_exedata [5]
 
struct {
   DWORD   htmlhelpid
 
   const WCHAR *   link
 
   const WCHAR *   apphelp_title
 
   const WCHAR *   apphelp_details
 
test_layerdata [2]
 

Macro Definition Documentation

◆ _TAGID_ROOT

#define _TAGID_ROOT   12

Definition at line 40 of file db.cpp.

◆ DOS_PATH

#define DOS_PATH   0

Definition at line 32 of file db.cpp.

◆ expect_indexA

#define expect_indexA   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_indexA_imp

Definition at line 1955 of file db.cpp.

◆ HID_DATABASE_FULLPATH

#define HID_DATABASE_FULLPATH   2

Definition at line 33 of file db.cpp.

◆ match_dw_attr

#define match_dw_attr   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_dw_attr_imp

Definition at line 666 of file db.cpp.

◆ match_guid_attr

#define match_guid_attr   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_guid_attr_imp

Definition at line 668 of file db.cpp.

◆ match_qw_attr

#define match_qw_attr   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_qw_attr_imp

Definition at line 667 of file db.cpp.

◆ match_strw_attr

#define match_strw_attr   (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : match_strw_attr_imp

Definition at line 665 of file db.cpp.

◆ SDB_DATABASE_MAIN_SHIM

#define SDB_DATABASE_MAIN_SHIM   0x80030000

Definition at line 35 of file db.cpp.

◆ TAG_APP_NAME

#define TAG_APP_NAME   (0x6 | TAG_TYPE_STRINGREF)

Definition at line 101 of file db.cpp.

◆ TAG_APP_NAME_RC_ID

#define TAG_APP_NAME_RC_ID   (0x24 | TAG_TYPE_DWORD)

Definition at line 73 of file db.cpp.

◆ TAG_APPHELP

#define TAG_APPHELP   (0xD | TAG_TYPE_LIST)

Definition at line 91 of file db.cpp.

◆ TAG_APPHELP_DETAILS

#define TAG_APPHELP_DETAILS   (0x18 | TAG_TYPE_STRINGREF)

Definition at line 112 of file db.cpp.

◆ TAG_APPHELP_TITLE

#define TAG_APPHELP_TITLE   (0x1B | TAG_TYPE_STRINGREF)

Definition at line 114 of file db.cpp.

◆ TAG_BIN_FILE_VERSION

#define TAG_BIN_FILE_VERSION   (0x2 | TAG_TYPE_QWORD)

Definition at line 79 of file db.cpp.

◆ TAG_BIN_PRODUCT_VERSION

#define TAG_BIN_PRODUCT_VERSION   (0x3 | TAG_TYPE_QWORD)

Definition at line 80 of file db.cpp.

◆ TAG_CHECKSUM

#define TAG_CHECKSUM   (0x3 | TAG_TYPE_DWORD)

Definition at line 61 of file db.cpp.

◆ TAG_COMMAND_LINE

#define TAG_COMMAND_LINE   (0x8 | TAG_TYPE_STRINGREF)

Definition at line 102 of file db.cpp.

◆ TAG_COMPANY_NAME

#define TAG_COMPANY_NAME   (0x9 | TAG_TYPE_STRINGREF)

Definition at line 103 of file db.cpp.

◆ TAG_COMPILER_VERSION

#define TAG_COMPILER_VERSION   (0x22 | TAG_TYPE_STRINGREF)

Definition at line 116 of file db.cpp.

◆ TAG_DATA

#define TAG_DATA   (0xF | TAG_TYPE_LIST)

Definition at line 93 of file db.cpp.

◆ TAG_DATA_BITS

#define TAG_DATA_BITS   (0x5 | TAG_TYPE_BINARY)

Definition at line 121 of file db.cpp.

◆ TAG_DATABASE

#define TAG_DATABASE   (0x1 | TAG_TYPE_LIST)

Definition at line 85 of file db.cpp.

◆ TAG_DATABASE_ID

#define TAG_DATABASE_ID   (0x7 | TAG_TYPE_BINARY)

Definition at line 122 of file db.cpp.

◆ TAG_EXE

#define TAG_EXE   (0x7 | TAG_TYPE_LIST)

Definition at line 87 of file db.cpp.

◆ TAG_EXE_ID

#define TAG_EXE_ID   (0x4 | TAG_TYPE_BINARY)

Definition at line 120 of file db.cpp.

◆ TAG_FILE_DESCRIPTION

#define TAG_FILE_DESCRIPTION   (0x12 | TAG_TYPE_STRINGREF)

Definition at line 107 of file db.cpp.

◆ TAG_FILE_VERSION

#define TAG_FILE_VERSION   (0x13 | TAG_TYPE_STRINGREF)

Definition at line 108 of file db.cpp.

◆ TAG_FLAG_LUA

#define TAG_FLAG_LUA   (0x10 | TAG_TYPE_QWORD)

Definition at line 83 of file db.cpp.

◆ TAG_FLAGS

#define TAG_FLAGS   (0x17 | TAG_TYPE_DWORD)

Definition at line 68 of file db.cpp.

◆ TAG_GENERAL

#define TAG_GENERAL   (0x2 | TAG_TYPE_NULL)

Definition at line 118 of file db.cpp.

◆ TAG_HTMLHELPID

#define TAG_HTMLHELPID   (0x15 | TAG_TYPE_DWORD)

Definition at line 67 of file db.cpp.

◆ TAG_INCLUDE

#define TAG_INCLUDE   (0x1 | TAG_TYPE_NULL)

Definition at line 56 of file db.cpp.

◆ TAG_INEXCLUD

#define TAG_INEXCLUD   (0x3 | TAG_TYPE_LIST)

Definition at line 86 of file db.cpp.

◆ TAG_INTERNAL_NAME

#define TAG_INTERNAL_NAME   (0x15 | TAG_TYPE_STRINGREF)

Definition at line 110 of file db.cpp.

◆ TAG_LAYER

#define TAG_LAYER   (0xB | TAG_TYPE_LIST)

Definition at line 90 of file db.cpp.

◆ TAG_LAYER_TAGID

#define TAG_LAYER_TAGID   (0x1A | TAG_TYPE_DWORD)

Definition at line 69 of file db.cpp.

◆ TAG_LEGAL_COPYRIGHT

#define TAG_LEGAL_COPYRIGHT   (0x16 | TAG_TYPE_STRINGREF)

Definition at line 111 of file db.cpp.

◆ TAG_LINK

#define TAG_LINK   (0xE | TAG_TYPE_LIST)

Definition at line 92 of file db.cpp.

◆ TAG_LINK_DATE

#define TAG_LINK_DATE   (0x1D | TAG_TYPE_DWORD)

Definition at line 71 of file db.cpp.

◆ TAG_LINK_URL

#define TAG_LINK_URL   (0x19 | TAG_TYPE_STRINGREF)

Definition at line 113 of file db.cpp.

◆ TAG_LINKER_VERSION

#define TAG_LINKER_VERSION   (0x1C | TAG_TYPE_DWORD)

Definition at line 70 of file db.cpp.

◆ TAG_MATCH_MODE

#define TAG_MATCH_MODE   (0x1 | TAG_TYPE_WORD)

Definition at line 58 of file db.cpp.

◆ TAG_MATCHING_FILE

#define TAG_MATCHING_FILE   (0x8 | TAG_TYPE_LIST)

Definition at line 88 of file db.cpp.

◆ TAG_MODULE

#define TAG_MODULE   (0x3 | TAG_TYPE_STRINGREF)

Definition at line 99 of file db.cpp.

◆ TAG_MODULE_TYPE

#define TAG_MODULE_TYPE   (0x6 | TAG_TYPE_DWORD)

Definition at line 62 of file db.cpp.

◆ TAG_NAME

#define TAG_NAME   (0x1 | TAG_TYPE_STRINGREF)

Definition at line 98 of file db.cpp.

◆ TAG_NULL

#define TAG_NULL   0x0

Definition at line 54 of file db.cpp.

◆ TAG_ORIGINAL_FILENAME

#define TAG_ORIGINAL_FILENAME   (0x14 | TAG_TYPE_STRINGREF)

Definition at line 109 of file db.cpp.

◆ TAG_OS_PLATFORM

#define TAG_OS_PLATFORM   (0x23 | TAG_TYPE_DWORD)

Definition at line 76 of file db.cpp.

◆ TAG_PE_CHECKSUM

#define TAG_PE_CHECKSUM   (0xB | TAG_TYPE_DWORD)

Definition at line 65 of file db.cpp.

◆ TAG_PROBLEMSEVERITY

#define TAG_PROBLEMSEVERITY   (0x10 | TAG_TYPE_DWORD)

Definition at line 66 of file db.cpp.

◆ TAG_PRODUCT_NAME

#define TAG_PRODUCT_NAME   (0x10 | TAG_TYPE_STRINGREF)

Definition at line 105 of file db.cpp.

◆ TAG_PRODUCT_VERSION

#define TAG_PRODUCT_VERSION   (0x11 | TAG_TYPE_STRINGREF)

Definition at line 106 of file db.cpp.

◆ TAG_SHIM_REF

#define TAG_SHIM_REF   (0x9| TAG_TYPE_LIST)

Definition at line 89 of file db.cpp.

◆ TAG_SIZE

#define TAG_SIZE   (0x1 | TAG_TYPE_DWORD)

Definition at line 60 of file db.cpp.

◆ TAG_STRINGTABLE

#define TAG_STRINGTABLE   (0x801 | TAG_TYPE_LIST)

Definition at line 94 of file db.cpp.

◆ TAG_STRINGTABLE_ITEM

#define TAG_STRINGTABLE_ITEM   (0x801 | TAG_TYPE_STRING)

Definition at line 96 of file db.cpp.

◆ TAG_SUMMARY_MSG_RC_ID

#define TAG_SUMMARY_MSG_RC_ID   (0x26 | TAG_TYPE_DWORD)

Definition at line 75 of file db.cpp.

◆ TAG_TIME

#define TAG_TIME   (0x1 | TAG_TYPE_QWORD)

Definition at line 78 of file db.cpp.

◆ TAG_TYPE_BINARY

#define TAG_TYPE_BINARY   0x9000

Definition at line 53 of file db.cpp.

◆ TAG_TYPE_BYTE

#define TAG_TYPE_BYTE   0x2000

Definition at line 46 of file db.cpp.

◆ TAG_TYPE_DWORD

#define TAG_TYPE_DWORD   0x4000

Definition at line 48 of file db.cpp.

◆ TAG_TYPE_LIST

#define TAG_TYPE_LIST   0x7000

Definition at line 51 of file db.cpp.

◆ TAG_TYPE_MASK

#define TAG_TYPE_MASK   0xF000

Definition at line 43 of file db.cpp.

◆ TAG_TYPE_NULL

#define TAG_TYPE_NULL   0x1000

Definition at line 45 of file db.cpp.

◆ TAG_TYPE_QWORD

#define TAG_TYPE_QWORD   0x5000

Definition at line 49 of file db.cpp.

◆ TAG_TYPE_STRING

#define TAG_TYPE_STRING   0x8000

Definition at line 52 of file db.cpp.

◆ TAG_TYPE_STRINGREF

#define TAG_TYPE_STRINGREF   0x6000

Definition at line 50 of file db.cpp.

◆ TAG_TYPE_WORD

#define TAG_TYPE_WORD   0x3000

Definition at line 47 of file db.cpp.

◆ TAG_UPTO_BIN_FILE_VERSION

#define TAG_UPTO_BIN_FILE_VERSION   (0xD | TAG_TYPE_QWORD)

Definition at line 82 of file db.cpp.

◆ TAG_UPTO_BIN_PRODUCT_VERSION

#define TAG_UPTO_BIN_PRODUCT_VERSION   (0x6 | TAG_TYPE_QWORD)

Definition at line 81 of file db.cpp.

◆ TAG_UPTO_LINK_DATE

#define TAG_UPTO_LINK_DATE   (0x1E | TAG_TYPE_DWORD)

Definition at line 72 of file db.cpp.

◆ TAG_VENDOR

#define TAG_VENDOR   (0x5 | TAG_TYPE_STRINGREF)

Definition at line 100 of file db.cpp.

◆ TAG_VENDOR_NAME_RC_ID

#define TAG_VENDOR_NAME_RC_ID   (0x25 | TAG_TYPE_DWORD)

Definition at line 74 of file db.cpp.

◆ TAG_VERFILEOS

#define TAG_VERFILEOS   (0x9 | TAG_TYPE_DWORD)

Definition at line 63 of file db.cpp.

◆ TAG_VERFILETYPE

#define TAG_VERFILETYPE   (0xA | TAG_TYPE_DWORD)

Definition at line 64 of file db.cpp.

◆ TAG_WILDCARD_NAME

#define TAG_WILDCARD_NAME   (0xB | TAG_TYPE_STRINGREF)

Definition at line 104 of file db.cpp.

◆ TAGID_NULL

#define TAGID_NULL   0x0

Definition at line 38 of file db.cpp.

◆ TAGID_ROOT

#define TAGID_ROOT   0x0

Definition at line 39 of file db.cpp.

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 11 of file db.cpp.

Typedef Documentation

◆ DB_INFORMATION

◆ PDB_INFORMATION

Function Documentation

◆ BOOL()

static BOOL ( WINAPI pSdbGetDatabaseVersion)
static

◆ check_adwExeFlags() [1/2]

template<typename SDBQUERYRESULT_T >
static void check_adwExeFlags ( DWORD  adwExeFlags_0,
SDBQUERYRESULT_T &  query,
const char file,
int  line,
size_t  cur 
)
static

Definition at line 1194 of file db.cpp.

1195{
1196 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);
1197 for (size_t n = 1; n < _countof(query.atrExes); ++n)
1198 ok_(file, line)(query.adwExeFlags[n] == 0, "Expected adwExeFlags[%d] to be 0, was: %x for %d\n", n, query.adwExeFlags[0], cur);
1199}
#define ok_(x1, x2)
Definition: atltest.h:61
DWORD adwExeFlags_0
Definition: db.cpp:877
FxCollectionEntry * cur
GLdouble n
Definition: glext.h:7729
#define _countof(array)
Definition: sndvol32.h:70
Definition: fci.c:127
Definition: parser.c:49

Referenced by test_mode_generic().

◆ check_adwExeFlags() [2/2]

template<>
void check_adwExeFlags ( DWORD  ,
SDBQUERYRESULT_2k3 ,
const char ,
int  ,
size_t   
)

Definition at line 1202 of file db.cpp.

1203{
1204}

◆ check_db_apphelp()

static void check_db_apphelp ( PDB  pdb,
TAGID  root 
)
static

Definition at line 1015 of file db.cpp.

1016{
1017 int num = 0;
1018 TAGID apphelp = pSdbFindFirstTag(pdb, root, TAG_APPHELP);
1019 while (apphelp != TAGID_NULL)
1020 {
1021 TAGID link;
1022 ok(num < 2, "Too many matches, expected only 4!\n");
1023 if (num >= 2)
1024 break;
1026 link = pSdbFindFirstTag(pdb, apphelp, TAG_LINK);
1027 ok(link != TAGID_NULL, "expected to find a link tag\n");
1028 if (link != TAGID_NULL)
1029 {
1031 }
1034 apphelp = pSdbFindNextTag(pdb, root, apphelp);
1035 num++;
1036 }
1037 ok(num == 2, "Expected to find 2 layer tags, found: %d\n", num);
1038}
DWORD TAGID
#define ok(value,...)
Definition: atltest.h:57
static PDB pdb
Definition: db.cpp:172
#define match_dw_attr
Definition: db.cpp:666
#define TAGID_NULL
Definition: db.cpp:38
#define TAG_HTMLHELPID
Definition: db.cpp:67
DWORD htmlhelpid
Definition: db.cpp:996
const WCHAR * apphelp_details
Definition: db.cpp:999
const WCHAR * apphelp_title
Definition: db.cpp:998
#define TAG_APPHELP_DETAILS
Definition: db.cpp:112
static struct @1589 test_layerdata[2]
#define TAG_APPHELP
Definition: db.cpp:91
#define TAG_LINK
Definition: db.cpp:92
#define TAG_APPHELP_TITLE
Definition: db.cpp:114
const WCHAR * link
Definition: db.cpp:997
#define TAG_LINK_URL
Definition: db.cpp:113
#define match_strw_attr
Definition: db.cpp:665
GLuint GLuint num
Definition: glext.h:9618

Referenced by test_CheckDatabaseManually().

◆ check_db_exes()

static void check_db_exes ( PDB  pdb,
TAGID  root 
)
static

Definition at line 949 of file db.cpp.

950{
951 int num = 0;
952 TAGID exe = pSdbFindFirstTag(pdb, root, TAG_EXE);
953 TAGID altExe = pSdbFindFirstNamedTag(pdb, root, TAG_EXE, TAG_NAME, L"test_allow.exe");
954 ok_hex(altExe, (int)exe);
955 while (exe != TAGID_NULL)
956 {
957 TAGID apphelp, layer;
958 ok(num < 4, "Too many matches, expected only 4!\n");
959 if (num >= 4)
960 break;
965 check_matching_file(pdb, exe, pSdbFindFirstTag(pdb, exe, TAG_MATCHING_FILE), num);
966 apphelp = pSdbFindFirstTag(pdb, exe, TAG_APPHELP);
967 if (num == 0 || num == 1)
968 {
969 ok(apphelp != TAGID_NULL, "Expected to find a valid apphelp match on %d.\n", num);
970 if (apphelp)
971 check_matching_apphelp(pdb, apphelp, num);
972 }
973 else
974 {
975 ok(apphelp == TAGID_NULL, "Did not expect an apphelp match on %d\n", num);
976 }
977 layer = pSdbFindFirstTag(pdb, exe, TAG_LAYER);
978 if (num == 2 || num == 3)
979 {
980 ok(layer != TAGID_NULL, "Expected to find a valid layer match on %d.\n", num);
981 if (layer)
983 }
984 else
985 {
986 ok(layer == TAGID_NULL, "Did not expect a layer match on %d\n", num);
987 }
988 ++num;
989 exe = pSdbFindNextTag(pdb, root, exe);
990 }
991 ok(num == 4, "Expected to find 4 exe tags, found: %d\n", num);
992}
#define ok_hex(expression, result)
Definition: atltest.h:94
#define match_guid_attr
Definition: db.cpp:668
#define TAG_LAYER
Definition: db.cpp:90
#define TAG_EXE
Definition: db.cpp:87
GUID exe_id
Definition: db.cpp:873
static struct @1588 test_exedata[5]
#define TAG_APP_NAME
Definition: db.cpp:101
const WCHAR * vendor
Definition: db.cpp:872
#define TAG_VENDOR
Definition: db.cpp:100
#define TAG_MATCHING_FILE
Definition: db.cpp:88
static void check_matching_file(PDB pdb, TAGID exe, TAGID matching_file, int num)
Definition: db.cpp:738
#define TAG_NAME
Definition: db.cpp:98
static void check_matching_layer(PDB pdb, TAGID layer, int num)
Definition: db.cpp:853
#define TAG_EXE_ID
Definition: db.cpp:120
const WCHAR * app_name
Definition: db.cpp:871
static void check_matching_apphelp(PDB pdb, TAGID apphelp, int num)
Definition: db.cpp:805
GLenum GLuint GLint GLint layer
Definition: glext.h:7007
#define L(x)
Definition: ntvdm.h:50
Definition: name.c:39

Referenced by test_CheckDatabaseManually().

◆ check_db_layer()

static void check_db_layer ( PDB  pdb,
TAGID  layer 
)
static

Definition at line 704 of file db.cpp.

705{
706 TAGID shimref, inexclude, is_include;
707 ok(layer != TAGID_NULL, "Expected a valid layer, got NULL\n");
708 if (!layer)
709 return;
710
711 match_strw_attr(pdb, layer, TAG_NAME, L"TestNewMode");
712 shimref = pSdbFindFirstTag(pdb, layer, TAG_SHIM_REF);
713 ok(shimref != TAGID_NULL, "Expected a valid shim ref, got NULL\n");
714 if (!shimref)
715 return;
716
717 match_strw_attr(pdb, shimref, TAG_NAME, L"VirtualRegistry");
718 match_strw_attr(pdb, shimref, TAG_COMMAND_LINE, L"ThemeActive");
719 inexclude = pSdbFindFirstTag(pdb, shimref, TAG_INEXCLUD);
720 ok(inexclude != TAGID_NULL, "Expected a valid in/exclude ref, got NULL\n");
721 if (!inexclude)
722 return;
723
724 is_include = pSdbFindFirstTag(pdb, inexclude, TAG_INCLUDE);
725 ok(is_include == TAGID_NULL, "Expected a NULL include ref, but got one anyway.\n");
726 match_strw_attr(pdb, inexclude, TAG_MODULE, L"exclude.dll");
727
728 inexclude = pSdbFindNextTag(pdb, shimref, inexclude);
729 ok(inexclude != TAGID_NULL, "Expected a valid in/exclude ref, got NULL\n");
730 if (!inexclude)
731 return;
732
733 is_include = pSdbFindFirstTag(pdb, inexclude, TAG_INCLUDE);
734 ok(is_include != TAGID_NULL, "Expected a valid include ref, got NULL\n");
735 match_strw_attr(pdb, inexclude, TAG_MODULE, L"include.dll");
736}
#define TAG_MODULE
Definition: db.cpp:99
#define TAG_INEXCLUD
Definition: db.cpp:86
#define TAG_COMMAND_LINE
Definition: db.cpp:102
#define TAG_INCLUDE
Definition: db.cpp:56
#define TAG_SHIM_REF
Definition: db.cpp:89

Referenced by test_CheckDatabaseManually().

◆ check_db_properties()

static void check_db_properties ( PDB  pdb,
TAGID  root 
)
static

Definition at line 674 of file db.cpp.

675{
676 TAGID iter = pSdbFindFirstTag(pdb, root, TAG_DATABASE_ID);
677 ok(iter != TAGID_NULL, "expected a result, got TAGID_NULL\n");
678 if (iter != TAGID_NULL)
679 {
680 GUID guid = { 0 }, guid2 = { 0 };
681 BOOL result = pSdbReadBinaryTag(pdb, iter, (PBYTE)&guid, sizeof(guid));
682 ok(result, "expected SdbReadBinaryTag not to fail.\n");
683 if (result)
684 {
685 WCHAR guid_wstr[50];
686 result = pSdbGUIDToString(&guid, guid_wstr, 50);
687 ok(result, "expected SdbGUIDToString not to fail.\n");
688 if (result)
689 {
690 char guid_str[50];
691 WideCharToMultiByte(CP_ACP, 0, guid_wstr, -1, guid_str, sizeof(guid_str), NULL, NULL);
692 ok_str(guid_str, "{e39b0eb0-55db-450b-9bd4-d20c9484260f}");
693 }
694 ok(pSdbGetDatabaseID(pdb, &guid2), "expected SdbGetDatabaseID not to fail.\n");
695 ok(IsEqualGUID(guid, guid2), "expected guids to be equal(%s:%s)\n", wine_dbgstr_guid(&guid), wine_dbgstr_guid(&guid2));
696 }
697 }
698 match_qw_attr(pdb, root, TAG_TIME, 0x1d1b91a02c0d63e);
700 match_strw_attr(pdb, root, TAG_NAME, L"apphelp_test1");
702}
#define ok_str(x, y)
Definition: atltest.h:127
#define TAG_DATABASE_ID
Definition: db.cpp:122
#define match_qw_attr
Definition: db.cpp:667
#define TAG_COMPILER_VERSION
Definition: db.cpp:116
#define TAG_OS_PLATFORM
Definition: db.cpp:76
#define TAG_TIME
Definition: db.cpp:78
#define NULL
Definition: types.h:112
#define CP_ACP
Definition: compat.h:109
#define WideCharToMultiByte
Definition: compat.h:111
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint64EXT * result
Definition: glext.h:11304
const GUID * guid
static GUID guid2
Definition: devinst.c:42
BYTE * PBYTE
Definition: pedump.c:66
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by test_CheckDatabaseManually().

◆ check_matching_apphelp()

static void check_matching_apphelp ( PDB  pdb,
TAGID  apphelp,
int  num 
)
static

Definition at line 805 of file db.cpp.

806{
807 if (num == 0)
808 {
809/*
810[Window Title]
811Program Compatibility Assistant
812
813[Main Instruction]
814This program has known compatibility issues
815
816[Expanded Information]
817Allow it!
818
819[^] Hide details [ ] Don't show this message again [Check for solutions online] [Run program] [Cancel]
820*/
821 match_dw_attr(pdb, apphelp, TAG_FLAGS, 1);
823 match_dw_attr(pdb, apphelp, TAG_HTMLHELPID, 1);
824 match_dw_attr(pdb, apphelp, TAG_APP_NAME_RC_ID, 0x6f0072);
825 match_dw_attr(pdb, apphelp, TAG_VENDOR_NAME_RC_ID, 0x720067);
827 }
828 else
829 {
830/*
831[Window Title]
832Program Compatibility Assistant
833
834[Main Instruction]
835This program is blocked due to compatibility issues
836
837[Expanded Information]
838Not allowed!
839
840[^] Hide details [Check for solutions online] [Cancel]
841*/
842 match_dw_attr(pdb, apphelp, TAG_FLAGS, 1);
844 match_dw_attr(pdb, apphelp, TAG_HTMLHELPID, 2);
845 match_dw_attr(pdb, apphelp, TAG_APP_NAME_RC_ID, 0x320020);
846 match_dw_attr(pdb, apphelp, TAG_VENDOR_NAME_RC_ID, 0x38002e);
848 }
849 apphelp = pSdbFindNextTag(pdb, apphelp, apphelp);
850 ok(apphelp == TAGID_NULL, "Did not expect a secondary match on %d\n", num);
851}
#define TAG_APP_NAME_RC_ID
Definition: db.cpp:73
#define TAG_SUMMARY_MSG_RC_ID
Definition: db.cpp:75
#define TAG_PROBLEMSEVERITY
Definition: db.cpp:66
#define TAG_VENDOR_NAME_RC_ID
Definition: db.cpp:74
#define TAG_FLAGS
Definition: db.cpp:68

Referenced by check_db_exes().

◆ check_matching_file()

static void check_matching_file ( PDB  pdb,
TAGID  exe,
TAGID  matching_file,
int  num 
)
static

Definition at line 738 of file db.cpp.

739{
740 ok(matching_file != TAGID_NULL, "Expected to find atleast 1 matching file.\n");
741 if (matching_file == TAGID_NULL)
742 return;
743
744 ok(num < 4, "Too many matches, expected only 4!\n");
745 if (num >= 4)
746 return;
747
748
749 match_strw_attr(pdb, matching_file, TAG_NAME, L"*");
750 match_strw_attr(pdb, matching_file, TAG_COMPANY_NAME, L"CompanyName");
751 match_strw_attr(pdb, matching_file, TAG_PRODUCT_NAME, L"ProductName");
752 match_strw_attr(pdb, matching_file, TAG_PRODUCT_VERSION, L"1.0.0.1");
753 match_strw_attr(pdb, matching_file, TAG_FILE_VERSION, L"1.0.0.0");
754
755 if (num == 0 || num == 3)
756 {
757 match_qw_attr(pdb, matching_file, TAG_UPTO_BIN_PRODUCT_VERSION, 0x1000000000001);
758 match_qw_attr(pdb, matching_file, TAG_UPTO_BIN_FILE_VERSION, 0x1000000000000);
759 }
760 if (num == 1 || num == 3)
761 {
762 match_dw_attr(pdb, matching_file, TAG_PE_CHECKSUM, 0xbaad);
763 }
764 if (num != 0)
765 {
766 match_qw_attr(pdb, matching_file, TAG_BIN_PRODUCT_VERSION, 0x1000000000001);
767 match_qw_attr(pdb, matching_file, TAG_BIN_FILE_VERSION, 0x1000000000000);
768 }
769 if (num == 3)
770 {
771 match_dw_attr(pdb, matching_file, TAG_SIZE, 0x800);
772 match_dw_attr(pdb, matching_file, TAG_CHECKSUM, 0x178bd629);
773 match_strw_attr(pdb, matching_file, TAG_FILE_DESCRIPTION, L"FileDescription");
774 match_dw_attr(pdb, matching_file, TAG_MODULE_TYPE, 3);
775 match_dw_attr(pdb, matching_file, TAG_VERFILEOS, 4);
776 match_dw_attr(pdb, matching_file, TAG_VERFILETYPE, 1);
777 match_dw_attr(pdb, matching_file, TAG_LINKER_VERSION, 0x40002);
778 match_strw_attr(pdb, matching_file, TAG_ORIGINAL_FILENAME, L"OriginalFilename");
779 match_strw_attr(pdb, matching_file, TAG_INTERNAL_NAME, L"InternalName");
780 match_strw_attr(pdb, matching_file, TAG_LEGAL_COPYRIGHT, L"LegalCopyright");
781 match_dw_attr(pdb, matching_file, TAG_LINK_DATE, 0x12345);
782 match_dw_attr(pdb, matching_file, TAG_UPTO_LINK_DATE, 0x12345);
783 }
784 if (num > 3)
785 {
786 ok(0, "unknown case: %d\n", num);
787 }
788 matching_file = pSdbFindNextTag(pdb, exe, matching_file);
789 if (num == 2)
790 {
791 ok(matching_file != TAGID_NULL, "Did expect a secondary match on %d\n", num);
792 match_strw_attr(pdb, matching_file, TAG_NAME, L"test_checkfile.txt");
793 match_dw_attr(pdb, matching_file, TAG_SIZE, 0x4);
794 match_dw_attr(pdb, matching_file, TAG_CHECKSUM, 0xb0b0b0b0);
795 }
796 else
797 {
798 ok(matching_file == TAGID_NULL, "Did not expect a secondary match on %d\n", num);
799 }
800}
#define TAG_UPTO_BIN_FILE_VERSION
Definition: db.cpp:82
#define TAG_ORIGINAL_FILENAME
Definition: db.cpp:109
#define TAG_LINKER_VERSION
Definition: db.cpp:70
#define TAG_UPTO_LINK_DATE
Definition: db.cpp:72
#define TAG_SIZE
Definition: db.cpp:60
#define TAG_FILE_DESCRIPTION
Definition: db.cpp:107
#define TAG_VERFILETYPE
Definition: db.cpp:64
#define TAG_BIN_FILE_VERSION
Definition: db.cpp:79
#define TAG_VERFILEOS
Definition: db.cpp:63
#define TAG_UPTO_BIN_PRODUCT_VERSION
Definition: db.cpp:81
#define TAG_FILE_VERSION
Definition: db.cpp:108
#define TAG_LEGAL_COPYRIGHT
Definition: db.cpp:111
#define TAG_PRODUCT_NAME
Definition: db.cpp:105
#define TAG_CHECKSUM
Definition: db.cpp:61
#define TAG_PE_CHECKSUM
Definition: db.cpp:65
#define TAG_COMPANY_NAME
Definition: db.cpp:103
#define TAG_LINK_DATE
Definition: db.cpp:71
#define TAG_BIN_PRODUCT_VERSION
Definition: db.cpp:80
#define TAG_INTERNAL_NAME
Definition: db.cpp:110
#define TAG_MODULE_TYPE
Definition: db.cpp:62
#define TAG_PRODUCT_VERSION
Definition: db.cpp:106

Referenced by check_db_exes().

◆ check_matching_layer()

static void check_matching_layer ( PDB  pdb,
TAGID  layer,
int  num 
)
static

Definition at line 853 of file db.cpp.

854{
855 if (num == 2)
856 {
858 match_strw_attr(pdb, layer, TAG_NAME, L"TestNewMode");
859 }
860 else
861 {
862 TAGID layer_tagid = pSdbFindFirstTag(pdb, layer, TAG_LAYER_TAGID);
863 ok(layer_tagid == TAGID_NULL, "expected not to find a layer tagid, got %x\n", layer_tagid);
864 match_strw_attr(pdb, layer, TAG_NAME, L"WinSrv03");
865 }
866}
#define TAG_LAYER_TAGID
Definition: db.cpp:69

Referenced by check_db_exes().

◆ DEFINE_GUID() [1/2]

DEFINE_GUID ( GUID_DATABASE_TEST  ,
0xe39b0eb0  ,
0x55db  ,
0x450b  ,
0x9b  ,
0xd4  ,
0xd2  ,
0x0c  ,
0x94  ,
0x84  ,
0x26  ,
0x0f   
)

◆ DEFINE_GUID() [2/2]

DEFINE_GUID ( GUID_MAIN_DATABASE  ,
0x11111111  ,
0x1111  ,
0x1111  ,
0x11  ,
0x11  ,
0x11  ,
0x11  ,
0x11  ,
0x11  ,
0x11  ,
0x11   
)

◆ DWORD()

static DWORD ( WINAPI pSdbReadDWORDTag)
static

◆ expect_indexA_imp()

static void expect_indexA_imp ( const char text,
LONGLONG  expected 
)
static

Definition at line 1945 of file db.cpp.

1946{
1947 static WCHAR wide_string[100] = { 0 };
1949 MultiByteToWideChar(CP_ACP, 0, text, -1, wide_string, 100);
1950
1951 result = pSdbMakeIndexKeyFromString(wide_string);
1952 winetest_ok(result == expected, "Expected %s to result in %s, was: %s\n", text, wine_dbgstr_longlong(expected), wine_dbgstr_longlong(result));
1953}
static LPCWSTR LPCWSTR LPCWSTR DWORD PSDBQUERYRESULT_VISTA result
Definition: db.cpp:170
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define MultiByteToWideChar
Definition: compat.h:110
const WCHAR * text
Definition: package.c:1794
BOOL expected
Definition: store.c:2063
void __winetest_cdecl winetest_ok(int condition, const char *msg,...)
int64_t LONGLONG
Definition: typedefs.h:68

◆ extract_resource()

static bool extract_resource ( const WCHAR Filename,
LPCWSTR  ResourceName 
)
static

Definition at line 1447 of file db.cpp.

1448{
1450 HRSRC hRsrc = FindResourceW(hMod, ResourceName, MAKEINTRESOURCEW(RT_RCDATA));
1451 ok(!!hRsrc, "Unable to find %s\n", wine_dbgstr_w(ResourceName));
1452 if (!hRsrc)
1453 return false;
1454
1455 HGLOBAL hGlobal = LoadResource(hMod, hRsrc);
1456 DWORD Size = SizeofResource(hMod, hRsrc);
1457 LPVOID pData = LockResource(hGlobal);
1458
1459 ok(Size && !!pData, "Unable to load %s\n", wine_dbgstr_w(ResourceName));
1460 if (!Size || !pData)
1461 return false;
1462
1463 BOOL Written = write_raw_file(Filename, pData, Size);
1465 return Written;
1466}
static BOOL write_raw_file(const WCHAR *FileName, const void *Data, DWORD Size)
Definition: db.cpp:1429
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
HRSRC WINAPI FindResourceW(HINSTANCE hModule, LPCWSTR name, LPCWSTR type)
Definition: res.c:176
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:568
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
IN PVCB IN PBCB OUT PDIRENT IN USHORT IN POEM_STRING Filename
Definition: fatprocs.h:940
unsigned long DWORD
Definition: ntddk_ex.h:95
#define wine_dbgstr_w
Definition: kernel32.h:34
#define RT_RCDATA
Definition: pedump.c:372
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
#define UnlockResource(handle)
Definition: winbase.h:3397
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

Referenced by START_TEST(), test_Data(), and test_MatchApplicationsEx().

◆ HSDB()

static HSDB ( WINAPI pSdbInitDatabase)
static

◆ LONGLONG()

static LONGLONG ( WINAPI pSdbMakeIndexKeyFromString)
static

◆ LPCWSTR()

static LPCWSTR ( WINAPI pSdbTagToString)
static

◆ LPWSTR()

static LPWSTR ( WINAPI pSdbGetStringTagPtr)
static

◆ match_dw_attr_imp()

static void match_dw_attr_imp ( PDB  pdb,
TAGID  parent,
TAG  find,
DWORD  compare 
)
static

Definition at line 630 of file db.cpp.

631{
632 TAGID attr = pSdbFindFirstTag(pdb, parent, find);
633 winetest_ok(attr != TAG_NULL, "Could not find: %x\n", find);
634 if (attr != TAG_NULL)
635 {
636 DWORD val = pSdbReadDWORDTag(pdb, attr, 0x1234567);
637 winetest_ok(val == compare, "Expected tagid %x to be 0x%x, was 0x%x\n", attr, compare, val);
638 }
639}
#define TAG_NULL
Definition: db.cpp:54
static TAGID TAGID find
Definition: db.cpp:155
r parent
Definition: btrfs.c:3010
GLuint GLfloat * val
Definition: glext.h:7180
Definition: cookie.c:202
Definition: bug.cpp:8

◆ match_guid_attr_imp()

static void match_guid_attr_imp ( PDB  pdb,
TAGID  parent,
TAG  find,
const GUID compare 
)
static

Definition at line 652 of file db.cpp.

653{
654 TAGID attr = pSdbFindFirstTag(pdb, parent, find);
655 winetest_ok(attr != TAG_NULL, "Could not find: %x\n", find);
656 if (attr != TAG_NULL)
657 {
658 GUID guid = { 0 };
659 BOOL result = pSdbReadBinaryTag(pdb, attr, (PBYTE)&guid, sizeof(guid));
660 winetest_ok(result, "expected pSdbReadBinaryTag not to fail.\n");
661 winetest_ok(IsEqualGUID(guid, *compare), "expected guids to be equal(%s:%s)\n", wine_dbgstr_guid(&guid), wine_dbgstr_guid(compare));
662 }
663}

◆ match_qw_attr_imp()

static void match_qw_attr_imp ( PDB  pdb,
TAGID  parent,
TAG  find,
QWORD  compare 
)
static

Definition at line 641 of file db.cpp.

642{
643 TAGID attr = pSdbFindFirstTag(pdb, parent, find);
644 winetest_ok(attr != TAG_NULL, "Could not find: %x\n", find);
645 if (attr != TAG_NULL)
646 {
647 QWORD val = pSdbReadQWORDTag(pdb, attr, 0x123456789abcdef);
648 winetest_ok(val == compare, "Expected tagid %x to be 0x%I64x, was 0x%I64x\n", attr, compare, val);
649 }
650}
UINT64 QWORD
Definition: shimdbg.c:104

◆ match_strw_attr_imp()

static void match_strw_attr_imp ( PDB  pdb,
TAGID  parent,
TAG  find,
const WCHAR compare 
)
static

Definition at line 615 of file db.cpp.

616{
617 TAGID attr = pSdbFindFirstTag(pdb, parent, find);
618 winetest_ok(attr != TAG_NULL, "Could not find: %x\n", find);
619 if (attr != TAG_NULL)
620 {
621 LPWSTR name = pSdbGetStringTagPtr(pdb, attr);
622 winetest_ok(name != NULL, "Could not convert attr to str.\n");
623 if (name)
624 {
625 winetest_ok(wcscmp(name, compare) == 0, "Expected tagid %x to be %s, was %s\n", attr, wine_dbgstr_w(compare), wine_dbgstr_w(name));
626 }
627 }
628}
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ PDB()

static PDB ( WINAPI pSdbOpenDatabase)
static

◆ PVOID()

static PVOID ( WINAPI pSdbGetBinaryTagData)
static

◆ QWORD()

static QWORD ( WINAPI pSdbReadQWORDTag)
static

◆ START_TEST()

START_TEST ( db  )

Definition at line 2070 of file db.cpp.

2071{
2072 //SetEnvironmentVariableA("SHIM_DEBUG_LEVEL", "4");
2073 //SetEnvironmentVariableA("SHIMENG_DEBUG_LEVEL", "4");
2074 //SetEnvironmentVariableA("DEBUGCHANNEL", "+apphelp");
2075
2077 hdll = LoadLibraryA("apphelp.dll");
2078
2079 /* We detect the apphelp version that is loaded, instead of the os we are running on.
2080 This allows for easier testing multiple versions of the dll */
2082 trace("Apphelp version: 0x%x\n", g_WinVersion);
2083
2084 *(void**)&pSdbTagToString = (void *)GetProcAddress(hdll, "SdbTagToString");
2085 *(void**)&pSdbOpenDatabase = (void *)GetProcAddress(hdll, "SdbOpenDatabase");
2086 *(void**)&pSdbCreateDatabase = (void *)GetProcAddress(hdll, "SdbCreateDatabase");
2087 *(void**)&pSdbGetDatabaseVersion = (void *)GetProcAddress(hdll, "SdbGetDatabaseVersion");
2088 *(void**)&pSdbCloseDatabase = (void *)GetProcAddress(hdll, "SdbCloseDatabase");
2089 *(void**)&pSdbCloseDatabaseWrite = (void *)GetProcAddress(hdll, "SdbCloseDatabaseWrite");
2090 *(void**)&pSdbGetTagFromTagID = (void *)GetProcAddress(hdll, "SdbGetTagFromTagID");
2091 *(void**)&pSdbWriteNULLTag = (void *)GetProcAddress(hdll, "SdbWriteNULLTag");
2092 *(void**)&pSdbWriteWORDTag = (void *)GetProcAddress(hdll, "SdbWriteWORDTag");
2093 *(void**)&pSdbWriteDWORDTag = (void *)GetProcAddress(hdll, "SdbWriteDWORDTag");
2094 *(void**)&pSdbWriteQWORDTag = (void *)GetProcAddress(hdll, "SdbWriteQWORDTag");
2095 *(void**)&pSdbWriteBinaryTagFromFile = (void *)GetProcAddress(hdll, "SdbWriteBinaryTagFromFile");
2096 *(void**)&pSdbWriteStringTag = (void *)GetProcAddress(hdll, "SdbWriteStringTag");
2097 *(void**)&pSdbWriteStringRefTag = (void *)GetProcAddress(hdll, "SdbWriteStringRefTag");
2098 *(void**)&pSdbBeginWriteListTag = (void *)GetProcAddress(hdll, "SdbBeginWriteListTag");
2099 *(void**)&pSdbEndWriteListTag = (void *)GetProcAddress(hdll, "SdbEndWriteListTag");
2100 *(void**)&pSdbFindFirstTag = (void *)GetProcAddress(hdll, "SdbFindFirstTag");
2101 *(void**)&pSdbFindNextTag = (void *)GetProcAddress(hdll, "SdbFindNextTag");
2102 *(void**)&pSdbFindFirstNamedTag = (void *)GetProcAddress(hdll, "SdbFindFirstNamedTag");
2103 *(void**)&pSdbReadWORDTag = (void *)GetProcAddress(hdll, "SdbReadWORDTag");
2104 *(void**)&pSdbReadDWORDTag = (void *)GetProcAddress(hdll, "SdbReadDWORDTag");
2105 *(void**)&pSdbReadQWORDTag = (void *)GetProcAddress(hdll, "SdbReadQWORDTag");
2106 *(void**)&pSdbReadBinaryTag = (void *)GetProcAddress(hdll, "SdbReadBinaryTag");
2107 *(void**)&pSdbReadStringTag = (void *)GetProcAddress(hdll, "SdbReadStringTag");
2108 *(void**)&pSdbGetTagDataSize = (void *)GetProcAddress(hdll, "SdbGetTagDataSize");
2109 *(void**)&pSdbGetBinaryTagData = (void *)GetProcAddress(hdll, "SdbGetBinaryTagData");
2110 *(void**)&pSdbGetStringTagPtr = (void *)GetProcAddress(hdll, "SdbGetStringTagPtr");
2111 *(void**)&pSdbGetFirstChild = (void *)GetProcAddress(hdll, "SdbGetFirstChild");
2112 *(void**)&pSdbGetNextChild = (void *)GetProcAddress(hdll, "SdbGetNextChild");
2113 *(void**)&pSdbGetDatabaseID = (void *)GetProcAddress(hdll, "SdbGetDatabaseID");
2114 *(void**)&pSdbGUIDToString = (void *)GetProcAddress(hdll, "SdbGUIDToString");
2115 *(void**)&pSdbInitDatabase = (void *)GetProcAddress(hdll, "SdbInitDatabase");
2116 *(void**)&pSdbReleaseDatabase = (void *)GetProcAddress(hdll, "SdbReleaseDatabase");
2117 *(void**)&pSdbGetMatchingExe = (void *)GetProcAddress(hdll, "SdbGetMatchingExe");
2118 *(void**)&pSdbTagRefToTagID = (void *)GetProcAddress(hdll, "SdbTagRefToTagID");
2119 *(void**)&pSdbTagIDToTagRef = (void *)GetProcAddress(hdll, "SdbTagIDToTagRef");
2120 *(void**)&pSdbMakeIndexKeyFromString = (void *)GetProcAddress(hdll, "SdbMakeIndexKeyFromString");
2121 *(void**)&pSdbQueryData = (void *)GetProcAddress(hdll, "SdbQueryData");
2122 *(void**)&pSdbQueryDataEx = (void *)GetProcAddress(hdll, "SdbQueryDataEx");
2123 *(void**)&pSdbQueryDataExTagID = (void *)GetProcAddress(hdll, "SdbQueryDataExTagID");
2124 *(void**)&pSdbGetLayerTagRef = (void *)GetProcAddress(hdll, "SdbGetLayerTagRef");
2125 *(void**)&pSdbGetDatabaseInformation = (void *)GetProcAddress(hdll, "SdbGetDatabaseInformation");
2126 *(void**)&pSdbFreeDatabaseInformation = (void *)GetProcAddress(hdll, "SdbFreeDatabaseInformation");
2127
2128 test_Sdb();
2129 test_write_ex();
2133 {
2134 case 1:
2135 test_MatchApplications<SDBQUERYRESULT_2k3>();
2136 test_MatchApplicationsEx<SDBQUERYRESULT_2k3>();
2137 break;
2138 case 2:
2139 test_MatchApplications<SDBQUERYRESULT_VISTA>();
2140 test_MatchApplicationsEx<SDBQUERYRESULT_VISTA>();
2141 break;
2142 default:
2143 skip("Skipping tests with SDBQUERYRESULT due to a wrong size reported\n");
2144 break;
2145 }
2146 test_TagRef();
2147 test_Data();
2148 skip("test_SecondaryDB()\n");
2150}
DWORD get_module_version(HMODULE mod)
Definition: data.c:811
void silence_debug_output(void)
Definition: data.c:841
DWORD g_WinVersion
Definition: data.c:795
#define trace
Definition: atltest.h:70
#define skip(...)
Definition: atltest.h:64
static HMODULE hdll
Definition: db.cpp:136
static void test_IndexKeyFromString(void)
Definition: db.cpp:1957
static int validate_SDBQUERYRESULT_size()
Definition: db.cpp:2031
static void test_Sdb(void)
Definition: db.cpp:246
static void test_CheckDatabaseManually(void)
Definition: db.cpp:1097
static void test_TagRef(void)
Definition: db.cpp:1581
static void test_write_ex(void)
Definition: db.cpp:407
static void test_Data(void)
Definition: db.cpp:1901
static void test_stringtable()
Definition: db.cpp:533
#define GetProcAddress(x, y)
Definition: compat.h:753
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111

◆ TAG()

static TAG ( WINAPI pSdbGetTagFromTagID)
static

◆ TAGID()

static TAGID ( WINAPI pSdbBeginWriteListTag)
static

◆ TAGREF()

static TAGREF ( WINAPI pSdbGetLayerTagRef)
static

◆ test_CheckDatabaseManually()

static void test_CheckDatabaseManually ( void  )
static

Definition at line 1097 of file db.cpp.

1098{
1099 static const WCHAR path[] = {'t','e','s','t','_','d','b','.','s','d','b',0};
1100 TAGID root;
1101 PDB pdb;
1102 BOOL ret;
1103 DWORD ver_hi, ver_lo;
1104
1105 test_create_db(L"test_db.sdb", g_WinVersion >= WINVER_WIN10);
1106
1107 /* both ver_hi and ver_lo cannot be null, it'll crash. */
1108 ver_hi = ver_lo = 0x12345678;
1109 ret = pSdbGetDatabaseVersion(path, &ver_hi, &ver_lo);
1110 ok(ret, "Expected SdbGetDatabaseVersion to succeed\n");
1112 {
1113 ok(ver_hi == 3, "Expected ver_hi to be 3, was: %d\n", ver_hi);
1114 ok(ver_lo == 0, "Expected ver_lo to be 0, was: %d\n", ver_lo);
1115 }
1116 else
1117 {
1118 ok(ver_hi == 2, "Expected ver_hi to be 2, was: %d\n", ver_hi);
1119 ok(ver_lo == 1, "Expected ver_lo to be 1, was: %d\n", ver_lo);
1120 }
1121
1122 ver_hi = ver_lo = 0x12345678;
1123 ret = pSdbGetDatabaseVersion(NULL, &ver_hi, &ver_lo);
1125 {
1126 ok(!ret, "Expected SdbGetDatabaseVersion to fail\n");
1127 ok(ver_hi == 0, "Expected ver_hi to be 0, was: 0x%x\n", ver_hi);
1128 ok(ver_lo == 0, "Expected ver_lo to be 0, was: 0x%x\n", ver_lo);
1129 }
1130 else
1131 {
1132 ok(ret, "Expected SdbGetDatabaseVersion to succeed\n");
1133 ok(ver_hi == 0x12345678, "Expected ver_hi to be 0x12345678, was: 0x%x\n", ver_hi);
1134 ok(ver_lo == 0x12345678, "Expected ver_lo to be 0x12345678, was: 0x%x\n", ver_lo);
1135 }
1136
1137 ver_hi = ver_lo = 0x12345678;
1138 ret = pSdbGetDatabaseVersion(path + 1, &ver_hi, &ver_lo);
1140 {
1141 ok(!ret, "Expected SdbGetDatabaseVersion to fail\n");
1142 ok(ver_hi == 0, "Expected ver_hi to be 0, was: 0x%x\n", ver_hi);
1143 ok(ver_lo == 0, "Expected ver_lo to be 0, was: 0x%x\n", ver_lo);
1144 }
1145 else
1146 {
1147 ok(ret, "Expected SdbGetDatabaseVersion to succeed\n");
1148 ok(ver_hi == 0x12345678, "Expected ver_hi to be 0x12345678, was: 0x%x\n", ver_hi);
1149 ok(ver_lo == 0x12345678, "Expected ver_lo to be 0x12345678, was: 0x%x\n", ver_lo);
1150 }
1151
1152 pdb = pSdbOpenDatabase(path, DOS_PATH);
1153 ok(pdb != NULL, "unexpected NULL handle\n");
1154
1155 root = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
1156 ok(root != TAGID_NULL, "expected to find a root tag\n");
1157 if (root != TAGID_NULL)
1158 {
1159 TAGID tagLayer = pSdbFindFirstTag(pdb, root, TAG_LAYER);
1160 TAGID tagAlt = pSdbFindFirstNamedTag(pdb, root, TAG_LAYER, TAG_NAME, L"TestNewMode");
1161 TAGID tagAlt2 = pSdbFindFirstNamedTag(pdb, root, TAG_LAYER, TAG_NAME, L"TESTNEWMODE");
1162 TAGID tagAlt3 = pSdbFindFirstNamedTag(pdb, root, TAG_LAYER, TAG_NAME, L"testnewmode");
1163 ok_hex(tagLayer, (int)tagAlt);
1164 ok_hex(tagLayer, (int)tagAlt2);
1165 ok_hex(tagLayer, (int)tagAlt3);
1167 check_db_layer(pdb, tagLayer);
1170 }
1172
1173 pSdbCloseDatabase(pdb);
1174 DeleteFileA("test_db.sdb");
1175}
#define WINVER_WIN10
#define test_create_db
static void check_db_apphelp(PDB pdb, TAGID root)
Definition: db.cpp:1015
static void test_GetDatabaseInformation(PDB pdb)
Definition: db.cpp:1040
static TAGID root
Definition: db.cpp:155
#define DOS_PATH
Definition: db.cpp:32
#define TAGID_ROOT
Definition: db.cpp:39
static void check_db_properties(PDB pdb, TAGID root)
Definition: db.cpp:674
static void check_db_layer(PDB pdb, TAGID layer)
Definition: db.cpp:704
static void check_db_exes(PDB pdb, TAGID root)
Definition: db.cpp:949
#define TAG_DATABASE
Definition: db.cpp:85
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
int ret

Referenced by START_TEST().

◆ test_Data()

static void test_Data ( void  )
static

Definition at line 1901 of file db.cpp.

1902{
1903 WCHAR workdir[MAX_PATH], dbpath[MAX_PATH];
1904 BOOL ret;
1905 HSDB hsdb;
1906
1908 ok(ret, "GetTempPathW error: %d\n", GetLastError());
1909 lstrcatW(workdir, L"apphelp_test");
1910
1912 ok(ret, "CreateDirectoryW error: %d\n", GetLastError());
1913
1914 /* SdbInitDatabase needs an nt-path */
1915 swprintf(dbpath, L"\\??\\%s\\test.sdb", workdir);
1916
1917 if (extract_resource(dbpath + 4, MAKEINTRESOURCEW(101)))
1918 {
1919 hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1920
1921 ok(hsdb != NULL, "Expected a valid database handle\n");
1922
1923 if (!hsdb)
1924 {
1925 skip("SdbInitDatabase not implemented?\n");
1926 }
1927 else
1928 {
1929 test_DataTags(hsdb);
1930 pSdbReleaseDatabase(hsdb);
1931 }
1932 }
1933 else
1934 {
1935 ok(0, "Unable to extract database\n");
1936 }
1937
1938 DeleteFileW(dbpath + 4);
1939
1941 ok(ret, "RemoveDirectoryW error: %d\n", GetLastError());
1942}
static bool extract_resource(const WCHAR *Filename, LPCWSTR ResourceName)
Definition: db.cpp:1447
#define HID_DATABASE_FULLPATH
Definition: db.cpp:33
static void test_DataTags(HSDB hsdb)
Definition: db.cpp:1722
#define MAX_PATH
Definition: compat.h:34
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:90
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
Definition: dir.c:732
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2080
#define swprintf
Definition: precomp.h:40
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
static char workdir[MAX_PATH]
Definition: batch.c:26
Definition: apphelp.h:30
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by START_TEST().

◆ test_DataTags()

static void test_DataTags ( HSDB  hsdb)
static

Definition at line 1722 of file db.cpp.

1723{
1724 PDB pdb = NULL;
1725 TAGID db = TAGID_NULL, layer, exe;
1726 TAGREF trData;
1727 BYTE Buffer[1024];
1728 DWORD dwBufferSize, dwDataType, dwRet;
1729 TAGID tiData;
1730
1731 BOOL ret = pSdbTagRefToTagID(hsdb, TAGID_ROOT, &pdb, NULL);
1732
1733 ok(ret != FALSE, "Expected ret to be TRUE, was: %d\n", ret);
1734 ok(pdb != NULL, "Expected pdb to be valid\n");
1735
1736 if (pdb == NULL)
1737 {
1738 skip("Cannot run tests without pdb\n");
1739 return;
1740 }
1741
1742 db = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
1743 ok(db != NULL, "Expected db to be valid\n");
1744 if (db == TAGID_NULL)
1745 {
1746 skip("Cannot run tests without db\n");
1747 return;
1748 }
1749
1750 layer = pSdbFindFirstNamedTag(pdb, db, TAG_LAYER, TAG_NAME, L"DATA_LAYER");
1751 ok(layer != NULL, "Expected layer to be valid\n");
1752 if (layer == TAGID_NULL)
1753 {
1754 skip("Cannot run tests without layer\n");
1755 return;
1756 }
1757
1758 memset(Buffer, 0xaa, sizeof(Buffer));
1759 dwBufferSize = sizeof(Buffer);
1760 dwDataType = 0x12345;
1761 tiData = 0x111111;
1762 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &tiData);
1763 ok_hex(dwRet, ERROR_SUCCESS);
1764 ok_hex(dwDataType, REG_DWORD);
1765 ok_hex(dwBufferSize, sizeof(DWORD));
1766 ok_hex(*(DWORD*)Buffer, 3333);
1767 ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1768 ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1769
1770 memset(Buffer, 0xaa, sizeof(Buffer));
1771 dwBufferSize = sizeof(Buffer);
1772 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1773 ok_hex(dwRet, ERROR_SUCCESS);
1774 ok_hex(dwBufferSize, sizeof(DWORD));
1775 ok_hex(*(DWORD*)Buffer, 3333);
1776
1778 {
1779 memset(Buffer, 0xaa, sizeof(Buffer));
1780 dwBufferSize = sizeof(Buffer);
1781 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, NULL, NULL);
1783 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1784 }
1785
1786 memset(Buffer, 0xaa, sizeof(Buffer));
1787 dwBufferSize = 1;
1788 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1790 ok_hex(dwBufferSize, sizeof(DWORD));
1791 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1792
1793 memset(Buffer, 0xaa, sizeof(Buffer));
1794 dwBufferSize = sizeof(Buffer);
1795 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, NULL, &dwBufferSize, NULL);
1797 ok_hex(dwBufferSize, sizeof(DWORD));
1798 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1799
1800 memset(Buffer, 0xaa, sizeof(Buffer));
1801 dwBufferSize = sizeof(Buffer);
1802 dwRet = pSdbQueryDataExTagID(pdb, TAGID_NULL, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1803 ok_hex(dwRet, ERROR_NOT_FOUND);
1804 ok_hex(dwBufferSize, sizeof(Buffer));
1805 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1806
1807 memset(Buffer, 0xaa, sizeof(Buffer));
1808 dwBufferSize = sizeof(Buffer);
1809 dwDataType = 0x12345;
1810 tiData = 0x111111;
1811 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA2", &dwDataType, Buffer, &dwBufferSize, &tiData);
1812 ok_hex(dwRet, ERROR_SUCCESS);
1813 ok_hex(dwDataType, REG_QWORD);
1814 ok_hex(dwBufferSize, sizeof(QWORD));
1815 ok(*(QWORD*)Buffer == 4294967295ull, "unexpected value 0x%I64x, expected 4294967295\n", *(QWORD*)Buffer);
1816 ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1817 ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1818
1819 /* Not case sensitive */
1820 memset(Buffer, 0xaa, sizeof(Buffer));
1821 dwBufferSize = sizeof(Buffer);
1822 dwDataType = 0x12345;
1823 tiData = 0x111111;
1824 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA3", &dwDataType, Buffer, &dwBufferSize, &tiData);
1825 ok_hex(dwRet, ERROR_SUCCESS);
1826 ok_hex(dwDataType, REG_SZ);
1827 ok_hex(dwBufferSize, (int)((wcslen(L"Test string")+1) * sizeof(WCHAR)));
1828 Buffer[_countof(Buffer)-1] = L'\0';
1829 ok_wstr(((WCHAR*)Buffer), L"Test string");
1830 ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1831 ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1832
1833 /* Show that SdbQueryDataEx behaves the same */
1834 memset(Buffer, 0xaa, sizeof(Buffer));
1835 dwBufferSize = sizeof(Buffer);
1836 dwDataType = 0x12345;
1837 trData = 0x111111;
1838 dwRet = pSdbQueryDataEx(hsdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &trData);
1839 ok_hex(dwRet, ERROR_SUCCESS);
1840 ok_hex(dwDataType, REG_DWORD);
1841 ok_hex(dwBufferSize, sizeof(DWORD));
1842 ok_hex(*(DWORD*)Buffer, 3333);
1843 ok(trData != NULL && trData != 0x111111, "Expected trData, got NULL\n");
1844
1845 /* And SdbQueryData as well */
1846 memset(Buffer, 0xaa, sizeof(Buffer));
1847 dwBufferSize = sizeof(Buffer);
1848 dwDataType = 0x12345;
1849 dwRet = pSdbQueryData(hsdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize);
1850 ok_hex(dwRet, ERROR_SUCCESS);
1851 ok_hex(dwDataType, REG_DWORD);
1852 ok_hex(dwBufferSize, sizeof(DWORD));
1853 ok_hex(*(DWORD*)Buffer, 3333);
1854
1855 exe = pSdbFindFirstNamedTag(pdb, db, TAG_EXE, TAG_NAME, L"test_match0.exe");
1856 ok(exe != NULL, "Expected exe to be valid\n");
1857 if (exe == TAGID_NULL)
1858 {
1859 skip("Cannot run tests without exe\n");
1860 return;
1861 }
1862
1863 memset(Buffer, 0xaa, sizeof(Buffer));
1864 dwBufferSize = sizeof(Buffer);
1865 dwDataType = 0x12345;
1866 tiData = 0x111111;
1867 dwRet = pSdbQueryDataExTagID(pdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &tiData);
1868 ok_hex(dwRet, ERROR_NOT_FOUND);
1869 ok_hex(dwDataType, 0x12345);
1870 ok_hex(dwBufferSize, sizeof(Buffer));
1871 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1872 ok(tiData == 0x111111, "Expected 0x111111, got 0x%x\n", tiData);
1873
1874 /* Show that SdbQueryDataEx behaves the same */
1875 memset(Buffer, 0xaa, sizeof(Buffer));
1876 dwBufferSize = sizeof(Buffer);
1877 dwDataType = 0x12345;
1878 trData = 0x111111;
1879 dwRet = pSdbQueryDataEx(hsdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &trData);
1880 ok_hex(dwRet, ERROR_NOT_FOUND);
1881 ok_hex(dwDataType, 0x12345);
1882 ok_hex(dwBufferSize, sizeof(Buffer));
1883 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1885 ok(trData == 0, "Expected 0, got 0x%x\n", trData);
1886 else
1887 ok(trData == 0x111111, "Expected 0x111111, got 0x%x\n", trData);
1888
1889 /* And SdbQueryData as well */
1890 memset(Buffer, 0xaa, sizeof(Buffer));
1891 dwBufferSize = sizeof(Buffer);
1892 dwDataType = 0x12345;
1893 dwRet = pSdbQueryData(hsdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize);
1894 ok_hex(dwRet, ERROR_NOT_FOUND);
1895 ok_hex(dwDataType, 0x12345);
1896 ok_hex(dwBufferSize, sizeof(Buffer));
1897 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1898}
DWORD TAGREF
#define ok_wstr(x, y)
Definition: atltest.h:130
Definition: bufpool.h:45
#define TAG_DATA
Definition: db.cpp:93
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define ERROR_SUCCESS
Definition: deptool.c:10
#define FALSE
Definition: types.h:117
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define REG_SZ
Definition: layer.c:22
#define REG_QWORD
Definition: sdbapi.c:597
#define REG_DWORD
Definition: sdbapi.c:596
#define memset(x, y, z)
Definition: compat.h:39
#define _WIN32_WINNT_WS03
Definition: sdkddkver.h:23
#define ERROR_NOT_FOUND
Definition: winerror.h:690
unsigned char BYTE
Definition: xxhash.c:193

Referenced by test_Data().

◆ test_GetDatabaseInformation()

static void test_GetDatabaseInformation ( PDB  pdb)
static

Definition at line 1040 of file db.cpp.

1041{
1042 PDB_INFORMATION pInfo;
1043 BOOL fResult;
1044
1045 if (!pSdbGetDatabaseInformation || !pSdbFreeDatabaseInformation)
1046 {
1047 skip("GetDatabaseInformation or SdbFreeDatabaseInformation not found\n");
1048 return;
1049 }
1050
1051 _SEH2_TRY
1052 {
1053 pSdbFreeDatabaseInformation(NULL);
1054 }
1056 {
1057 ok(0, "SdbFreeDatabaseInformation did not handle a NULL pointer very gracefully.\n");
1058 }
1059 _SEH2_END;
1060
1061
1062 pInfo = (PDB_INFORMATION)malloc(sizeof(*pInfo) * 4);
1063 memset(pInfo, 0xDE, sizeof(*pInfo) * 2);
1064
1065 fResult = pSdbGetDatabaseInformation(pdb, pInfo);
1066 ok(fResult, "SdbGetDatabaseInformation failed\n");
1067 if (fResult)
1068 {
1069 ok_int(pInfo->dwSomething, 1);
1070 ok(IsEqualGUID(GUID_DATABASE_TEST, pInfo->Id), "expected guids to be equal(%s:%s)\n",
1071 wine_dbgstr_guid(&GUID_DATABASE_TEST), wine_dbgstr_guid(&pInfo->Id));
1072 ok(wcscmp(pInfo->Description, L"apphelp_test1") == 0,
1073 "Expected pInfo->Description to be 'apphelp_test1', was %s\n", wine_dbgstr_w(pInfo->Description));
1074
1075 /* Struct is slightly bigger on some Win10, and the DB version nr is different on all */
1077 {
1078 ok(pInfo->dwMajor == 3, "Expected pInfo->dwMajor to be 3, was: %d\n", pInfo->dwMajor);
1079 ok(pInfo->dwMinor == 0, "Expected pInfo->dwMinor to be 0, was: %d\n", pInfo->dwMinor);
1080
1081 ok(pInfo[1].dwSomething == 4 || pInfo[1].dwSomething == 0xdededede, "Something amiss: 0x%x\n", pInfo[1].dwSomething);
1082 ok(pInfo[1].dwMajor == 0xdededede, "Cookie2 corrupt: 0x%x\n", pInfo[1].dwMajor);
1083 }
1084 else
1085 {
1086 ok(pInfo->dwMajor == 2, "Expected pInfo->dwMajor to be 2, was: %d\n", pInfo->dwMajor);
1087 ok(pInfo->dwMinor == 1, "Expected pInfo->dwMinor to be 1, was: %d\n", pInfo->dwMinor);
1088
1089 ok(pInfo[1].dwSomething == 0xdededede, "Cookie1 corrupt: 0x%x\n", pInfo[1].dwSomething);
1090 ok(pInfo[1].dwMajor == 0xdededede, "Cookie2 corrupt: 0x%x\n", pInfo[1].dwMajor);
1091 }
1092
1093 }
1094 free(pInfo);
1095}
#define ok_int(expression, result)
Definition: atltest.h:134
struct _DB_INFORMATION * PDB_INFORMATION
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
#define _SEH2_END
Definition: pseh2_64.h:155
#define _SEH2_TRY
Definition: pseh2_64.h:55
DWORD dwSomething
Definition: db.cpp:127
DWORD dwMajor
Definition: apphelp.h:84
LPCWSTR Description
Definition: apphelp.h:86
DWORD dwMinor
Definition: apphelp.h:85

Referenced by test_CheckDatabaseManually().

◆ test_GetDatabaseInformationEmpty()

static void test_GetDatabaseInformationEmpty ( PDB  pdb)
static

Definition at line 191 of file db.cpp.

192{
193 PDB_INFORMATION pInfo;
194 BOOL fResult;
195
196 if (!pSdbGetDatabaseInformation || !pSdbFreeDatabaseInformation)
197 {
198 skip("GetDatabaseInformation or SdbFreeDatabaseInformation not found\n");
199 return;
200 }
201
202 pInfo = (PDB_INFORMATION)malloc(sizeof(*pInfo) * 4);
203 memset(pInfo, 0xDE, sizeof(*pInfo) * 2);
204
205 fResult = pSdbGetDatabaseInformation(pdb, pInfo);
206 ok(fResult, "SdbGetDatabaseInformation failed\n");
207 if (fResult)
208 {
209 ok_int(pInfo->dwSomething, 0);
210 ok(IsEqualGUID(GUID_NULL, pInfo->Id), "expected guid to be empty(%s)\n", wine_dbgstr_guid(&pInfo->Id));
211 ok(pInfo->Description == NULL, "Expected pInfo->Description to be NULL, was %s\n", wine_dbgstr_w(pInfo->Description));
212
213 /* Struct is slightly bigger on some Win10, and the DB version nr is different on all */
215 {
216 ok(pInfo->dwMajor == 3, "Expected pInfo->dwMajor to be 3, was: %d\n", pInfo->dwMajor);
217 ok(pInfo->dwMinor == 0, "Expected pInfo->dwMinor to be 0, was: %d\n", pInfo->dwMinor);
218
219 ok(pInfo[1].dwSomething == 0 || pInfo[1].dwSomething == 0xdededede, "Something amiss: 0x%x\n", pInfo[1].dwSomething);
220 ok(pInfo[1].dwMajor == 0xdededede, "Cookie2 corrupt: 0x%x\n", pInfo[1].dwMajor);
221 }
222 else
223 {
224 ok(pInfo->dwMajor == 2, "Expected pInfo->dwMajor to be 2, was: %d\n", pInfo->dwMajor);
226 {
227 ok(pInfo->dwMinor == 1, "Expected pInfo->dwMinor to be 1, was: %d\n", pInfo->dwMinor);
228 }
229 else
230 {
231 SYSTEMTIME si = {0};
232 GetSystemTime(&si);
233 DWORD dwExpect = ((DWORD)si.wYear - 2000) * 10000 + si.wMonth * 100 + si.wDay;
234 ok(pInfo->dwMinor == dwExpect, "Expected pInfo->dwMinor to be %d, was: %d\n", dwExpect, pInfo->dwMinor);
235 }
236
237 ok(pInfo[1].dwSomething == 0xdededede, "Cookie1 corrupt: 0x%x\n", pInfo[1].dwSomething);
238 ok(pInfo[1].dwMajor == 0xdededede, "Cookie2 corrupt: 0x%x\n", pInfo[1].dwMajor);
239 }
240
241 }
242 free(pInfo);
243}
static DWORD
Definition: db.cpp:146
VOID WINAPI GetSystemTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:327
#define GUID_NULL
Definition: ks.h:106
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
WORD wYear
Definition: winbase.h:930
WORD wMonth
Definition: winbase.h:931
WORD wDay
Definition: winbase.h:933

Referenced by test_Sdb().

◆ test_IndexKeyFromString()

static void test_IndexKeyFromString ( void  )
static

Definition at line 1957 of file db.cpp.

1958{
1959#if 0
1960 static WCHAR tmp[] = { 0xabba, 0xbcde, 0x2020, 0x20, 0x4444, 0 };
1961 static WCHAR tmp2[] = { 0xabba, 0xbcde, 0x20, 0x4444, 0 };
1962 static WCHAR tmp3[] = { 0x20, 0xbcde, 0x4041, 0x4444, 0 };
1963 static WCHAR tmp4[] = { 0x20, 0xbcde, 0x4041, 0x4444, 0x4444, 0 };
1964 static WCHAR tmp5[] = { 0x2020, 0xbcde, 0x4041, 0x4444, 0x4444, 0 };
1965 static WCHAR tmp6 [] = { 0x20, 0xbcde, 0x4041, 0x4444, 0x4444, 0x4444, 0};
1966 static WCHAR tmp7 [] = { 0xbcde, 0x4041, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0};
1967 static WCHAR tmp8 [] = { 0xbc00, 0x4041, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0};
1968#endif
1969
1970#if 0
1971 /* This crashes. */
1972 pSdbMakeIndexKeyFromString(NULL);
1973#endif
1974
1975 expect_indexA("", 0x0000000000000000);
1976 expect_indexA("a", 0x4100000000000000);
1977 expect_indexA("aa", 0x4141000000000000);
1978 expect_indexA("aaa", 0x4141410000000000);
1979 expect_indexA("aaaa", 0x4141414100000000);
1980 expect_indexA("aaaaa", 0x4141414141000000);
1981 expect_indexA("aaaaaa", 0x4141414141410000);
1982 expect_indexA("aaaaaaa", 0x4141414141414100);
1983 expect_indexA("aaaaaaaa", 0x4141414141414141);
1984 expect_indexA("aaa aaaaa", 0x4141412041414141);
1985 /* Does not change */
1986 expect_indexA("aaaaaaaaa", 0x4141414141414141);
1987 expect_indexA("aaaaaaaab", 0x4141414141414141);
1988 expect_indexA("aaaaaaaac", 0x4141414141414141);
1989 expect_indexA("aaaaaaaaF", 0x4141414141414141);
1990 /* Upcase */
1991 expect_indexA("AAAAAAAA", 0x4141414141414141);
1992 expect_indexA("ABABABAB", 0x4142414241424142);
1993 expect_indexA("ABABABABZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", 0x4142414241424142);
1994
1995#if 0
1996 /* These fail, but is that because the codepoints are too weird, or because the func is not correct? */
1997 result = pSdbMakeIndexKeyFromString(tmp);
1998 ok(result == 0xbaabdebc20200000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp),
1999 wine_dbgstr_longlong(0xbaabdebc20200000), wine_dbgstr_longlong(result));
2000
2001 result = pSdbMakeIndexKeyFromString(tmp2);
2002 ok(result == 0xbaabdebc00000000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp2),
2003 wine_dbgstr_longlong(0xbaabdebc00000000), wine_dbgstr_longlong(result));
2004
2005 result = pSdbMakeIndexKeyFromString(tmp3);
2006 ok(result == 0x20debc4140000000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp3),
2007 wine_dbgstr_longlong(0x20debc4140000000), wine_dbgstr_longlong(result));
2008
2009 result = pSdbMakeIndexKeyFromString(tmp4);
2010 ok(result == 0x20debc4140000000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp4),
2011 wine_dbgstr_longlong(0x20debc4140000000), wine_dbgstr_longlong(result));
2012
2013 result = pSdbMakeIndexKeyFromString(tmp5);
2014 ok(result == 0x2020debc41400000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp5),
2015 wine_dbgstr_longlong(0x2020debc41400000), wine_dbgstr_longlong(result));
2016
2017 result = pSdbMakeIndexKeyFromString(tmp6);
2018 ok(result == 0x20debc4140444400, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp6),
2019 wine_dbgstr_longlong(0x20debc4140444400), wine_dbgstr_longlong(result));
2020
2021 result = pSdbMakeIndexKeyFromString(tmp7);
2022 ok(result == 0xdebc414044444444, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp7),
2023 wine_dbgstr_longlong(0xdebc414044444444), wine_dbgstr_longlong(result));
2024
2025 result = pSdbMakeIndexKeyFromString(tmp8);
2026 ok(result == 0xbc414044444444, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp8),
2028#endif
2029}
#define expect_indexA
Definition: db.cpp:1955

Referenced by START_TEST().

◆ test_is_testdb()

static void test_is_testdb ( PDB  pdb)
static

Definition at line 1177 of file db.cpp.

1178{
1179 if (pdb)
1180 {
1181 GUID guid;
1182 memset(&guid, 0, sizeof(guid));
1183 ok(pSdbGetDatabaseID(pdb, &guid), "expected SdbGetDatabaseID not to fail.\n");
1184 ok(IsEqualGUID(guid, GUID_DATABASE_TEST), "Expected SdbGetDatabaseID to return the test db GUID, was: %s\n", wine_dbgstr_guid(&guid));
1185 }
1186 else
1187 {
1188 skip("Not checking DB GUID, received a null pdb\n");
1189 }
1190}

Referenced by test_mode_generic().

◆ test_match_ex()

template<typename SDBQUERYRESULT_T >
static void test_match_ex ( const WCHAR workdir,
HSDB  hsdb 
)
static

Definition at line 1469 of file db.cpp.

1470{
1472 PWCHAR Vendor, AppName, TestName;
1473 SDBQUERYRESULT_T query;
1474 TAGID dbtag, exetag, tagid;
1475 BOOL ret, Succeed;
1476 PDB pdb;
1477
1478 memset(&query, 0xab, sizeof(query));
1479
1480 ret = pSdbTagRefToTagID(hsdb, 0, &pdb, &tagid);
1481 ok(pdb != NULL && pdb != (PDB)0x12345678, "Expected pdb to be set to a valid pdb, was: %p\n", pdb);
1482
1483 dbtag = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
1484 ok(dbtag != TAGID_NULL, "Expected to get a valid TAG_DATABASE\n");
1485
1486 for (exetag = pSdbFindFirstTag(pdb, dbtag, TAG_EXE); exetag; exetag = pSdbFindNextTag(pdb, dbtag, exetag))
1487 {
1488 tagid = pSdbFindFirstTag(pdb, exetag, TAG_VENDOR);
1489 Vendor = pSdbGetStringTagPtr(pdb, tagid);
1490 if (!Vendor)
1491 continue;
1492 Succeed = !_wcsicmp(Vendor, L"Succeed");
1493 if (!Succeed && _wcsicmp(Vendor, L"Fail"))
1494 continue;
1495 tagid = pSdbFindFirstTag(pdb, exetag, TAG_APP_NAME);
1496 AppName = pSdbGetStringTagPtr(pdb, tagid);
1497 if (!AppName)
1498 continue;
1499
1500 tagid = pSdbFindFirstTag(pdb, exetag, TAG_NAME);
1501 TestName = pSdbGetStringTagPtr(pdb, tagid);
1502 if (!TestName)
1503 continue;
1504
1505 swprintf(exename, L"%s\\%s", workdir, AppName);
1507
1508 ret = pSdbGetMatchingExe(hsdb, exename, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)&query);
1509 DWORD exe_count = Succeed ? 1 : 0;
1510
1511 if (Succeed && !ret && g_WinVersion == _WIN32_WINNT_WS03)
1512 {
1513 skip("As long as we do not have indexes, we will hit a bug in W2k3\n");
1514#if 0
1515[Info][SdbGetIndex ] index 0x7007(0x600b) was not found in the index table
1516[Info][SdbGetIndex ] index 0x7007(0x6001) was not found in the index table
1517[Info][SdbpSearchDB ] Searching database with no index.
1518[Err ][SdbpSearchDB ] No DATABASE tag found.
1519#endif
1520 }
1521 else
1522 {
1523 if (Succeed)
1524 ok(ret, "SdbGetMatchingExe should not fail for %s.\n", wine_dbgstr_w(TestName));
1525 else
1526 ok(!ret, "SdbGetMatchingExe should not succeed for %s.\n", wine_dbgstr_w(TestName));
1527
1528 ok(query.dwExeCount == exe_count, "Expected dwExeCount to be %d, was %d for %s\n", exe_count, query.dwExeCount, wine_dbgstr_w(TestName));
1529 }
1531 }
1532}
#define test_create_exe
static CHAR AppName[MAX_PATH]
Definition: dem.c:252
static WCHAR no[MAX_STRING_RESOURCE_LEN]
Definition: object.c:2340
GLuint index
Definition: glext.h:6031
GLuint in
Definition: glext.h:9616
static char * exename
Definition: process.c:101
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
Definition: ecma_167.h:138
uint16_t * PWCHAR
Definition: typedefs.h:56
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690

◆ test_MatchApplications()

template<typename SDBQUERYRESULT_T >
static void test_MatchApplications ( void  )
static

Definition at line 1388 of file db.cpp.

1389{
1390 WCHAR workdir[MAX_PATH], dbpath[MAX_PATH];
1391 BOOL ret;
1392 HSDB hsdb;
1393
1395 ok(ret, "GetTempPathW error: %d\n", GetLastError());
1396 wcscat(workdir, L"apphelp_test");
1397
1399 ok(ret, "CreateDirectoryW error: %d\n", GetLastError());
1400
1401 /* SdbInitDatabase needs an nt-path */
1402 swprintf(dbpath, L"\\??\\%s\\test.sdb", workdir);
1403
1405
1406 hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1407
1408 ok(hsdb != NULL, "Expected a valid database handle\n");
1409
1410 if (!hsdb)
1411 {
1412 skip("SdbInitDatabase not implemented?\n");
1413 }
1414 else
1415 {
1416 /* now that our enviroment is setup, let's go ahead and run the actual tests.. */
1417 size_t n;
1418 for (n = 0; n < _countof(test_exedata); ++n)
1419 test_mode_generic<SDBQUERYRESULT_T>(workdir, hsdb, n);
1420 pSdbReleaseDatabase(hsdb);
1421 }
1422
1423 DeleteFileW(dbpath + 4);
1424
1426 ok(ret, "RemoveDirectoryW error: %d\n", GetLastError());
1427}
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)

◆ test_MatchApplicationsEx()

template<typename SDBQUERYRESULT_T >
static void test_MatchApplicationsEx ( void  )
static

Definition at line 1536 of file db.cpp.

1537{
1538 WCHAR workdir[MAX_PATH], dbpath[MAX_PATH];
1539 BOOL ret;
1540 HSDB hsdb;
1541
1543 ok(ret, "GetTempPathW error: %d\n", GetLastError());
1544 lstrcatW(workdir, L"apphelp_test");
1545
1547 ok(ret, "CreateDirectoryW error: %d\n", GetLastError());
1548
1549 /* SdbInitDatabase needs an nt-path */
1550 swprintf(dbpath, L"\\??\\%s\\test.sdb", workdir);
1551
1552 if (extract_resource(dbpath + 4, MAKEINTRESOURCEW(101)))
1553 {
1554 hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1555
1556 ok(hsdb != NULL, "Expected a valid database handle\n");
1557
1558 if (!hsdb)
1559 {
1560 skip("SdbInitDatabase not implemented?\n");
1561 }
1562 else
1563 {
1564 /* now that our enviroment is setup, let's go ahead and run the actual tests.. */
1565 test_match_ex<SDBQUERYRESULT_T>(workdir, hsdb);
1566 pSdbReleaseDatabase(hsdb);
1567 }
1568 }
1569 else
1570 {
1571 ok(0, "Unable to extract database\n");
1572 }
1573
1574 DeleteFileW(dbpath + 4);
1575
1577 ok(ret, "RemoveDirectoryW error: %d\n", GetLastError());
1578}

◆ test_mode_generic()

template<typename SDBQUERYRESULT_T >
static void test_mode_generic ( const WCHAR workdir,
HSDB  hsdb,
size_t  cur 
)
static

Definition at line 1208 of file db.cpp.

1209{
1210 WCHAR exename[MAX_PATH], testfile[MAX_PATH];
1211 BOOL ret;
1212 SDBQUERYRESULT_T query;
1213 PDB pdb;
1214 TAGID tagid;
1216 DWORD expect_flags = 0, adwExeFlags_0, exe_count;
1217 UNICODE_STRING exenameNT;
1218
1219 memset(&query, 0xab, sizeof(query));
1220
1223 swprintf(testfile, L"%s\\%s", workdir, test_exedata[cur].extra_file);
1225
1227 {
1228 /* First we try without the file at all. */
1229 DeleteFileW(testfile);
1230 ret = pSdbGetMatchingExe(hsdb, exename, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)&query);
1231 ok(ret == 0, "SdbGetMatchingExe should have failed for %d.\n", cur);
1232 /* Now re-try with the correct file */
1233 test_create_file(testfile, "aaaa", 4);
1234 }
1235
1236#if 0
1237 // Results seem to be cached based on filename, until we can invalidate this, do not test the same filename twice!
1239 // skip exports
1241 ret = pSdbGetMatchingExe(hsdb, exenameW, NULL, NULL, 0, &query);
1242 ok(ret == 0, "SdbGetMatchingExe should have failed for %d.\n", cur);
1243
1246#endif
1247
1249 {
1250 SetEnvironmentVariableA("__COMPAT_LAYER", test_exedata[cur].env_var);
1251 }
1252
1253 ret = pSdbGetMatchingExe(hsdb, exename, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)&query);
1254 ok(ret, "SdbGetMatchingExe should not fail for %d.\n", cur);
1255
1256 exe_count = (test_exedata[cur].env_var == NULL) ? 1 : 0;
1257
1258 ok(query.dwExeCount == exe_count, "Expected dwExeCount to be %d, was %d for %d\n", exe_count, query.dwExeCount, cur);
1259 ok(query.dwLayerCount == test_exedata[cur].dwLayerCount, "Expected dwLayerCount to be %d, was %d for %d\n", test_exedata[cur].dwLayerCount, query.dwLayerCount, cur);
1260 ok(query.dwCustomSDBMap == 1, "Expected dwCustomSDBMap to be 1, was %d for %d\n", query.dwCustomSDBMap, cur);
1261 ok(query.dwLayerFlags == 0, "Expected dwLayerFlags to be 0, was 0x%x for %d\n", query.dwLayerFlags, cur);
1263 ok(query.trApphelp == trApphelp, "Expected trApphelp to be 0x%x, was 0x%x for %d\n", trApphelp, query.trApphelp, cur);
1264
1266 expect_flags = 0;
1267 else if (g_WinVersion < WINVER_WIN8)
1268 expect_flags = 1;
1269 else if (g_WinVersion < WINVER_WIN10)
1270 expect_flags = 0x101;
1271 else
1272 {
1273 expect_flags = 0x121; /* for 2 and 3, this becomes 101 when not elevated. */
1274 if ((cur == 2 || cur == 3) && !IsUserAdmin())
1275 expect_flags &= ~0x20;
1276 }
1277
1279 expect_flags &= ~0x100;
1280
1281 ok(query.dwFlags == expect_flags, "Expected dwFlags to be 0x%x, was 0x%x for %d\n", expect_flags, query.dwFlags, cur);
1282
1283 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);
1284 for (size_t n = 1; n < _countof(query.atrExes); ++n)
1285 ok(query.atrExes[n] == 0, "Expected atrExes[%d] to be 0, was: %x for %d\n", n, query.atrExes[n], cur);
1286
1288 check_adwExeFlags(adwExeFlags_0, query, __FILE__, __LINE__, cur);
1289
1290 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);
1291 for (size_t n = 1; n < _countof(query.atrLayers); ++n)
1292 ok(query.atrLayers[n] == 0, "Expected atrLayers[%d] to be 0, was: %x for %d\n", n, query.atrLayers[0], cur);
1293
1295 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);
1296 else
1297 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);
1298 for (size_t n = 1; n < _countof(query.rgGuidDB); ++n)
1299 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);
1300
1301 if (query.atrExes[0])
1302 {
1303 pdb = (PDB)0x12345678;
1304 tagid = 0x76543210;
1305 ret = pSdbTagRefToTagID(hsdb, query.atrExes[0], &pdb, &tagid);
1306 ok(ret, "SdbTagRefToTagID failed for %d.\n", cur);
1307 ok(pdb != NULL && pdb != (PDB)0x12345678, "SdbTagRefToTagID failed to return a pdb for %d.\n", cur);
1308 ok(tagid != 0 && tagid != 0x76543210, "SdbTagRefToTagID failed to return a tagid for %d.\n", cur);
1309
1310 if (pdb && pdb != (PDB)0x12345678)
1311 {
1312 TAGREF tr = 0x12345678;
1313 TAG tag = pSdbGetTagFromTagID(pdb, tagid);
1315 ok(tag == TAG_EXE, "Expected tag to be TAG_EXE, was 0x%x for %d.\n", tag, cur);
1317
1318 /* And back again */
1319 ret = pSdbTagIDToTagRef(hsdb, pdb, tagid, &tr);
1320 ok(ret, "SdbTagIDToTagRef failed for %d.\n", cur);
1321 ok(tr == query.atrExes[0], "Expected tr to be 0x%x, was 0x%x for %d.\n", query.atrExes[0], tr, cur);
1322 }
1323 else
1324 {
1325 skip("Skipping a bunch of tests because of an invalid pointer\n");
1326 }
1327 }
1328
1330 {
1331 pdb = (PDB)0x12345678;
1332 tagid = 0x76543210;
1333 ret = pSdbTagRefToTagID(hsdb, query.atrLayers[0], &pdb, &tagid);
1334 ok(ret, "SdbTagRefToTagID failed for %d.\n", cur);
1335 ok(pdb != NULL && pdb != (PDB)0x12345678, "SdbTagRefToTagID failed to return a pdb for %d.\n", cur);
1336 ok(tagid != 0 && tagid != 0x76543210, "SdbTagRefToTagID failed to return a tagid for %d.\n", cur);
1337
1338 if (pdb && pdb != (PDB)0x12345678)
1339 {
1340 TAGREF tr = 0x12345678;
1341 TAG tag = pSdbGetTagFromTagID(pdb, tagid);
1343 ok(tag == TAG_LAYER, "Expected tag to be TAG_LAYER, was 0x%x for %d.\n", tag, cur);
1344 match_strw_attr(pdb, tagid, TAG_NAME, L"TestNewMode");
1345
1346 /* And back again */
1347 ret = pSdbTagIDToTagRef(hsdb, pdb, tagid, &tr);
1348 ok(ret, "SdbTagIDToTagRef failed for %d.\n", cur);
1349 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);
1350 }
1351 else
1352 {
1353 skip("Skipping a bunch of tests because of an invalid pointer\n");
1354 }
1355 }
1356
1357 pdb = (PDB)0x12345678;
1358 tagid = 0x76543210;
1359 ret = pSdbTagRefToTagID(hsdb, 0, &pdb, &tagid);
1360 ok(pdb != NULL && pdb != (PDB)0x12345678, "Expected pdb to be set to a valid pdb, was: %p\n", pdb);
1361 ok(tagid == 0, "Expected tagid to be set to 0, was: 0x%x\n", tagid);
1362
1363
1364
1365 if (RtlDosPathNameToNtPathName_U(exename, &exenameNT, NULL, NULL))
1366 {
1367 /*
1368 ERROR,AslPathGetLongFileNameLongpath,110,Long path conversion failed 123 [c0000001]
1369 ERROR,AslPathBuildSignatureLongpath,1086,AslPathGetLongFileNameLongpath failed for \??\C:\Users\MARK~1.DEV\AppData\Local\Temp\apphelp_test\test_allow.exe [c0000001]
1370 */
1371 ret = pSdbGetMatchingExe(hsdb, exenameNT.Buffer, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)&query);
1372 ok(!ret, "SdbGetMatchingExe should not succeed for %d.\n", cur);
1373
1374 RtlFreeUnicodeString(&exenameNT);
1375 }
1376
1378 DeleteFileW(testfile);
1380
1382 {
1383 SetEnvironmentVariableA("__COMPAT_LAYER", NULL);
1384 }
1385}
static LPWSTR exenameW
Definition: FindFiles.c:28
VOID * PDB
#define test_create_file
#define WINVER_WIN7
#define WINVER_WIN8
#define WINVER_VISTA
static void check_adwExeFlags(DWORD adwExeFlags_0, SDBQUERYRESULT_T &query, const char *file, int line, size_t cur)
Definition: db.cpp:1194
const WCHAR * extra_file
Definition: db.cpp:874
TAGREF atrLayers_0
Definition: db.cpp:878
static void test_is_testdb(PDB pdb)
Definition: db.cpp:1177
const char * env_var
Definition: db.cpp:880
TAGREF trApphelp
Definition: db.cpp:879
BOOL WINAPI DECLSPEC_HOTPATCH SetEnvironmentVariableA(IN LPCSTR lpName, IN LPCSTR lpValue)
Definition: environ.c:218
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToNtPathName_U(_In_opt_z_ PCWSTR DosPathName, _Out_ PUNICODE_STRING NtPathName, _Out_opt_ PCWSTR *NtFileNamePart, _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo)
static BOOL IsUserAdmin(VOID)
Definition: netid.c:163
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
Definition: fs_rec.h:143

◆ test_Sdb()

static void test_Sdb ( void  )
static

Definition at line 246 of file db.cpp.

247{
248 static const WCHAR temp[] = L"temp";
249 static const WCHAR path1[] = L"temp.sdb";
250 static const WCHAR path2[] = L"temp2.bin";
251 static const WCHAR tag_size_string[] = L"SIZE";
252 static const WCHAR tag_flag_lua_string[] = L"FLAG_LUA";
253 static const WCHAR invalid_tag[] = L"InvalidTag";
254 static const TAG tags[5] = {
257 };
258 WCHAR buffer[6] = { 0 };
259 PDB pdb;
260 QWORD qword;
261 DWORD dword;
262 WORD word;
263 BOOL ret;
264 HANDLE file; /* temp file created for testing purpose */
265 TAG tag;
266 TAGID tagid, ptagid, stringref = 6;
269
270 pdb = pSdbCreateDatabase(path1, DOS_PATH);
271 ok(pdb != NULL, "failed to create database\n");
272 if (pdb != NULL)
273 {
274 ret = pSdbWriteDWORDTag(pdb, tags[0], 0xDEADBEEF);
275 ok(ret, "failed to write DWORD tag\n");
276 ret = pSdbWriteQWORDTag(pdb, tags[1], 0xDEADBEEFBABE);
277 ok(ret, "failed to write QWORD tag\n");
278 ret = pSdbWriteStringRefTag(pdb, tags[2], stringref);
279 ok(ret, "failed to write stringref tag\n");
280 tagid = pSdbBeginWriteListTag(pdb, tags[3]);
281 ok(tagid != TAGID_NULL, "unexpected NULL tagid\n");
282 ret = pSdbWriteStringTag(pdb, tags[4], temp);
283 ok(ret, "failed to write string tag\n");
284 ret = pSdbWriteNULLTag(pdb, TAG_GENERAL);
285 ok(ret, "failed to write NULL tag\n");
286 ret = pSdbWriteWORDTag(pdb, TAG_MATCH_MODE, 0xACE);
287 ok(ret, "failed to write WORD tag\n");
288 ret = pSdbEndWriteListTag(pdb, tagid);
289 ok(ret, "failed to update list size\n");
290 /* [Err ][SdbCloseDatabase ] Failed to close the file. */
291 pSdbCloseDatabaseWrite(pdb);
292 }
293
294 /* [Err ][SdbGetDatabaseID ] Failed to get root tag */
295 pdb = pSdbOpenDatabase(path1, DOS_PATH);
296 ok(pdb != NULL, "unexpected NULL handle\n");
297
298 if (pdb)
299 {
300 tagid = pSdbGetFirstChild(pdb, TAGID_ROOT);
301 ok(tagid == _TAGID_ROOT, "unexpected tagid %u, expected %u\n", tagid, _TAGID_ROOT);
302
303 tag = pSdbGetTagFromTagID(pdb, tagid);
304 ok(tag == TAG_SIZE, "unexpected tag 0x%x, expected 0x%x\n", tag, TAG_SIZE);
305
306 string = pSdbTagToString(tag);
307 ok(lstrcmpW(string, tag_size_string) == 0, "unexpected string %s, expected %s\n",
308 wine_dbgstr_w(string), wine_dbgstr_w(tag_size_string));
309
310 dword = pSdbReadDWORDTag(pdb, tagid, 0);
311 ok(dword == 0xDEADBEEF, "unexpected value %u, expected 0xDEADBEEF\n", dword);
312
313 tagid = pSdbGetNextChild(pdb, TAGID_ROOT, tagid);
314 ok(tagid == _TAGID_ROOT + sizeof(TAG) + sizeof(DWORD), "unexpected tagid %u, expected %u\n",
315 tagid, _TAGID_ROOT + sizeof(TAG) + sizeof(DWORD));
316
317 tag = pSdbGetTagFromTagID(pdb, tagid);
318 ok(tag == TAG_FLAG_LUA, "unexpected tag 0x%x, expected 0x%x\n", tag, TAG_FLAG_LUA);
319
320 string = pSdbTagToString(tag);
322 {
323 ok(lstrcmpW(string, tag_flag_lua_string) == 0, "unexpected string %s, expected %s\n",
324 wine_dbgstr_w(string), wine_dbgstr_w(tag_flag_lua_string));
325 }
326 else
327 {
328 ok(lstrcmpW(string, invalid_tag) == 0, "unexpected string %s, expected %s\n",
329 wine_dbgstr_w(string), wine_dbgstr_w(invalid_tag));
330 }
331
332 qword = pSdbReadQWORDTag(pdb, tagid, 0);
333 ok(qword == 0xDEADBEEFBABE, "unexpected value 0x%I64x, expected 0xDEADBEEFBABE\n", qword);
334
335 tagid = pSdbGetNextChild(pdb, TAGID_ROOT, tagid);
336 string = pSdbGetStringTagPtr(pdb, tagid);
337 ok(string && (lstrcmpW(string, temp) == 0), "unexpected string %s, expected %s\n",
339
340 ptagid = pSdbGetNextChild(pdb, TAGID_ROOT, tagid);
341 tagid = pSdbGetFirstChild(pdb, ptagid);
342
343 string = pSdbGetStringTagPtr(pdb, tagid);
344 ok(string && (lstrcmpW(string, temp) == 0), "unexpected string %s, expected %s\n",
346
347 ok(pSdbReadStringTag(pdb, tagid, buffer, 6), "failed to write string to buffer\n");
348 /* [Err ][SdbpReadTagData ] Buffer too small. Avail: 6, Need: 10. */
349 ok(!pSdbReadStringTag(pdb, tagid, buffer, 3), "string was written to buffer, but failure was expected");
350 ok(pSdbGetTagDataSize(pdb, tagid) == 5 * sizeof(WCHAR), "string has unexpected size\n");
351
352 tagid = pSdbGetNextChild(pdb, ptagid, tagid);
353 tag = pSdbGetTagFromTagID(pdb, tagid);
354 ok(tag == TAG_GENERAL, "unexpected tag 0x%x, expected 0x%x\n", tag, TAG_GENERAL);
355 ok(pSdbGetTagDataSize(pdb, tagid) == 0, "null tag with size > 0\n");
356
357 tagid = pSdbGetNextChild(pdb, ptagid, tagid);
358 word = pSdbReadWORDTag(pdb, tagid, 0);
359 ok(word == 0xACE, "unexpected value 0x%x, expected 0x%x\n", word, 0xACE);
360
362
363 pSdbCloseDatabase(pdb);
364 }
366
368 ok(file != INVALID_HANDLE_VALUE, "failed to open file\n");
369 Write(file, &qword, 8);
371
372 pdb = pSdbCreateDatabase(path1, DOS_PATH);
373 ok(pdb != NULL, "unexpected NULL handle\n");
374
375 if (pdb)
376 {
377 ret = pSdbWriteBinaryTagFromFile(pdb, TAG_DATA_BITS, path2);
378 ok(ret, "failed to write tag from binary file\n");
379 pSdbCloseDatabaseWrite(pdb); /* [Err ][SdbCloseDatabase ] Failed to close the file. */
381
382 /* FIXME: doesnt work on win10?! */
383 pdb = pSdbOpenDatabase(path1, DOS_PATH);
385 {
386 /* ERROR,SdbOpenDatabaseEx,845,Failed to open SDB - File size too large or small. */
387 ok(pdb != NULL, "unexpected NULL handle\n");
388 }
389 if (pdb)
390 {
391 binary = (PBYTE)pSdbGetBinaryTagData(pdb, _TAGID_ROOT);
392 ok(memcmp(binary, &qword, 8) == 0, "binary data is corrupt\n");
393 ret = pSdbReadBinaryTag(pdb, _TAGID_ROOT, (PBYTE)buffer, 12);
394 ok(ret, "failed to read binary tag\n");
395 ok(memcmp(buffer, &qword, 8) == 0, "binary data is corrupt\n");
396 pSdbCloseDatabase(pdb);
397 }
398 }
400}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
static void test_GetDatabaseInformationEmpty(PDB pdb)
Definition: db.cpp:191
#define TAG_STRINGTABLE
Definition: db.cpp:94
static void Write(HANDLE file, LPCVOID buffer, DWORD size)
Definition: db.cpp:185
#define _TAGID_ROOT
Definition: db.cpp:40
#define TAG_FLAG_LUA
Definition: db.cpp:83
#define TAG_MATCH_MODE
Definition: db.cpp:58
static PBYTE
Definition: db.cpp:159
#define TAG_GENERAL
Definition: db.cpp:118
#define TAG_STRINGTABLE_ITEM
Definition: db.cpp:96
#define TAG_DATA_BITS
Definition: db.cpp:121
#define CloseHandle
Definition: compat.h:739
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4243
unsigned short WORD
Definition: ntddk_ex.h:93
GLuint buffer
Definition: glext.h:5915
const GLuint GLenum const GLvoid * binary
Definition: glext.h:7538
const WCHAR * word
Definition: lex.c:36
char string[160]
Definition: util.h:11
#define OPEN_ALWAYS
Definition: disk.h:70
const char * tags[7 *8]
Definition: apphelp.c:216
static const WCHAR path1[]
Definition: path.c:28
static const WCHAR path2[]
Definition: path.c:29
#define GENERIC_WRITE
Definition: nt_native.h:90
static calc_node_t temp
Definition: rpn_ieee.c:38
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by START_TEST().

◆ test_stringtable()

static void test_stringtable ( void  )
static

Definition at line 533 of file db.cpp.

534{
535 static const WCHAR path1[] = {'t','e','s','t','.','s','d','b',0};
536 static const WCHAR test1[] = {'t','e','s','t','1',0};
537 static const WCHAR test2[] = {'T','e','s','t','1',0};
538 static const WCHAR test3[] = {'T','E','s','t','1',0};
539 static const WCHAR test4[] = {'T','E','S','T','1',0};
540 static const WCHAR test5[] = {'T','E','S','T','2',0};
541 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};
542 /* Last char changed from '.' to '!' */
543 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};
544 static const WCHAR empty[] = {0};
545 static const WCHAR* all[] = { test1, test2, test3, test4, test5, lipsum, lipsum2, empty };
546 static const TAGID expected_str[] = { 0xc, 0x12, 0x18, 0x1e, 0x24, 0x2a, 0x30, 0x36 };
547 static const TAGID expected_tab[] = { 6, 0x18, 0x2a, 0x3c, 0x4e, 0x60, 0x846, 0x102c };
548 DWORD n, j;
549
550 for (n = 0; n < (sizeof(all) / sizeof(all[0])); ++n)
551 {
552 PDB pdb;
553 TAGID tagstr, table, expected_table;
554
555 write_db_strings(path1, all, n+1);
556
557 pdb = pSdbOpenDatabase(path1, DOS_PATH);
558 ok(pdb != NULL, "Expected a valid database\n");
559 if (!pdb)
560 {
562 continue;
563 }
564 tagstr = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_NAME);
565 for (j = 0; j <= n; ++j)
566 {
567 ok(tagstr == expected_str[j], "Expected tagstr to be 0x%x, was 0x%x for %u/%u\n", expected_str[j], tagstr, j, n);
568 if (tagstr)
569 {
570 LPWSTR data;
571 DWORD size;
572 TAG tag = pSdbGetTagFromTagID(pdb, tagstr);
573 ok(tag == TAG_NAME, "Expected tag to be TAG_NAME, was 0x%x for %u/%u\n", tag, j, n);
574 size = pSdbGetTagDataSize(pdb, tagstr);
575 ok(size == 4, "Expected datasize to be 4, was %u for %u/%u\n", size, j, n);
576 data = pSdbGetStringTagPtr(pdb, tagstr);
577 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);
578 }
579 tagstr = pSdbFindNextTag(pdb, TAGID_ROOT, tagstr);
580 }
581 ok(tagstr == TAGID_NULL, "Expected to be at the end for %u\n", n);
582
583
584 table = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_STRINGTABLE);
585 expected_table = 0xc + (n+1)*6;
586 ok(table == expected_table, "Expected to find a stringtable at 0x%x instead of 0x%x for %u\n", expected_table, table, n);
587 if (table)
588 {
589 tagstr = pSdbFindFirstTag(pdb, table, TAG_STRINGTABLE_ITEM);
590 for (j = 0; j <= n; ++j)
591 {
592 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);
593 if (tagstr)
594 {
595 LPWSTR data;
596 DWORD size, expected_size;
597 TAG tag = pSdbGetTagFromTagID(pdb, tagstr);
598 ok(tag == TAG_STRINGTABLE_ITEM, "Expected tag to be TAG_NAME, was 0x%x for %u/%u\n", tag, j, n);
599 size = pSdbGetTagDataSize(pdb, tagstr);
600 expected_size = (lstrlenW(all[j])+1) * 2;
601 ok(size == expected_size, "Expected datasize to be %u, was %u for %u/%u\n", expected_size, size, j, n);
602 data = pSdbGetStringTagPtr(pdb, tagstr);
603 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);
604 }
605 tagstr = pSdbFindNextTag(pdb, TAGID_ROOT, tagstr);
606 }
607 ok(tagstr == TAGID_NULL, "Expected to be at the end for %u\n", n);
608 }
609
610 pSdbCloseDatabase(pdb);
612 }
613}
static void write_db_strings(const WCHAR *name, const WCHAR *data[], size_t count)
Definition: db.cpp:517
static const WCHAR empty[]
Definition: main.c:47
#define lstrlenW
Definition: compat.h:750
void test2()
Definition: ehthrow.cxx:284
void test1()
Definition: ehthrow.cxx:277
void test4()
Definition: ehthrow.cxx:298
void test3()
Definition: ehthrow.cxx:291
void test5()
Definition: ehthrow.cxx:305
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250

Referenced by START_TEST().

◆ test_TagRef()

static void test_TagRef ( void  )
static

Definition at line 1581 of file db.cpp.

1582{
1583 WCHAR tmpdir[MAX_PATH], dbpath[MAX_PATH];
1584 BOOL ret;
1585 HSDB hsdb;
1586 PDB pdb;
1587 TAGID db;
1588 DWORD size;
1589 TAGREF tr;
1590
1592 ok(ret, "GetTempPathA error: %d\n", GetLastError());
1593
1594 /* SdbInitDatabase needs an nt-path */
1595 swprintf(dbpath, L"\\??\\%stest.sdb", tmpdir);
1596
1598
1599 hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1600
1601 /* HSDB is the only arg that can't be null */
1602 ret = pSdbTagRefToTagID(hsdb, 0, NULL, NULL);
1603 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1604
1606
1607 pdb = (PDB)&db;
1608 db = 12345;
1609 ret = pSdbTagRefToTagID(hsdb, size - 1, &pdb, &db);
1610 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1611 ok(pdb != NULL, "Expected a result, got: %p\n", pdb);
1612 ok(db == (size - 1), "Expected %u, got: %u\n", size - 1, db);
1613
1614 /* Convert it back. */
1615 tr = 0x12345678;
1616 ret = pSdbTagIDToTagRef(hsdb, pdb, db, &tr);
1617 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1618 ok(tr == (size - 1), "Expected %u, got: %u\n", size - 1, tr);
1619
1620 pdb = (PDB)&db;
1621 db = 12345;
1622 ret = pSdbTagRefToTagID(hsdb, size, &pdb, &db);
1623 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1624 ok(pdb != NULL, "Expected a result, got: %p\n", pdb);
1625 ok(db == size, "Expected %u, got: %u\n", size, db);
1626
1627 tr = 0x12345678;
1628 ret = pSdbTagIDToTagRef(hsdb, pdb, db, &tr);
1629 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1630 ok(tr == size, "Expected %u, got: %u\n", size, tr);
1631
1632 pdb = (PDB)&db;
1633 db = 12345;
1634 ret = pSdbTagRefToTagID(hsdb, size + 1, &pdb, &db);
1635 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1636 ok(pdb != NULL, "Expected a result, got: %p\n", pdb);
1637 ok(db == (size + 1), "Expected %u, got: %u\n", size + 1, db);
1638
1639 tr = 0x12345678;
1640 ret = pSdbTagIDToTagRef(hsdb, pdb, db, &tr);
1641 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1642 ok(tr == (size + 1), "Expected %u, got: %u\n", (size + 1), tr);
1643
1644 pdb = (PDB)&db;
1645 db = 12345;
1646 ret = pSdbTagRefToTagID(hsdb, 0x0fffffff, &pdb, &db);
1647 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1648 ok(pdb != NULL, "Expected a result, got: %p\n", pdb);
1649 ok(db == 0x0fffffff, "Expected %u, got: %u\n", 0x0fffffff, db);
1650
1651 tr = 0x12345678;
1652 ret = pSdbTagIDToTagRef(hsdb, pdb, db, &tr);
1653 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1654 ok(tr == 0x0fffffff, "Expected %u, got: %u\n", 0x0fffffff, tr);
1655
1656 pdb = (PDB)&db;
1657 db = 12345;
1658 ret = pSdbTagRefToTagID(hsdb, 0x10000000, &pdb, &db);
1659 ok(ret == FALSE, "Expected ret to be FALSE, was: %d\n", ret);
1660 ok(pdb == NULL, "Expected no result, got: %p\n", pdb);
1661 ok(db == 0, "Expected no result, got: 0x%x\n", db);
1662
1663 tr = 0x12345678;
1664 ret = pSdbTagIDToTagRef(hsdb, pdb, 0x10000000, &tr);
1665 ok(ret == FALSE, "Expected ret to be TRUE, was: %d\n", ret);
1666 ok(tr == 0, "Expected %u, got: %u\n", 0, tr);
1667
1668 pdb = NULL;
1669 db = TAGID_NULL;
1670 ret = pSdbTagRefToTagID(hsdb, TAGID_ROOT, &pdb, NULL);
1671 ok(ret != FALSE, "Expected ret to be TRUE, was: %d\n", ret);
1672 ok(pdb != NULL, "Expected pdb to be valid\n");
1673
1674 if (pdb == NULL)
1675 {
1676 skip("Cannot run tests without pdb\n");
1677 }
1678 else
1679 {
1680 db = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
1681 if (db != TAGID_NULL)
1682 {
1683 TAGID child;
1684 child = pSdbGetFirstChild(pdb, db);
1685 while (child != TAGID_NULL)
1686 {
1687 PDB pdb_res;
1688 TAGID tagid_res;
1689 /* We are using a TAGID as a TAGREF here. */
1690 ret = pSdbTagRefToTagID(hsdb, child, &pdb_res, &tagid_res);
1691 ok(ret, "Expected SdbTagRefToTagID to succeed\n");
1692
1693 /* For simple cases (primary DB) TAGREF == TAGID */
1694 tr = 0x12345678;
1695 ret = pSdbTagIDToTagRef(hsdb, pdb_res, tagid_res, &tr);
1696 ok(ret, "Expected SdbTagIDToTagRef to succeed\n");
1697 ok_hex(tr, (int)tagid_res);
1698
1699 child = pSdbGetNextChild(pdb, db, child);
1700 }
1701 }
1702 else
1703 {
1704 skip("Cannot run tests without valid db tag\n");
1705 }
1706 }
1707
1708 /* Get a tagref for our own layer */
1709 tr = pSdbGetLayerTagRef(hsdb, L"TestNewMode");
1710 ok_hex(tr, 0x18e);
1711
1712 /* We cannot find a tagref from the main database. */
1713 tr = pSdbGetLayerTagRef(hsdb, L"256Color");
1714 ok_hex(tr, 0);
1715
1716 pSdbReleaseDatabase(hsdb);
1717
1718 DeleteFileW(dbpath + 4);
1719}
DWORD test_get_db_size()
Definition: data.c:773
#define TRUE
Definition: types.h:120
static HWND child
Definition: cursoricon.c:298
static char tmpdir[MAX_PATH]
Definition: shlexec.c:52

Referenced by START_TEST().

◆ test_write_ex()

static void test_write_ex ( void  )
static

Definition at line 407 of file db.cpp.

408{
409 WCHAR path1[] = {'t','e','s','t','.','s','d','b',0};
410 WCHAR test1[] = {'T','E','S','T',0};
411 WCHAR test2[] = {'t','e','s','t',0};
412 PDB pdb;
413 TAGID tagdb, tagstr;
414 TAG tag;
415 DWORD size;
416 BOOL ret;
417 LPWSTR ptr;
418
419 /* Write a small database */
420 pdb = pSdbCreateDatabase(path1, DOS_PATH);
421 ok(pdb != NULL, "Expected a valid database\n");
422 if (!pdb)
423 return;
424 tagdb = pSdbBeginWriteListTag(pdb, TAG_DATABASE);
425 ok(tagdb == 12, "Expected tag to be 12, was %u\n", tagdb);
426 ret = pSdbWriteStringTag(pdb, TAG_NAME, test1);
427 ret = pSdbWriteStringTag(pdb, TAG_NAME, test2);
428 ok(ret, "Expected SdbWriteStringTag to succeed\n");
429 ret = pSdbEndWriteListTag(pdb, tagdb);
430 ok(ret, "Expected SdbEndWriteListTag to succeed\n");
431
432 tagdb = pSdbBeginWriteListTag(pdb, TAG_DATABASE);
433 ok(tagdb == 30, "Expected tag to be 24, was %u\n", tagdb);
434 ret = pSdbWriteStringTag(pdb, TAG_NAME, test1);
435 ret = pSdbWriteStringTag(pdb, TAG_NAME, test2);
436 ok(ret, "Expected SdbWriteStringTag to succeed\n");
437 ret = pSdbEndWriteListTag(pdb, tagdb);
438 ok(ret, "Expected SdbEndWriteListTag to succeed\n");
439
440 pSdbCloseDatabaseWrite(pdb);
441
442 /* Now validate it's contents */
443 pdb = pSdbOpenDatabase(path1, DOS_PATH);
444 ok(pdb != NULL, "Expected a valid database\n");
445 if (!pdb)
446 return;
447
448 tagdb = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
449 ok(tagdb == 12, "Expected tag to be 12, was %u\n", tagdb);
450 size = pSdbGetTagDataSize(pdb, tagdb);
451 ok(size == 12, "Expected size to be 12, was %u\n", size);
452
453 tagstr = pSdbFindFirstTag(pdb, tagdb, TAG_NAME);
454 ok(tagstr == 18, "Expected string tag to be 18, was %u\n", tagstr);
455 tag = pSdbGetTagFromTagID(pdb, tagstr);
456 ok(tag == TAG_NAME, "Expected tag to be TAG_NAME, was 0x%x\n", (DWORD)tag);
457 size = pSdbGetTagDataSize(pdb, tagstr);
458 ok(size == 4, "Expected size to be 4, was 0x%x\n", size);
459
460 tagstr = pSdbFindNextTag(pdb, tagdb, tagstr);
461 ok(tagstr == 24, "Expected string tag to be 24, was %u\n", tagstr);
462 tag = pSdbGetTagFromTagID(pdb, tagstr);
463 ok(tag == TAG_NAME, "Expected tag to be TAG_NAME, was 0x%x\n", (DWORD)tag);
464 size = pSdbGetTagDataSize(pdb, tagstr);
465 ok(size == 4, "Expected size to be 4, was 0x%x\n", size);
466
467 tagdb = pSdbFindNextTag(pdb, TAGID_ROOT, tagdb);
468 ok(tagdb == 30, "Expected tag to be 30, was %u\n", tagdb);
469 size = pSdbGetTagDataSize(pdb, tagdb);
470 ok(size == 12, "Expected size to be 12, was %u\n", size);
471
472 tagstr = pSdbFindFirstTag(pdb, tagdb, TAG_NAME);
473 ok(tagstr == 36, "Expected string tag to be 36, was %u\n", tagstr);
474 tag = pSdbGetTagFromTagID(pdb, tagstr);
475 ok(tag == TAG_NAME, "Expected tag to be TAG_NAME, was 0x%x\n", (DWORD)tag);
476 size = pSdbGetTagDataSize(pdb, tagstr);
477 ok(size == 4, "Expected size to be 4, was %u\n", size);
478
479 tagstr = pSdbFindNextTag(pdb, tagdb, tagstr);
480 ok(tagstr == 42, "Expected string tag to be 42, was %u\n", tagstr);
481 tag = pSdbGetTagFromTagID(pdb, tagstr);
482 ok(tag == TAG_NAME, "Expected tag to be TAG_NAME, was 0x%x\n", (DWORD)tag);
483 size = pSdbGetTagDataSize(pdb, tagstr);
484 ok(size == 4, "Expected size to be 4, was 0x%x\n", size);
485
486 tagdb = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_STRINGTABLE);
487 ok(tagdb == 48, "Expected tag to be 48, was %u\n", tagdb);
488 size = pSdbGetTagDataSize(pdb, tagdb);
489 ok(size == 32, "Expected size to be 32, was %u\n", size);
490
491 tagstr = pSdbGetFirstChild(pdb, tagdb);
492 ok(tagstr == 54, "Expected string tag to be 54, was %u\n", tagstr);
493 tag = pSdbGetTagFromTagID(pdb, tagstr);
494 ok(tag == TAG_STRINGTABLE_ITEM, "Expected tag to be TAG_STRINGTABLE_ITEM, was 0x%x\n", (DWORD)tag);
495 size = pSdbGetTagDataSize(pdb, tagstr);
496 ok(size == 10, "Expected size to be 10, was %u\n", size);
497 ptr = pSdbGetStringTagPtr(pdb, tagstr);
498 ok(ptr != NULL, "Expected a valid pointer\n");
499 if (ptr)
500 ok(!wcscmp(ptr, test1), "Expected ptr to be %s, was %s\n", wine_dbgstr_w(test1), wine_dbgstr_w(ptr));
501
502 tagstr = pSdbGetNextChild(pdb, tagdb, tagstr);
503 ok(tagstr == 70, "Expected string tag to be 70, was %u\n", tagstr);
504 tag = pSdbGetTagFromTagID(pdb, tagstr);
505 ok(tag == TAG_STRINGTABLE_ITEM, "Expected tag to be TAG_STRINGTABLE_ITEM, was 0x%x\n", (DWORD)tag);
506 size = pSdbGetTagDataSize(pdb, tagstr);
507 ok(size == 10, "Expected size to be 10, was %u\n", size);
508 ptr = pSdbGetStringTagPtr(pdb, tagstr);
509 ok(ptr != NULL, "Expected a valid pointer\n");
510 if (ptr)
511 ok(!wcscmp(ptr, test2), "Expected ptr to be %s, was %s\n", wine_dbgstr_w(test2), wine_dbgstr_w(ptr));
512
513 pSdbCloseDatabase(pdb);
514}
static PVOID ptr
Definition: dispmode.c:27

Referenced by START_TEST().

◆ validate_SDBQUERYRESULT_size()

static int validate_SDBQUERYRESULT_size ( )
static

Definition at line 2031 of file db.cpp.

2032{
2033 unsigned char buffer[SDBQUERYRESULT_EXPECTED_SIZE_VISTA * 2];
2035 size_t n;
2036
2037 memset(buffer, 0xab, sizeof(buffer));
2038
2040 pSdbGetMatchingExe(NULL, path, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)buffer);
2041 if (buffer[0] == 0xab)
2042 {
2043 trace("SdbGetMatchingExe didnt do anything, cannot determine SDBQUERYRESULT size\n");
2044 return 0;
2045 }
2046
2048 {
2049 return 1;
2050 }
2051
2053 {
2054 return 2;
2055 }
2056
2057 for (n = 0; n < _countof(buffer); ++n)
2058 {
2059 if (buffer[n] != 0xab)
2060 {
2061 trace("Unknown size: %i\n", n);
2062 break;
2063 }
2064 }
2065
2066 return 0;
2067}
#define SDBQUERYRESULT_EXPECTED_SIZE_2k3
#define SDBQUERYRESULT_EXPECTED_SIZE_VISTA
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600

Referenced by START_TEST().

◆ void()

static void ( WINAPI pSdbCloseDatabase)
static

◆ VOID()

static VOID ( WINAPI pSdbFreeDatabaseInformation)
static

◆ WORD()

static WORD ( WINAPI pSdbReadWORDTag)
static

◆ Write()

static void Write ( HANDLE  file,
LPCVOID  buffer,
DWORD  size 
)
static

Definition at line 185 of file db.cpp.

186{
187 DWORD dwWritten = 0;
188 WriteFile(file, buffer, size, &dwWritten, NULL);
189}
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24

Referenced by test_Sdb().

◆ write_db_strings()

static void write_db_strings ( const WCHAR name,
const WCHAR data[],
size_t  count 
)
static

Definition at line 517 of file db.cpp.

518{
519 PDB pdb;
520 size_t n;
521 BOOL ret;
522
523 pdb = pSdbCreateDatabase(name, DOS_PATH);
524 ok(pdb != NULL, "Failed to create db for case %u\n", count);
525 for (n = 0; n < count; ++n)
526 {
527 ret = pSdbWriteStringTag(pdb, TAG_NAME, data[n]);
528 ok(ret, "Failed to write string %u/%u\n", n, count);
529 }
530 pSdbCloseDatabaseWrite(pdb);
531}
GLuint GLuint GLsizei count
Definition: gl.h:1545

Referenced by test_stringtable().

◆ write_raw_file()

static BOOL write_raw_file ( const WCHAR FileName,
const void Data,
DWORD  Size 
)
static

Definition at line 1429 of file db.cpp.

1430{
1431 BOOL Success;
1432 DWORD dwWritten;
1434
1436 {
1437 skip("Failed to create temp file %ls, error %u\n", FileName, GetLastError());
1438 return FALSE;
1439 }
1440 Success = WriteFile(Handle, Data, Size, &dwWritten, NULL);
1441 ok(Success == TRUE, "WriteFile failed with %u\n", GetLastError());
1442 ok(dwWritten == Size, "WriteFile wrote %u bytes instead of %u\n", dwWritten, Size);
1444 return Success && (dwWritten == Size);
1445}
@ Success
Definition: eventcreate.c:712
ULONG Handle
Definition: gdb_input.c:15
#define CREATE_ALWAYS
Definition: disk.h:72

Referenced by extract_resource().

Variable Documentation

◆ adwExeFlags_0

DWORD adwExeFlags_0

Definition at line 877 of file db.cpp.

Referenced by check_adwExeFlags(), and test_mode_generic().

◆ app_name

const WCHAR* app_name

Definition at line 871 of file db.cpp.

Referenced by check_db_exes().

◆ apphelp_details

const WCHAR* apphelp_details

Definition at line 999 of file db.cpp.

Referenced by check_db_apphelp().

◆ apphelp_title

const WCHAR* apphelp_title

Definition at line 998 of file db.cpp.

Referenced by check_db_apphelp().

◆ atrExes_0

TAGREF atrExes_0

Definition at line 876 of file db.cpp.

◆ atrLayers_0

TAGREF atrLayers_0

Definition at line 878 of file db.cpp.

Referenced by test_mode_generic().

◆ dwLayerCount

DWORD dwLayerCount

Definition at line 875 of file db.cpp.

Referenced by expect_layeronly_imp().

◆ DWORD

Definition at line 146 of file db.cpp.

Referenced by test_GetDatabaseInformationEmpty().

◆ env

◆ env_var

const char* env_var

Definition at line 880 of file db.cpp.

Referenced by doChild(), and test_mode_generic().

◆ exe_id

GUID exe_id

Definition at line 873 of file db.cpp.

Referenced by check_db_exes().

◆ extra_file

const WCHAR* extra_file

Definition at line 874 of file db.cpp.

Referenced by test_mode_generic().

◆ find

◆ find_name

TAGID TAGID TAGID LPCWSTR find_name

Definition at line 155 of file db.cpp.

Referenced by SdbFindFirstNamedTag(), and SymFromName().

◆ flags

Definition at line 170 of file db.cpp.

◆ hdll

HMODULE hdll
static

Definition at line 136 of file db.cpp.

Referenced by START_TEST().

◆ htmlhelpid

DWORD htmlhelpid

Definition at line 996 of file db.cpp.

Referenced by check_db_apphelp().

◆ information

◆ layerName

LPCWSTR layerName

Definition at line 173 of file db.cpp.

Referenced by SdbGetLayerTagRef(), SdbpAddExeLayers(), and SdbpAddNamedLayerMatch().

◆ link

◆ lpBuffer

*nSize LPWSTR lpBuffer

Definition at line 175 of file db.cpp.

Referenced by _enumerateContextW(), _enumerateGlobalPassthroughW(), _enumerateGlobalW(), _enumerateProvidersW(), _enumerateProviderW(), _hread(), _hwrite(), _RpcAddPortEx(), _tfullpath(), _thunkNetResourceArrayAToW(), _thunkNetResourceArrayWToA(), AddPortExA(), AddPortExW(), AllSysInfo(), AVISaveVW(), BatchGetString(), BuildAdvPropTitle(), BuildDesktopNameList(), BuildWindowStationNameList(), CM_Set_Class_Registry_PropertyA(), CM_Set_DevNode_Registry_Property_ExA(), COMBO_GetText(), COMBO_GetTextA(), COMBO_GetTextW(), ConInKey(), CopyLoop(), Create(), CSR_API(), DECLARE_INTERFACE_(), DeviceProblemTextA(), DisplayClassCoinstallers(), DisplayClassProperties(), DisplayDeviceCoinstallers(), DisplayDevicePropertyText(), DisplayUsage(), DrawTextFromResource(), EngFileWrite(), EngpFileIoRequest(), EnumMRUListA(), EnumMRUListW(), FileGetString(), FilterFindFirst(), FilterFindNext(), FilterGetInformation(), FilterInstanceFindFirst(), FilterInstanceFindNext(), FilterInstanceGetInformation(), FilterVolumeFindFirst(), FilterVolumeFindNext(), FilterVolumeInstanceFindFirst(), FilterVolumeInstanceFindNext(), FormatMessageA(), FormatMessageSafeW(), FormatMessageW(), FormatString(), GdipGetSupportedFileExtensions(), GenerateComputerName(), GetAllUsersProfileDirectoryA(), GetAtomNameA(), GetAtomNameW(), GetBootResourceList(), GetCharacterTimeout(), GetCharWidth32A(), GetCharWidth32W(), GetCharWidthA(), GetCharWidthI(), GetCharWidthW(), GetClipboardFormatNameA(), GetColorDescription(), GetComputerNameA(), GetComputerNameExA(), GetComputerNameExW(), GetComputerNameFromRegistry(), GetComputerNameW(), GetCurrentDirectoryA(), GetCurrentDirectoryW(), GetDefaultUserProfileDirectoryA(), GetDllDirectoryA(), GetDllDirectoryW(), GetDllList(), GetEnvironmentVariableA(), GetEnvironmentVariableW(), GetEventLogInformation(), GetFontObjectA(), GetFontResourceInfoW(), GetFullPathNameA(), GetFullPathNameW(), GetLocalisedText(), GetLogicalDriveStringsA(), GetLogicalDriveStringsW(), GetObjectA(), GetObjectW(), GetProfilesDirectoryA(), GetRefreshRateDescription(), GetServices(), GetSystemDirectoryA(), GetSystemDirectoryW(), GetSystemWindowsDirectoryA(), GetSystemWindowsDirectoryW(), GetTempPathA(), GetUserProfileDirectoryA(), GetWindowsDirectoryA(), GetWindowsDirectoryW(), GlobalGetAtomNameA(), GlobalGetAtomNameW(), GlobalMemoryStatus(), GlobalMemoryStatusEx(), HTTP_HttpQueryInfoW(), HttpQueryInfoA(), HttpQueryInfoW(), IntAddGlobalAtom(), InternetQueryOptionA(), InternetQueryOptionW(), InternetReadFile(), InternetReadFileExW(), InternetSetOptionA(), InternetSetOptionExA(), InternetSetOptionExW(), InternetSetOptionW(), InternetWriteFile(), IntGetAtomName(), IntGetConsoleInput(), IntReadConsole(), IntReadConsoleOutput(), IntWriteConsole(), IntWriteConsoleInput(), IntWriteConsoleOutput(), InvokeRemoteRegistryPickerDialog(), IsDataUnicode(), K32LoadStringExW(), K32LoadStringW(), LoadRdpSettingsFromFile(), LoadStringWrapW(), LocalAddPortEx(), LocalmonAddPortEx(), LsapLoadString(), LsapLoadStringEx(), main(), MAPIFreeBuffer(), MDI_UpdateFrameText(), MsiLoadStringA(), MsiLoadStringW(), NDdeShareAddA(), NDdeShareAddW(), NDdeShareEnumA(), NDdeShareEnumW(), NDdeShareGetInfoA(), NDdeShareGetInfoW(), NDdeShareSetInfoA(), NDdeShareSetInfoW(), NDdeTrustedShareEnumA(), NDdeTrustedShareEnumW(), NPEnumResource(), NpGetUserNamep(), NPSCopyStringA(), NtGdiExtGetObjectW(), NtUserBuildNameList(), PALETTE_GetObject(), ParseSettings(), pCDevSettings_ReadHardwareInfo(), PeekConsoleInput(), PeekConsoleInputA(), PeekConsoleInputW(), PeekNamedPipe(), pSetupOpenAndMapFileForRead(), pSetupStringTableStringFromIdEx(), pSetupUnmapAndCloseFile(), QueryConfig2A(), QueryConfig2W(), QueryServiceConfig2A(), QueryServiceConfig2W(), QueryServiceStatusEx(), ReadAndHandleOutput(), ReadConsoleA(), ReadConsoleInput(), ReadConsoleInputA(), ReadConsoleInputExA(), ReadConsoleInputExW(), ReadConsoleInputW(), ReadConsoleOutputA(), ReadConsoleOutputW(), ReadConsoleW(), ReadDirectoryChangesW(), ReadEventLogA(), ReadEventLogW(), ReadFile(), ReadFileEx(), ReadProcessMemory(), ReadRdpFile(), ReadUrlCacheEntryStream(), REnumServiceGroupW(), REnumServicesStatusA(), REnumServicesStatusExA(), REnumServicesStatusExW(), REnumServicesStatusW(), RQueryServiceConfig2A(), RQueryServiceConfig2W(), RQueryServiceStatusEx(), SampLoadString(), SdbQueryData(), SdbQueryDataEx(), SdbQueryDataExTagID(), SearchPathA(), SearchPathW(), SetActiveComputerNameToRegistry(), SetAllVars(), SetComputerNameExA(), SetComputerNameExW(), SetComputerNameToRegistry(), SetRegTextData(), SETUP_GetValueString(), SndMixerGetLineName(), SndMixerGetProductName(), test_async_file_errors(), test_normal_imports(), CDownloadManager::ThreadFunc(), Toolhelp32ReadProcessMemory(), User32GetImmFileName(), VirtualQuery(), VirtualQueryEx(), wmain(), WNetEnumResourceA(), WNetEnumResourceW(), WNetGetResourceInformationA(), WNetGetResourceInformationW(), WNetGetResourceParentA(), WNetGetResourceParentW(), WNetGetUniversalNameA(), WNetGetUniversalNameW(), WriteConsole(), WriteConsoleA(), WriteConsoleInputA(), WriteConsoleInputVDMA(), WriteConsoleInputVDMW(), WriteConsoleInputW(), WriteConsoleOutputA(), WriteConsoleOutputW(), WriteConsoleW(), WriteFile(), WriteFileEx(), and WriteProcessMemory().

◆ lpcbBufferSize

static TAGID LPCWSTR LPDWORD LPVOID LPDWORD lpcbBufferSize

Definition at line 175 of file db.cpp.

Referenced by SdbQueryData(), SdbQueryDataEx(), and SdbQueryDataExTagID().

◆ LPCWSTR

Definition at line 148 of file db.cpp.

◆ lpdwDataType

static TAGID LPCWSTR LPDWORD lpdwDataType

Definition at line 175 of file db.cpp.

Referenced by SdbQueryData(), SdbQueryDataEx(), and SdbQueryDataExTagID().

◆ lpszDataName

static TAGID LPCWSTR lpszDataName

Definition at line 175 of file db.cpp.

Referenced by SdbQueryData(), SdbQueryDataEx(), and SdbQueryDataExTagID().

◆ LPWSTR

Definition at line 160 of file db.cpp.

◆ module_name

◆ name

Definition at line 870 of file db.cpp.

◆ nametag

TAGID TAGID TAGID nametag

Definition at line 155 of file db.cpp.

Referenced by SdbFindFirstNamedTag().

◆ path

Definition at line 170 of file db.cpp.

◆ PATH_TYPE

Definition at line 138 of file db.cpp.

◆ PBYTE

Definition at line 159 of file db.cpp.

Referenced by test_Sdb().

◆ PCWSTR

GUID *static PCWSTR

Definition at line 167 of file db.cpp.

◆ pdb