16#define DELAYIMP_NOHOOK 0
17#define DELAYIMP_GLOBALHOOK 1
18#define DELAYIMP_RUNTIMEHOOK 2
33#ifndef FACILITY_VISUALCPP
34#define FACILITY_VISUALCPP ((LONG)0x6d)
38#define VcppException(sev,err) ((sev) | (FACILITY_VISUALCPP<<16) | err)
42#define WINMM_DLLNAME "winmm.dll"
44#define WINMM_DLLNAME "WINMM.dll"
112 "Expected code %u to be processed by the Hook, not the ErrorHandler for %s\n", dliNotify,
target(pdli));
118 "Expected code %u to be processed by the ErrorHandler, not the Hook for %s\n", dliNotify,
target(pdli));
127#if (DELAYIMP_TEST == DELAYIMP_NOHOOK)
128 unsigned lastDli = 0;
133 "Expected g_DliHookExpected[g_DliHookIndex] to be %u, was: %u for %s\n",
139#define CheckDli (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : CheckDli_imp
140#define CheckDliDone (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : CheckDliDone_imp
158 ok(pdli && pdli->
cb >= 36,
"Expected a valid pointer with a struct that is big enough: %p, %lu\n",
159 pdli, pdli ? pdli->
cb : 0
u);
160 if (!pdli || pdli->
cb < 36)
return NULL;
170 char c = procname[0];
191 char* dll = (
char*)pdli->
szDll;
193 dll[0] =
'l'; dll[1] =
'_'; dll[2] =
'm';
197 char* dll = (
char*)pdli->
szDll;
199 dll[0] =
'x'; dll[1] =
'x'; dll[2] =
'x'; dll[3] =
'x'; dll[4] =
'x';
223 ok(pdli->
ppfn !=
NULL,
"Expected ppfn to be valid, was NULL for %s\n",
target(pdli));
224 ok(pdli->
szDll !=
NULL,
"Expected szDll to be valid, was NULL for %s\n",
target(pdli));
226 "Expected dwLastError to be ERROR_SUCCESS, was: %lu for %s\n", pdli->
dwLastError,
target(pdli));
231 ok(pdli->
dlp.
dwOrdinal != 0,
"Expected dwOrdinal to be valid, was NULL for %s\n",
target(pdli));
243 ok(pdli->
hmodCur !=
NULL,
"Expected hmodCur to be valid, was NULL for %s\n",
target(pdli));
248 ok(pdli->
hmodCur !=
NULL,
"Expected hmodCur to be valid, was NULL for %s\n",
target(pdli));
249 ok(pdli->
pfnCur !=
NULL,
"Expected pfnCur to be a valid pointer, was NULL for %s\n",
target(pdli));
253 ok(targetProc !=
NULL,
"This should not happen, the function i need is unavail! (%s!%s)\n",
255 ok(targetProc == pdli->
pfnCur,
"Expected pfnCur to be %p, was %p for %s\n", targetProc, pdli->
pfnCur,
target(pdli));
257 "Expected ppfn to be valid and to result in %p, was: %p(%p) for %s\n",
269 ok(pdli && pdli->
cb >= 36,
270 "Expected a valid pointer with a struct that is big enough: %p, %lu\n", pdli, pdli ? pdli->
cb : 0
u);
271 if (!pdli || pdli->
cb < 36)
return NULL;
290 ok(pdli->
ppfn !=
NULL,
"Expected ppfn to be valid, was NULL for %s\n",
target(pdli));
291 ok(pdli->
szDll !=
NULL,
"Expected szDll to be valid, was NULL for %s\n",
target(pdli));
295 ok(pdli->
dlp.
dwOrdinal != 0,
"Expected dwOrdinal to be valid, was NULL for %s\n",
target(pdli));
302 "Expected dwLastError to be ERROR_MOD_NOT_FOUND, was: %lu for %s\n", pdli->
dwLastError,
target(pdli));
305 ok(pdli->
hmodCur !=
NULL,
"Expected hmodCur to be valid, was NULL for %s\n",
target(pdli));
308 "Expected dwLastError to be ERROR_PROC_NOT_FOUND, was: %lu for %s\n", pdli->
dwLastError,
target(pdli));
320 ok(ExceptionInfo !=
NULL,
"Expected to get exception info\n");
321 ok(ExceptionInfo->ExceptionRecord !=
NULL,
"Expected to get a valid record info\n");
325 skip(
"Skipping other checks, this was not the exception we expected!\n");
329 if (ExceptionInfo && ExceptionInfo->ExceptionRecord)
335 ok(ExceptionRecord->
ExceptionFlags == 0,
"Expected ExceptionFlags to be 0, was: 0x%lx\n",
342 ok(LoadInfo && LoadInfo->
cb >= 36,
"Expected a valid pointer with a struct that is big enough: %p, %lu\n",
343 LoadInfo, LoadInfo ? LoadInfo->
cb : 0);
377#if (DELAYIMP_TEST == DELAYIMP_GLOBALHOOK)
388template<
typename PTR>
393 return reinterpret_cast<PTR>(rva);
394 return reinterpret_cast<PTR>((
reinterpret_cast<PBYTE>(
dos) + rva));
411#if (DELAYIMP_TEST == DELAYIMP_NOHOOK)
413#elif (DELAYIMP_TEST == DELAYIMP_GLOBALHOOK)
421#if (DELAYIMP_TEST == DELAYIMP_GLOBALHOOK)
426#elif (DELAYIMP_TEST == DELAYIMP_RUNTIMEHOOK)
451#if defined(_DELAY_IMP_VER) && _DELAY_IMP_VER == 2 && defined(DELAYLOAD_SUPPORTS_UNLOADING)
454 ok(
mod ==
NULL,
"Expected mod to be NULL, was %p\n",
mod);
456 HRESULT hr = __HrLoadAllImportsForDll(
"WiNmM.DlL");
459 ok(
mod ==
NULL,
"Expected mod to be NULL, was %p\n",
mod);
463 ok(
hr ==
S_OK,
"Expected hr to be S_OK, was %lu\n",
hr);
465 ok(
mod !=
NULL,
"Expected mod to be valid, was NULL\n");
468 ok(
status ==
TRUE,
"Expected __FUnloadDelayLoadedDLL2 to succeed\n");
470 ok(
mod ==
NULL,
"Expected mod to be NULL, was %p\n",
mod);
472 trace(
"Binary compiled without support for unloading\n");
477 skip(
"No IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT found, some advanced features might not work!\n");
512#if (DELAYIMP_TEST == DELAYIMP_NOHOOK)
519#if (DELAYIMP_TEST == DELAYIMP_NOHOOK)
528 ok(
ret == 12345,
"Expected ret to be 12345, was %u\n",
ret);
550#if (DELAYIMP_TEST == DELAYIMP_NOHOOK)
555 skip(
"SymGetOptions until CORE-6504 is fixed\n");
564 ok(opt == 123,
"Expected opt to be 123, was %lu\n", opt);
581 skip(
"MapAndLoad until CORE-6504 is fixed\n");
std::map< E_MODULE, HMODULE > mod
PfnDliHook __pfnDliFailureHook2
PfnDliHook __pfnDliNotifyHook2
Custom delay-loading hooks for loading the Setup DLLs from a suitable path.
_Inout_ PIRP _In_ NTSTATUS ExceptionCode
#define VcppException(sev, err)
unsigned g_winmm_midi_out_close[]
static void CheckDli_imp(unsigned dliNotify, PDelayLoadInfo pdli, BOOL ErrorHandler)
static void SetExpectedDli(unsigned *order)
const char * g_ExpectedDll
PIMAGE_DATA_DIRECTORY delaydir
unsigned * g_DliHookExpected
static void CheckDliDone_imp()
unsigned g_winmm_get_cur_task[]
unsigned g_winmm_mide_in_close[]
LONG ExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo, ULONG ExceptionCode)
FARPROC WINAPI DliFailHook(unsigned dliNotify, PDelayLoadInfo pdli)
static HMODULE g_VersionDll
INT_PTR WINAPI MyFunction()
bool g_BrokenFunctionName
BOOL WINAPI MySfcIsKeyProtected(HKEY KeyHandle, LPCWSTR SubKeyName, REGSAM KeySam)
FARPROC WINAPI DliHook(unsigned dliNotify, PDelayLoadInfo pdli)
PTR Rva2Addr(PIMAGE_DOS_HEADER dos, RVA rva)
const char * g_ExpectedName
@ dliNotePreGetProcAddress
struct DelayLoadInfo * PDelayLoadInfo
FARPROC(WINAPI * PfnDliHook)(unsigned, PDelayLoadInfo)
#define ERROR_MOD_NOT_FOUND
#define GetProcAddress(x, y)
DWORD WINAPI SymGetOptions(void)
BOOL WINAPI MapAndLoad(PCSTR pszImageName, PCSTR pszDllPath, PLOADED_IMAGE pLoadedImage, BOOL bDotDll, BOOL bReadOnly)
BOOL NTAPI IsBadWritePtr(IN LPVOID lp, IN UINT_PTR ucb)
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
HRESULT WINAPI ParseURLA(const char *url, PARSEDURLA *result)
BOOL WINAPI GetFileVersionInfoW(LPCWSTR filename, DWORD handle, DWORD datasize, LPVOID data)
BOOL WINAPI GetFileVersionInfoA(LPCSTR filename, DWORD handle, DWORD datasize, LPVOID data)
_ACRTIMP int __cdecl strcmp(const char *, const char *)
PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS
struct _IMAGE_DOS_HEADER * PIMAGE_DOS_HEADER
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum const GLvoid * addr
GLuint GLdouble GLdouble GLint GLint order
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 * u
#define EXCEPTION_EXECUTE_HANDLER
#define EXCEPTION_CONTINUE_EXECUTION
#define URL_E_INVALID_SYNTAX
void __cdecl winetest_ok(int condition, const char *msg,...) __WINE_PRINTF_ATTR(2
#define MMSYSERR_INVALHANDLE
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING SubKeyName
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
#define PAGE_EXECUTE_READWRITE
#define ERROR_SEVERITY_ERROR
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
#define IMAGE_DOS_SIGNATURE
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionInformation()
DWORD WINAPI mmGetCurrentTask(void)
BOOL WINAPI SfcGetNextProtectedFile(HANDLE RpcHandle, PPROTECTED_FILE_DATA ProtFileData)
BOOL WINAPI SfcIsKeyProtected(HKEY hKey, LPCWSTR lpSubKey, REGSAM samDesired)
struct _EXCEPTION_RECORD * ExceptionRecord
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
BOOL NTAPI VirtualProtect(IN LPVOID lpAddress, IN SIZE_T dwSize, IN DWORD flNewProtect, OUT PDWORD lpflOldProtect)
DWORD WINAPI GetCurrentThreadId(void)
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
#define ERROR_PROC_NOT_FOUND
UINT WINAPI mixerClose(HMIXER hMix)
UINT WINAPI midiOutClose(HMIDIOUT hMidiOut)