ReactOS 0.4.15-dev-6055-g36cdd34
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)
 
static BOOL IsUserAdmin ()
 
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 1978 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 1215 of file db.cpp.

1216{
1217 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);
1218 for (size_t n = 1; n < _countof(query.atrExes); ++n)
1219 ok_(file, line)(query.adwExeFlags[n] == 0, "Expected adwExeFlags[%d] to be 0, was: %x for %d\n", n, query.adwExeFlags[0], cur);
1220}
#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:68
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 1223 of file db.cpp.

1224{
1225}

◆ 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
static struct @1559 test_layerdata[2]
#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
#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
#define TAG_APP_NAME
Definition: db.cpp:101
static struct @1558 test_exedata[5]
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 1968 of file db.cpp.

1969{
1970 static WCHAR wide_string[100] = { 0 };
1972 MultiByteToWideChar(CP_ACP, 0, text, -1, wide_string, 100);
1973
1974 result = pSdbMakeIndexKeyFromString(wide_string);
1975 winetest_ok(result == expected, "Expected %s to result in %s, was: %s\n", text, wine_dbgstr_longlong(expected), wine_dbgstr_longlong(result));
1976}
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:1799
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 1468 of file db.cpp.

1469{
1471 HRSRC hRsrc = FindResourceW(hMod, ResourceName, MAKEINTRESOURCEW(RT_RCDATA));
1472 ok(!!hRsrc, "Unable to find %s\n", wine_dbgstr_w(ResourceName));
1473 if (!hRsrc)
1474 return false;
1475
1476 HGLOBAL hGlobal = LoadResource(hMod, hRsrc);
1477 DWORD Size = SizeofResource(hMod, hRsrc);
1478 LPVOID pData = LockResource(hGlobal);
1479
1480 ok(Size && !!pData, "Unable to load %s\n", wine_dbgstr_w(ResourceName));
1481 if (!Size || !pData)
1482 return false;
1483
1484 BOOL Written = write_raw_file(Filename, pData, Size);
1486 return Written;
1487}
static BOOL write_raw_file(const WCHAR *FileName, const void *Data, DWORD Size)
Definition: db.cpp:1450
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:939
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:3243
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

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

◆ HSDB()

static HSDB ( WINAPI pSdbInitDatabase)
static

◆ IsUserAdmin()

static BOOL IsUserAdmin ( )
static

Definition at line 1192 of file db.cpp.

1193{
1194 BOOL Result;
1196 PSID AdministratorsGroup;
1197
1201 0, 0, 0, 0, 0, 0,
1202 &AdministratorsGroup);
1203 if (Result)
1204 {
1205 if (!CheckTokenMembership( NULL, AdministratorsGroup, &Result))
1206 Result = FALSE;
1207 FreeSid(AdministratorsGroup);
1208 }
1209
1210 return Result;
1211}
static SID_IDENTIFIER_AUTHORITY NtAuthority
Definition: security.c:40
#define FALSE
Definition: types.h:117
BOOL WINAPI CheckTokenMembership(IN HANDLE ExistingTokenHandle, IN PSID SidToCheck, OUT PBOOL IsMember)
Definition: token.c:21
BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid)
Definition: security.c:676
PVOID WINAPI FreeSid(PSID pSid)
Definition: security.c:700
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
#define SECURITY_BUILTIN_DOMAIN_RID
Definition: setypes.h:581
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
#define DOMAIN_ALIAS_RID_ADMINS
Definition: setypes.h:652

Referenced by Applet(), DevInstallW(), CNetConnection::GetProperties(), NetIDPage_OnInitDialog(), OnInitUserProfileDialog(), and test_mode_generic().

◆ 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 2093 of file db.cpp.

2094{
2095 //SetEnvironmentVariableA("SHIM_DEBUG_LEVEL", "4");
2096 //SetEnvironmentVariableA("SHIMENG_DEBUG_LEVEL", "4");
2097 //SetEnvironmentVariableA("DEBUGCHANNEL", "+apphelp");
2098
2100 hdll = LoadLibraryA("apphelp.dll");
2101
2102 /* We detect the apphelp version that is loaded, instead of the os we are running on.
2103 This allows for easier testing multiple versions of the dll */
2105 trace("Apphelp version: 0x%x\n", g_WinVersion);
2106
2107 *(void**)&pSdbTagToString = (void *)GetProcAddress(hdll, "SdbTagToString");
2108 *(void**)&pSdbOpenDatabase = (void *)GetProcAddress(hdll, "SdbOpenDatabase");
2109 *(void**)&pSdbCreateDatabase = (void *)GetProcAddress(hdll, "SdbCreateDatabase");
2110 *(void**)&pSdbGetDatabaseVersion = (void *)GetProcAddress(hdll, "SdbGetDatabaseVersion");
2111 *(void**)&pSdbCloseDatabase = (void *)GetProcAddress(hdll, "SdbCloseDatabase");
2112 *(void**)&pSdbCloseDatabaseWrite = (void *)GetProcAddress(hdll, "SdbCloseDatabaseWrite");
2113 *(void**)&pSdbGetTagFromTagID = (void *)GetProcAddress(hdll, "SdbGetTagFromTagID");
2114 *(void**)&pSdbWriteNULLTag = (void *)GetProcAddress(hdll, "SdbWriteNULLTag");
2115 *(void**)&pSdbWriteWORDTag = (void *)GetProcAddress(hdll, "SdbWriteWORDTag");
2116 *(void**)&pSdbWriteDWORDTag = (void *)GetProcAddress(hdll, "SdbWriteDWORDTag");
2117 *(void**)&pSdbWriteQWORDTag = (void *)GetProcAddress(hdll, "SdbWriteQWORDTag");
2118 *(void**)&pSdbWriteBinaryTagFromFile = (void *)GetProcAddress(hdll, "SdbWriteBinaryTagFromFile");
2119 *(void**)&pSdbWriteStringTag = (void *)GetProcAddress(hdll, "SdbWriteStringTag");
2120 *(void**)&pSdbWriteStringRefTag = (void *)GetProcAddress(hdll, "SdbWriteStringRefTag");
2121 *(void**)&pSdbBeginWriteListTag = (void *)GetProcAddress(hdll, "SdbBeginWriteListTag");
2122 *(void**)&pSdbEndWriteListTag = (void *)GetProcAddress(hdll, "SdbEndWriteListTag");
2123 *(void**)&pSdbFindFirstTag = (void *)GetProcAddress(hdll, "SdbFindFirstTag");
2124 *(void**)&pSdbFindNextTag = (void *)GetProcAddress(hdll, "SdbFindNextTag");
2125 *(void**)&pSdbFindFirstNamedTag = (void *)GetProcAddress(hdll, "SdbFindFirstNamedTag");
2126 *(void**)&pSdbReadWORDTag = (void *)GetProcAddress(hdll, "SdbReadWORDTag");
2127 *(void**)&pSdbReadDWORDTag = (void *)GetProcAddress(hdll, "SdbReadDWORDTag");
2128 *(void**)&pSdbReadQWORDTag = (void *)GetProcAddress(hdll, "SdbReadQWORDTag");
2129 *(void**)&pSdbReadBinaryTag = (void *)GetProcAddress(hdll, "SdbReadBinaryTag");
2130 *(void**)&pSdbReadStringTag = (void *)GetProcAddress(hdll, "SdbReadStringTag");
2131 *(void**)&pSdbGetTagDataSize = (void *)GetProcAddress(hdll, "SdbGetTagDataSize");
2132 *(void**)&pSdbGetBinaryTagData = (void *)GetProcAddress(hdll, "SdbGetBinaryTagData");
2133 *(void**)&pSdbGetStringTagPtr = (void *)GetProcAddress(hdll, "SdbGetStringTagPtr");
2134 *(void**)&pSdbGetFirstChild = (void *)GetProcAddress(hdll, "SdbGetFirstChild");
2135 *(void**)&pSdbGetNextChild = (void *)GetProcAddress(hdll, "SdbGetNextChild");
2136 *(void**)&pSdbGetDatabaseID = (void *)GetProcAddress(hdll, "SdbGetDatabaseID");
2137 *(void**)&pSdbGUIDToString = (void *)GetProcAddress(hdll, "SdbGUIDToString");
2138 *(void**)&pSdbInitDatabase = (void *)GetProcAddress(hdll, "SdbInitDatabase");
2139 *(void**)&pSdbReleaseDatabase = (void *)GetProcAddress(hdll, "SdbReleaseDatabase");
2140 *(void**)&pSdbGetMatchingExe = (void *)GetProcAddress(hdll, "SdbGetMatchingExe");
2141 *(void**)&pSdbTagRefToTagID = (void *)GetProcAddress(hdll, "SdbTagRefToTagID");
2142 *(void**)&pSdbTagIDToTagRef = (void *)GetProcAddress(hdll, "SdbTagIDToTagRef");
2143 *(void**)&pSdbMakeIndexKeyFromString = (void *)GetProcAddress(hdll, "SdbMakeIndexKeyFromString");
2144 *(void**)&pSdbQueryData = (void *)GetProcAddress(hdll, "SdbQueryData");
2145 *(void**)&pSdbQueryDataEx = (void *)GetProcAddress(hdll, "SdbQueryDataEx");
2146 *(void**)&pSdbQueryDataExTagID = (void *)GetProcAddress(hdll, "SdbQueryDataExTagID");
2147 *(void**)&pSdbGetLayerTagRef = (void *)GetProcAddress(hdll, "SdbGetLayerTagRef");
2148 *(void**)&pSdbGetDatabaseInformation = (void *)GetProcAddress(hdll, "SdbGetDatabaseInformation");
2149 *(void**)&pSdbFreeDatabaseInformation = (void *)GetProcAddress(hdll, "SdbFreeDatabaseInformation");
2150
2151 test_Sdb();
2152 test_write_ex();
2156 {
2157 case 1:
2158 test_MatchApplications<SDBQUERYRESULT_2k3>();
2159 test_MatchApplicationsEx<SDBQUERYRESULT_2k3>();
2160 break;
2161 case 2:
2162 test_MatchApplications<SDBQUERYRESULT_VISTA>();
2163 test_MatchApplicationsEx<SDBQUERYRESULT_VISTA>();
2164 break;
2165 default:
2166 skip("Skipping tests with SDBQUERYRESULT due to a wrong size reported\n");
2167 break;
2168 }
2169 test_TagRef();
2170 test_Data();
2171 skip("test_SecondaryDB()\n");
2173}
DWORD get_module_version(HMODULE mod)
Definition: data.c:811
void silence_debug_output(void)
Definition: data.c:841
static DWORD g_WinVersion
#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:1980
static int validate_SDBQUERYRESULT_size()
Definition: db.cpp:2054
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:1604
static void test_write_ex(void)
Definition: db.cpp:407
static void test_Data(void)
Definition: db.cpp:1924
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 1924 of file db.cpp.

1925{
1926 WCHAR workdir[MAX_PATH], dbpath[MAX_PATH];
1927 BOOL ret;
1928 HSDB hsdb;
1929
1931 ok(ret, "GetTempPathW error: %d\n", GetLastError());
1932 lstrcatW(workdir, L"apphelp_test");
1933
1935 ok(ret, "CreateDirectoryW error: %d\n", GetLastError());
1936
1937 /* SdbInitDatabase needs an nt-path */
1938 swprintf(dbpath, L"\\??\\%s\\test.sdb", workdir);
1939
1940 if (extract_resource(dbpath + 4, MAKEINTRESOURCEW(101)))
1941 {
1942 hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1943
1944 ok(hsdb != NULL, "Expected a valid database handle\n");
1945
1946 if (!hsdb)
1947 {
1948 skip("SdbInitDatabase not implemented?\n");
1949 }
1950 else
1951 {
1952 test_DataTags(hsdb);
1953 pSdbReleaseDatabase(hsdb);
1954 }
1955 }
1956 else
1957 {
1958 ok(0, "Unable to extract database\n");
1959 }
1960
1961 DeleteFileW(dbpath + 4);
1962
1964 ok(ret, "RemoveDirectoryW error: %d\n", GetLastError());
1965}
static bool extract_resource(const WCHAR *Filename, LPCWSTR ResourceName)
Definition: db.cpp:1468
#define HID_DATABASE_FULLPATH
Definition: db.cpp:33
static void test_DataTags(HSDB hsdb)
Definition: db.cpp:1745
#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:1040

Referenced by START_TEST().

◆ test_DataTags()

static void test_DataTags ( HSDB  hsdb)
static

Definition at line 1745 of file db.cpp.

1746{
1747 PDB pdb = NULL;
1748 TAGID db = TAGID_NULL, layer, exe;
1749 TAGREF trData;
1750 BYTE Buffer[1024];
1751 DWORD dwBufferSize, dwDataType, dwRet;
1752 TAGID tiData;
1753
1754 BOOL ret = pSdbTagRefToTagID(hsdb, TAGID_ROOT, &pdb, NULL);
1755
1756 ok(ret != FALSE, "Expected ret to be TRUE, was: %d\n", ret);
1757 ok(pdb != NULL, "Expected pdb to be valid\n");
1758
1759 if (pdb == NULL)
1760 {
1761 skip("Cannot run tests without pdb\n");
1762 return;
1763 }
1764
1765 db = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
1766 ok(db != NULL, "Expected db to be valid\n");
1767 if (db == TAGID_NULL)
1768 {
1769 skip("Cannot run tests without db\n");
1770 return;
1771 }
1772
1773 layer = pSdbFindFirstNamedTag(pdb, db, TAG_LAYER, TAG_NAME, L"DATA_LAYER");
1774 ok(layer != NULL, "Expected layer to be valid\n");
1775 if (layer == TAGID_NULL)
1776 {
1777 skip("Cannot run tests without layer\n");
1778 return;
1779 }
1780
1781 memset(Buffer, 0xaa, sizeof(Buffer));
1782 dwBufferSize = sizeof(Buffer);
1783 dwDataType = 0x12345;
1784 tiData = 0x111111;
1785 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &tiData);
1786 ok_hex(dwRet, ERROR_SUCCESS);
1787 ok_hex(dwDataType, REG_DWORD);
1788 ok_hex(dwBufferSize, sizeof(DWORD));
1789 ok_hex(*(DWORD*)Buffer, 3333);
1790 ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1791 ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1792
1793 memset(Buffer, 0xaa, sizeof(Buffer));
1794 dwBufferSize = sizeof(Buffer);
1795 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1796 ok_hex(dwRet, ERROR_SUCCESS);
1797 ok_hex(dwBufferSize, sizeof(DWORD));
1798 ok_hex(*(DWORD*)Buffer, 3333);
1799
1801 {
1802 memset(Buffer, 0xaa, sizeof(Buffer));
1803 dwBufferSize = sizeof(Buffer);
1804 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, NULL, NULL);
1806 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1807 }
1808
1809 memset(Buffer, 0xaa, sizeof(Buffer));
1810 dwBufferSize = 1;
1811 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1813 ok_hex(dwBufferSize, sizeof(DWORD));
1814 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1815
1816 memset(Buffer, 0xaa, sizeof(Buffer));
1817 dwBufferSize = sizeof(Buffer);
1818 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, NULL, &dwBufferSize, NULL);
1820 ok_hex(dwBufferSize, sizeof(DWORD));
1821 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1822
1823 memset(Buffer, 0xaa, sizeof(Buffer));
1824 dwBufferSize = sizeof(Buffer);
1825 dwRet = pSdbQueryDataExTagID(pdb, TAGID_NULL, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1826 ok_hex(dwRet, ERROR_NOT_FOUND);
1827 ok_hex(dwBufferSize, sizeof(Buffer));
1828 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1829
1830 memset(Buffer, 0xaa, sizeof(Buffer));
1831 dwBufferSize = sizeof(Buffer);
1832 dwDataType = 0x12345;
1833 tiData = 0x111111;
1834 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA2", &dwDataType, Buffer, &dwBufferSize, &tiData);
1835 ok_hex(dwRet, ERROR_SUCCESS);
1836 ok_hex(dwDataType, REG_QWORD);
1837 ok_hex(dwBufferSize, sizeof(QWORD));
1838 ok(*(QWORD*)Buffer == 4294967295ull, "unexpected value 0x%I64x, expected 4294967295\n", *(QWORD*)Buffer);
1839 ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1840 ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1841
1842 /* Not case sensitive */
1843 memset(Buffer, 0xaa, sizeof(Buffer));
1844 dwBufferSize = sizeof(Buffer);
1845 dwDataType = 0x12345;
1846 tiData = 0x111111;
1847 dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA3", &dwDataType, Buffer, &dwBufferSize, &tiData);
1848 ok_hex(dwRet, ERROR_SUCCESS);
1849 ok_hex(dwDataType, REG_SZ);
1850 ok_hex(dwBufferSize, (int)((wcslen(L"Test string")+1) * sizeof(WCHAR)));
1851 Buffer[_countof(Buffer)-1] = L'\0';
1852 ok_wstr(((WCHAR*)Buffer), L"Test string");
1853 ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1854 ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1855
1856 /* Show that SdbQueryDataEx behaves the same */
1857 memset(Buffer, 0xaa, sizeof(Buffer));
1858 dwBufferSize = sizeof(Buffer);
1859 dwDataType = 0x12345;
1860 trData = 0x111111;
1861 dwRet = pSdbQueryDataEx(hsdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &trData);
1862 ok_hex(dwRet, ERROR_SUCCESS);
1863 ok_hex(dwDataType, REG_DWORD);
1864 ok_hex(dwBufferSize, sizeof(DWORD));
1865 ok_hex(*(DWORD*)Buffer, 3333);
1866 ok(trData != NULL && trData != 0x111111, "Expected trData, got NULL\n");
1867
1868 /* And SdbQueryData as well */
1869 memset(Buffer, 0xaa, sizeof(Buffer));
1870 dwBufferSize = sizeof(Buffer);
1871 dwDataType = 0x12345;
1872 dwRet = pSdbQueryData(hsdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize);
1873 ok_hex(dwRet, ERROR_SUCCESS);
1874 ok_hex(dwDataType, REG_DWORD);
1875 ok_hex(dwBufferSize, sizeof(DWORD));
1876 ok_hex(*(DWORD*)Buffer, 3333);
1877
1878 exe = pSdbFindFirstNamedTag(pdb, db, TAG_EXE, TAG_NAME, L"test_match0.exe");
1879 ok(exe != NULL, "Expected exe to be valid\n");
1880 if (exe == TAGID_NULL)
1881 {
1882 skip("Cannot run tests without exe\n");
1883 return;
1884 }
1885
1886 memset(Buffer, 0xaa, sizeof(Buffer));
1887 dwBufferSize = sizeof(Buffer);
1888 dwDataType = 0x12345;
1889 tiData = 0x111111;
1890 dwRet = pSdbQueryDataExTagID(pdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &tiData);
1891 ok_hex(dwRet, ERROR_NOT_FOUND);
1892 ok_hex(dwDataType, 0x12345);
1893 ok_hex(dwBufferSize, sizeof(Buffer));
1894 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1895 ok(tiData == 0x111111, "Expected 0x111111, got 0x%x\n", tiData);
1896
1897 /* Show that SdbQueryDataEx behaves the same */
1898 memset(Buffer, 0xaa, sizeof(Buffer));
1899 dwBufferSize = sizeof(Buffer);
1900 dwDataType = 0x12345;
1901 trData = 0x111111;
1902 dwRet = pSdbQueryDataEx(hsdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &trData);
1903 ok_hex(dwRet, ERROR_NOT_FOUND);
1904 ok_hex(dwDataType, 0x12345);
1905 ok_hex(dwBufferSize, sizeof(Buffer));
1906 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1908 ok(trData == 0, "Expected 0, got 0x%x\n", trData);
1909 else
1910 ok(trData == 0x111111, "Expected 0x111111, got 0x%x\n", trData);
1911
1912 /* And SdbQueryData as well */
1913 memset(Buffer, 0xaa, sizeof(Buffer));
1914 dwBufferSize = sizeof(Buffer);
1915 dwDataType = 0x12345;
1916 dwRet = pSdbQueryData(hsdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize);
1917 ok_hex(dwRet, ERROR_NOT_FOUND);
1918 ok_hex(dwDataType, 0x12345);
1919 ok_hex(dwBufferSize, sizeof(Buffer));
1920 ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1921}
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
_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 _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:34
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:905
WORD wMonth
Definition: winbase.h:906
WORD wDay
Definition: winbase.h:908

Referenced by test_Sdb().

◆ test_IndexKeyFromString()

static void test_IndexKeyFromString ( void  )
static

Definition at line 1980 of file db.cpp.

1981{
1982#if 0
1983 static WCHAR tmp[] = { 0xabba, 0xbcde, 0x2020, 0x20, 0x4444, 0 };
1984 static WCHAR tmp2[] = { 0xabba, 0xbcde, 0x20, 0x4444, 0 };
1985 static WCHAR tmp3[] = { 0x20, 0xbcde, 0x4041, 0x4444, 0 };
1986 static WCHAR tmp4[] = { 0x20, 0xbcde, 0x4041, 0x4444, 0x4444, 0 };
1987 static WCHAR tmp5[] = { 0x2020, 0xbcde, 0x4041, 0x4444, 0x4444, 0 };
1988 static WCHAR tmp6 [] = { 0x20, 0xbcde, 0x4041, 0x4444, 0x4444, 0x4444, 0};
1989 static WCHAR tmp7 [] = { 0xbcde, 0x4041, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0};
1990 static WCHAR tmp8 [] = { 0xbc00, 0x4041, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0x4444, 0};
1991#endif
1992
1993#if 0
1994 /* This crashes. */
1995 pSdbMakeIndexKeyFromString(NULL);
1996#endif
1997
1998 expect_indexA("", 0x0000000000000000);
1999 expect_indexA("a", 0x4100000000000000);
2000 expect_indexA("aa", 0x4141000000000000);
2001 expect_indexA("aaa", 0x4141410000000000);
2002 expect_indexA("aaaa", 0x4141414100000000);
2003 expect_indexA("aaaaa", 0x4141414141000000);
2004 expect_indexA("aaaaaa", 0x4141414141410000);
2005 expect_indexA("aaaaaaa", 0x4141414141414100);
2006 expect_indexA("aaaaaaaa", 0x4141414141414141);
2007 expect_indexA("aaa aaaaa", 0x4141412041414141);
2008 /* Does not change */
2009 expect_indexA("aaaaaaaaa", 0x4141414141414141);
2010 expect_indexA("aaaaaaaab", 0x4141414141414141);
2011 expect_indexA("aaaaaaaac", 0x4141414141414141);
2012 expect_indexA("aaaaaaaaF", 0x4141414141414141);
2013 /* Upcase */
2014 expect_indexA("AAAAAAAA", 0x4141414141414141);
2015 expect_indexA("ABABABAB", 0x4142414241424142);
2016 expect_indexA("ABABABABZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ", 0x4142414241424142);
2017
2018#if 0
2019 /* These fail, but is that because the codepoints are too weird, or because the func is not correct? */
2020 result = pSdbMakeIndexKeyFromString(tmp);
2021 ok(result == 0xbaabdebc20200000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp),
2022 wine_dbgstr_longlong(0xbaabdebc20200000), wine_dbgstr_longlong(result));
2023
2024 result = pSdbMakeIndexKeyFromString(tmp2);
2025 ok(result == 0xbaabdebc00000000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp2),
2026 wine_dbgstr_longlong(0xbaabdebc00000000), wine_dbgstr_longlong(result));
2027
2028 result = pSdbMakeIndexKeyFromString(tmp3);
2029 ok(result == 0x20debc4140000000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp3),
2030 wine_dbgstr_longlong(0x20debc4140000000), wine_dbgstr_longlong(result));
2031
2032 result = pSdbMakeIndexKeyFromString(tmp4);
2033 ok(result == 0x20debc4140000000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp4),
2034 wine_dbgstr_longlong(0x20debc4140000000), wine_dbgstr_longlong(result));
2035
2036 result = pSdbMakeIndexKeyFromString(tmp5);
2037 ok(result == 0x2020debc41400000, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp5),
2038 wine_dbgstr_longlong(0x2020debc41400000), wine_dbgstr_longlong(result));
2039
2040 result = pSdbMakeIndexKeyFromString(tmp6);
2041 ok(result == 0x20debc4140444400, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp6),
2042 wine_dbgstr_longlong(0x20debc4140444400), wine_dbgstr_longlong(result));
2043
2044 result = pSdbMakeIndexKeyFromString(tmp7);
2045 ok(result == 0xdebc414044444444, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp7),
2046 wine_dbgstr_longlong(0xdebc414044444444), wine_dbgstr_longlong(result));
2047
2048 result = pSdbMakeIndexKeyFromString(tmp8);
2049 ok(result == 0xbc414044444444, "Expected %s to result in %s, was: %s\n", wine_dbgstr_w(tmp8),
2051#endif
2052}
#define expect_indexA
Definition: db.cpp:1978

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 1490 of file db.cpp.

1491{
1493 PWCHAR Vendor, AppName, TestName;
1494 SDBQUERYRESULT_T query;
1495 TAGID dbtag, exetag, tagid;
1496 BOOL ret, Succeed;
1497 PDB pdb;
1498
1499 memset(&query, 0xab, sizeof(query));
1500
1501 ret = pSdbTagRefToTagID(hsdb, 0, &pdb, &tagid);
1502 ok(pdb != NULL && pdb != (PDB)0x12345678, "Expected pdb to be set to a valid pdb, was: %p\n", pdb);
1503
1504 dbtag = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
1505 ok(dbtag != TAGID_NULL, "Expected to get a valid TAG_DATABASE\n");
1506
1507 for (exetag = pSdbFindFirstTag(pdb, dbtag, TAG_EXE); exetag; exetag = pSdbFindNextTag(pdb, dbtag, exetag))
1508 {
1509 tagid = pSdbFindFirstTag(pdb, exetag, TAG_VENDOR);
1510 Vendor = pSdbGetStringTagPtr(pdb, tagid);
1511 if (!Vendor)
1512 continue;
1513 Succeed = !wcsicmp(Vendor, L"Succeed");
1514 if (!Succeed && wcsicmp(Vendor, L"Fail"))
1515 continue;
1516 tagid = pSdbFindFirstTag(pdb, exetag, TAG_APP_NAME);
1517 AppName = pSdbGetStringTagPtr(pdb, tagid);
1518 if (!AppName)
1519 continue;
1520
1521 tagid = pSdbFindFirstTag(pdb, exetag, TAG_NAME);
1522 TestName = pSdbGetStringTagPtr(pdb, tagid);
1523 if (!TestName)
1524 continue;
1525
1526 swprintf(exename, L"%s\\%s", workdir, AppName);
1528
1529 ret = pSdbGetMatchingExe(hsdb, exename, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)&query);
1530 DWORD exe_count = Succeed ? 1 : 0;
1531
1532 if (Succeed && !ret && g_WinVersion == _WIN32_WINNT_WS03)
1533 {
1534 skip("As long as we do not have indexes, we will hit a bug in W2k3\n");
1535#if 0
1536[Info][SdbGetIndex ] index 0x7007(0x600b) was not found in the index table
1537[Info][SdbGetIndex ] index 0x7007(0x6001) was not found in the index table
1538[Info][SdbpSearchDB ] Searching database with no index.
1539[Err ][SdbpSearchDB ] No DATABASE tag found.
1540#endif
1541 }
1542 else
1543 {
1544 if (Succeed)
1545 ok(ret, "SdbGetMatchingExe should not fail for %s.\n", wine_dbgstr_w(TestName));
1546 else
1547 ok(!ret, "SdbGetMatchingExe should not succeed for %s.\n", wine_dbgstr_w(TestName));
1548
1549 ok(query.dwExeCount == exe_count, "Expected dwExeCount to be %d, was %d for %s\n", exe_count, query.dwExeCount, wine_dbgstr_w(TestName));
1550 }
1552 }
1553}
#define test_create_exe
static CHAR AppName[MAX_PATH]
Definition: dem.c:252
static WCHAR no[MAX_STRING_RESOURCE_LEN]
Definition: object.c:2340
#define wcsicmp
Definition: compat.h:15
GLuint index
Definition: glext.h:6031
GLuint in
Definition: glext.h:9616
static char * exename
Definition: process.c:101
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 1409 of file db.cpp.

1410{
1411 WCHAR workdir[MAX_PATH], dbpath[MAX_PATH];
1412 BOOL ret;
1413 HSDB hsdb;
1414
1416 ok(ret, "GetTempPathW error: %d\n", GetLastError());
1417 wcscat(workdir, L"apphelp_test");
1418
1420 ok(ret, "CreateDirectoryW error: %d\n", GetLastError());
1421
1422 /* SdbInitDatabase needs an nt-path */
1423 swprintf(dbpath, L"\\??\\%s\\test.sdb", workdir);
1424
1426
1427 hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1428
1429 ok(hsdb != NULL, "Expected a valid database handle\n");
1430
1431 if (!hsdb)
1432 {
1433 skip("SdbInitDatabase not implemented?\n");
1434 }
1435 else
1436 {
1437 /* now that our enviroment is setup, let's go ahead and run the actual tests.. */
1438 size_t n;
1439 for (n = 0; n < _countof(test_exedata); ++n)
1440 test_mode_generic<SDBQUERYRESULT_T>(workdir, hsdb, n);
1441 pSdbReleaseDatabase(hsdb);
1442 }
1443
1444 DeleteFileW(dbpath + 4);
1445
1447 ok(ret, "RemoveDirectoryW error: %d\n", GetLastError());
1448}
_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 1557 of file db.cpp.

1558{
1559 WCHAR workdir[MAX_PATH], dbpath[MAX_PATH];
1560 BOOL ret;
1561 HSDB hsdb;
1562
1564 ok(ret, "GetTempPathW error: %d\n", GetLastError());
1565 lstrcatW(workdir, L"apphelp_test");
1566
1568 ok(ret, "CreateDirectoryW error: %d\n", GetLastError());
1569
1570 /* SdbInitDatabase needs an nt-path */
1571 swprintf(dbpath, L"\\??\\%s\\test.sdb", workdir);
1572
1573 if (extract_resource(dbpath + 4, MAKEINTRESOURCEW(101)))
1574 {
1575 hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1576
1577 ok(hsdb != NULL, "Expected a valid database handle\n");
1578
1579 if (!hsdb)
1580 {
1581 skip("SdbInitDatabase not implemented?\n");
1582 }
1583 else
1584 {
1585 /* now that our enviroment is setup, let's go ahead and run the actual tests.. */
1586 test_match_ex<SDBQUERYRESULT_T>(workdir, hsdb);
1587 pSdbReleaseDatabase(hsdb);
1588 }
1589 }
1590 else
1591 {
1592 ok(0, "Unable to extract database\n");
1593 }
1594
1595 DeleteFileW(dbpath + 4);
1596
1598 ok(ret, "RemoveDirectoryW error: %d\n", GetLastError());
1599}

◆ test_mode_generic()

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

Definition at line 1229 of file db.cpp.

1230{
1231 WCHAR exename[MAX_PATH], testfile[MAX_PATH];
1232 BOOL ret;
1233 SDBQUERYRESULT_T query;
1234 PDB pdb;
1235 TAGID tagid;
1237 DWORD expect_flags = 0, adwExeFlags_0, exe_count;
1238 UNICODE_STRING exenameNT;
1239
1240 memset(&query, 0xab, sizeof(query));
1241
1244 swprintf(testfile, L"%s\\%s", workdir, test_exedata[cur].extra_file);
1246
1248 {
1249 /* First we try without the file at all. */
1250 DeleteFileW(testfile);
1251 ret = pSdbGetMatchingExe(hsdb, exename, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)&query);
1252 ok(ret == 0, "SdbGetMatchingExe should have failed for %d.\n", cur);
1253 /* Now re-try with the correct file */
1254 test_create_file(testfile, "aaaa", 4);
1255 }
1256
1257#if 0
1258 // Results seem to be cached based on filename, until we can invalidate this, do not test the same filename twice!
1260 // skip exports
1262 ret = pSdbGetMatchingExe(hsdb, exenameW, NULL, NULL, 0, &query);
1263 ok(ret == 0, "SdbGetMatchingExe should have failed for %d.\n", cur);
1264
1267#endif
1268
1270 {
1271 SetEnvironmentVariableA("__COMPAT_LAYER", test_exedata[cur].env_var);
1272 }
1273
1274 ret = pSdbGetMatchingExe(hsdb, exename, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)&query);
1275 ok(ret, "SdbGetMatchingExe should not fail for %d.\n", cur);
1276
1277 exe_count = (test_exedata[cur].env_var == NULL) ? 1 : 0;
1278
1279 ok(query.dwExeCount == exe_count, "Expected dwExeCount to be %d, was %d for %d\n", exe_count, query.dwExeCount, cur);
1280 ok(query.dwLayerCount == test_exedata[cur].dwLayerCount, "Expected dwLayerCount to be %d, was %d for %d\n", test_exedata[cur].dwLayerCount, query.dwLayerCount, cur);
1281 ok(query.dwCustomSDBMap == 1, "Expected dwCustomSDBMap to be 1, was %d for %d\n", query.dwCustomSDBMap, cur);
1282 ok(query.dwLayerFlags == 0, "Expected dwLayerFlags to be 0, was 0x%x for %d\n", query.dwLayerFlags, cur);
1284 ok(query.trApphelp == trApphelp, "Expected trApphelp to be 0x%x, was 0x%x for %d\n", trApphelp, query.trApphelp, cur);
1285
1287 expect_flags = 0;
1288 else if (g_WinVersion < WINVER_WIN8)
1289 expect_flags = 1;
1290 else if (g_WinVersion < WINVER_WIN10)
1291 expect_flags = 0x101;
1292 else
1293 {
1294 expect_flags = 0x121; /* for 2 and 3, this becomes 101 when not elevated. */
1295 if ((cur == 2 || cur == 3) && !IsUserAdmin())
1296 expect_flags &= ~0x20;
1297 }
1298
1300 expect_flags &= ~0x100;
1301
1302 ok(query.dwFlags == expect_flags, "Expected dwFlags to be 0x%x, was 0x%x for %d\n", expect_flags, query.dwFlags, cur);
1303
1304 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);
1305 for (size_t n = 1; n < _countof(query.atrExes); ++n)
1306 ok(query.atrExes[n] == 0, "Expected atrExes[%d] to be 0, was: %x for %d\n", n, query.atrExes[n], cur);
1307
1309 check_adwExeFlags(adwExeFlags_0, query, __FILE__, __LINE__, cur);
1310
1311 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);
1312 for (size_t n = 1; n < _countof(query.atrLayers); ++n)
1313 ok(query.atrLayers[n] == 0, "Expected atrLayers[%d] to be 0, was: %x for %d\n", n, query.atrLayers[0], cur);
1314
1316 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);
1317 else
1318 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);
1319 for (size_t n = 1; n < _countof(query.rgGuidDB); ++n)
1320 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);
1321
1322 if (query.atrExes[0])
1323 {
1324 pdb = (PDB)0x12345678;
1325 tagid = 0x76543210;
1326 ret = pSdbTagRefToTagID(hsdb, query.atrExes[0], &pdb, &tagid);
1327 ok(ret, "SdbTagRefToTagID failed for %d.\n", cur);
1328 ok(pdb != NULL && pdb != (PDB)0x12345678, "SdbTagRefToTagID failed to return a pdb for %d.\n", cur);
1329 ok(tagid != 0 && tagid != 0x76543210, "SdbTagRefToTagID failed to return a tagid for %d.\n", cur);
1330
1331 if (pdb && pdb != (PDB)0x12345678)
1332 {
1333 TAGREF tr = 0x12345678;
1334 TAG tag = pSdbGetTagFromTagID(pdb, tagid);
1336 ok(tag == TAG_EXE, "Expected tag to be TAG_EXE, was 0x%x for %d.\n", tag, cur);
1338
1339 /* And back again */
1340 ret = pSdbTagIDToTagRef(hsdb, pdb, tagid, &tr);
1341 ok(ret, "SdbTagIDToTagRef failed for %d.\n", cur);
1342 ok(tr == query.atrExes[0], "Expected tr to be 0x%x, was 0x%x for %d.\n", query.atrExes[0], tr, cur);
1343 }
1344 else
1345 {
1346 skip("Skipping a bunch of tests because of an invalid pointer\n");
1347 }
1348 }
1349
1351 {
1352 pdb = (PDB)0x12345678;
1353 tagid = 0x76543210;
1354 ret = pSdbTagRefToTagID(hsdb, query.atrLayers[0], &pdb, &tagid);
1355 ok(ret, "SdbTagRefToTagID failed for %d.\n", cur);
1356 ok(pdb != NULL && pdb != (PDB)0x12345678, "SdbTagRefToTagID failed to return a pdb for %d.\n", cur);
1357 ok(tagid != 0 && tagid != 0x76543210, "SdbTagRefToTagID failed to return a tagid for %d.\n", cur);
1358
1359 if (pdb && pdb != (PDB)0x12345678)
1360 {
1361 TAGREF tr = 0x12345678;
1362 TAG tag = pSdbGetTagFromTagID(pdb, tagid);
1364 ok(tag == TAG_LAYER, "Expected tag to be TAG_LAYER, was 0x%x for %d.\n", tag, cur);
1365 match_strw_attr(pdb, tagid, TAG_NAME, L"TestNewMode");
1366
1367 /* And back again */
1368 ret = pSdbTagIDToTagRef(hsdb, pdb, tagid, &tr);
1369 ok(ret, "SdbTagIDToTagRef failed for %d.\n", cur);
1370 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);
1371 }
1372 else
1373 {
1374 skip("Skipping a bunch of tests because of an invalid pointer\n");
1375 }
1376 }
1377
1378 pdb = (PDB)0x12345678;
1379 tagid = 0x76543210;
1380 ret = pSdbTagRefToTagID(hsdb, 0, &pdb, &tagid);
1381 ok(pdb != NULL && pdb != (PDB)0x12345678, "Expected pdb to be set to a valid pdb, was: %p\n", pdb);
1382 ok(tagid == 0, "Expected tagid to be set to 0, was: 0x%x\n", tagid);
1383
1384
1385
1386 if (RtlDosPathNameToNtPathName_U(exename, &exenameNT, NULL, NULL))
1387 {
1388 /*
1389 ERROR,AslPathGetLongFileNameLongpath,110,Long path conversion failed 123 [c0000001]
1390 ERROR,AslPathBuildSignatureLongpath,1086,AslPathGetLongFileNameLongpath failed for \??\C:\Users\MARK~1.DEV\AppData\Local\Temp\apphelp_test\test_allow.exe [c0000001]
1391 */
1392 ret = pSdbGetMatchingExe(hsdb, exenameNT.Buffer, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)&query);
1393 ok(!ret, "SdbGetMatchingExe should not succeed for %d.\n", cur);
1394
1395 RtlFreeUnicodeString(&exenameNT);
1396 }
1397
1399 DeleteFileW(testfile);
1401
1403 {
1404 SetEnvironmentVariableA("__COMPAT_LAYER", NULL);
1405 }
1406}
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:1215
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
static BOOL IsUserAdmin()
Definition: db.cpp:1192
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)
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
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
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
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 1604 of file db.cpp.

1605{
1606 WCHAR tmpdir[MAX_PATH], dbpath[MAX_PATH];
1607 BOOL ret;
1608 HSDB hsdb;
1609 PDB pdb;
1610 TAGID db;
1611 DWORD size;
1612 TAGREF tr;
1613
1615 ok(ret, "GetTempPathA error: %d\n", GetLastError());
1616
1617 /* SdbInitDatabase needs an nt-path */
1618 swprintf(dbpath, L"\\??\\%stest.sdb", tmpdir);
1619
1621
1622 hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1623
1624 /* HSDB is the only arg that can't be null */
1625 ret = pSdbTagRefToTagID(hsdb, 0, NULL, NULL);
1626 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1627
1629
1630 pdb = (PDB)&db;
1631 db = 12345;
1632 ret = pSdbTagRefToTagID(hsdb, size - 1, &pdb, &db);
1633 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1634 ok(pdb != NULL, "Expected a result, got: %p\n", pdb);
1635 ok(db == (size - 1), "Expected %u, got: %u\n", size - 1, db);
1636
1637 /* Convert it back. */
1638 tr = 0x12345678;
1639 ret = pSdbTagIDToTagRef(hsdb, pdb, db, &tr);
1640 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1641 ok(tr == (size - 1), "Expected %u, got: %u\n", size - 1, tr);
1642
1643 pdb = (PDB)&db;
1644 db = 12345;
1645 ret = pSdbTagRefToTagID(hsdb, size, &pdb, &db);
1646 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1647 ok(pdb != NULL, "Expected a result, got: %p\n", pdb);
1648 ok(db == size, "Expected %u, got: %u\n", size, db);
1649
1650 tr = 0x12345678;
1651 ret = pSdbTagIDToTagRef(hsdb, pdb, db, &tr);
1652 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1653 ok(tr == size, "Expected %u, got: %u\n", size, tr);
1654
1655 pdb = (PDB)&db;
1656 db = 12345;
1657 ret = pSdbTagRefToTagID(hsdb, size + 1, &pdb, &db);
1658 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1659 ok(pdb != NULL, "Expected a result, got: %p\n", pdb);
1660 ok(db == (size + 1), "Expected %u, got: %u\n", size + 1, db);
1661
1662 tr = 0x12345678;
1663 ret = pSdbTagIDToTagRef(hsdb, pdb, db, &tr);
1664 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1665 ok(tr == (size + 1), "Expected %u, got: %u\n", (size + 1), tr);
1666
1667 pdb = (PDB)&db;
1668 db = 12345;
1669 ret = pSdbTagRefToTagID(hsdb, 0x0fffffff, &pdb, &db);
1670 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1671 ok(pdb != NULL, "Expected a result, got: %p\n", pdb);
1672 ok(db == 0x0fffffff, "Expected %u, got: %u\n", 0x0fffffff, db);
1673
1674 tr = 0x12345678;
1675 ret = pSdbTagIDToTagRef(hsdb, pdb, db, &tr);
1676 ok(ret == TRUE, "Expected ret to be TRUE, was: %d\n", ret);
1677 ok(tr == 0x0fffffff, "Expected %u, got: %u\n", 0x0fffffff, tr);
1678
1679 pdb = (PDB)&db;
1680 db = 12345;
1681 ret = pSdbTagRefToTagID(hsdb, 0x10000000, &pdb, &db);
1682 ok(ret == FALSE, "Expected ret to be FALSE, was: %d\n", ret);
1683 ok(pdb == NULL, "Expected no result, got: %p\n", pdb);
1684 ok(db == 0, "Expected no result, got: 0x%x\n", db);
1685
1686 tr = 0x12345678;
1687 ret = pSdbTagIDToTagRef(hsdb, pdb, 0x10000000, &tr);
1688 ok(ret == FALSE, "Expected ret to be TRUE, was: %d\n", ret);
1689 ok(tr == 0, "Expected %u, got: %u\n", 0, tr);
1690
1691 pdb = NULL;
1692 db = TAGID_NULL;
1693 ret = pSdbTagRefToTagID(hsdb, TAGID_ROOT, &pdb, NULL);
1694 ok(ret != FALSE, "Expected ret to be TRUE, was: %d\n", ret);
1695 ok(pdb != NULL, "Expected pdb to be valid\n");
1696
1697 if (pdb == NULL)
1698 {
1699 skip("Cannot run tests without pdb\n");
1700 }
1701 else
1702 {
1703 db = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
1704 if (db != TAGID_NULL)
1705 {
1706 TAGID child;
1707 child = pSdbGetFirstChild(pdb, db);
1708 while (child != TAGID_NULL)
1709 {
1710 PDB pdb_res;
1711 TAGID tagid_res;
1712 /* We are using a TAGID as a TAGREF here. */
1713 ret = pSdbTagRefToTagID(hsdb, child, &pdb_res, &tagid_res);
1714 ok(ret, "Expected SdbTagRefToTagID to succeed\n");
1715
1716 /* For simple cases (primary DB) TAGREF == TAGID */
1717 tr = 0x12345678;
1718 ret = pSdbTagIDToTagRef(hsdb, pdb_res, tagid_res, &tr);
1719 ok(ret, "Expected SdbTagIDToTagRef to succeed\n");
1720 ok_hex(tr, (int)tagid_res);
1721
1722 child = pSdbGetNextChild(pdb, db, child);
1723 }
1724 }
1725 else
1726 {
1727 skip("Cannot run tests without valid db tag\n");
1728 }
1729 }
1730
1731 /* Get a tagref for our own layer */
1732 tr = pSdbGetLayerTagRef(hsdb, L"TestNewMode");
1733 ok_hex(tr, 0x18e);
1734
1735 /* We cannot find a tagref from the main database. */
1736 tr = pSdbGetLayerTagRef(hsdb, L"256Color");
1737 ok_hex(tr, 0);
1738
1739 pSdbReleaseDatabase(hsdb);
1740
1741 DeleteFileW(dbpath + 4);
1742}
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 2054 of file db.cpp.

2055{
2056 unsigned char buffer[SDBQUERYRESULT_EXPECTED_SIZE_VISTA * 2];
2058 size_t n;
2059
2060 memset(buffer, 0xab, sizeof(buffer));
2061
2063 pSdbGetMatchingExe(NULL, path, NULL, NULL, 0, (SDBQUERYRESULT_VISTA*)buffer);
2064 if (buffer[0] == 0xab)
2065 {
2066 trace("SdbGetMatchingExe didnt do anything, cannot determine SDBQUERYRESULT size\n");
2067 return 0;
2068 }
2069
2071 {
2072 return 1;
2073 }
2074
2076 {
2077 return 2;
2078 }
2079
2080 for (n = 0; n < _countof(buffer); ++n)
2081 {
2082 if (buffer[n] != 0xab)
2083 {
2084 trace("Unknown size: %i\n", n);
2085 break;
2086 }
2087 }
2088
2089 return 0;
2090}
#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 1450 of file db.cpp.

1451{
1452 BOOL Success;
1453 DWORD dwWritten;
1455
1457 {
1458 skip("Failed to create temp file %ls, error %u\n", FileName, GetLastError());
1459 return FALSE;
1460 }
1461 Success = WriteFile(Handle, Data, Size, &dwWritten, NULL);
1462 ok(Success == TRUE, "WriteFile failed with %u\n", GetLastError());
1463 ok(dwWritten == Size, "WriteFile wrote %u bytes instead of %u\n", dwWritten, Size);
1465 return Success && (dwWritten == Size);
1466}
@ 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_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(), 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(), 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().