214 lines
6.8 KiB
C
214 lines
6.8 KiB
C
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
randfail.h
|
|
|
|
Abstract :
|
|
|
|
This module contains macros used to instrument code for random failures
|
|
|
|
Author :
|
|
|
|
Sam Neely
|
|
|
|
Revision History :
|
|
|
|
--*/
|
|
|
|
#if !defined(_WINDOWS_) && !defined(_WINBASE_)
|
|
#error This file must be included after other header files
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// If this is a debug build, expose the fTimeToFail(g_TestTrace) entry
|
|
// and a handful of utility macros
|
|
|
|
#if defined(DEBUG)
|
|
extern int __stdcall g_TestTrace(void);
|
|
extern void __stdcall g_TestTraceEnable();
|
|
extern void __stdcall g_TestTraceDisable();
|
|
|
|
#define FAILURE_MACRO0(api,err,ret) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api())
|
|
|
|
#define FAILURE_MACRO1(api,err,ret,arg1) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1))
|
|
|
|
#define FAILURE_MACRO2(api,err,ret,arg1,arg2) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2))
|
|
|
|
#define FAILURE_MACRO3(api,err,ret,arg1,arg2,arg3) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2,arg3))
|
|
|
|
#define FAILURE_MACRO4(api,err,ret,arg1,arg2,arg3,arg4) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2,arg3,arg4))
|
|
|
|
#define FAILURE_MACRO5(api,err,ret,arg1,arg2,arg3,arg4,arg5) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2,arg3,arg4,arg5))
|
|
|
|
#define FAILURE_MACRO6(api,err,ret,arg1,arg2,arg3,arg4,arg5,arg6) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2,arg3,arg4,arg5,\
|
|
arg6))
|
|
|
|
#define FAILURE_MACRO7(api,err,ret,arg1,arg2,arg3,arg4,arg5, \
|
|
arg6,arg7) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2,arg3,arg4,arg5,\
|
|
arg6,arg7))
|
|
|
|
#define FAILURE_MACRO8(api,err,ret,arg1,arg2,arg3,arg4,arg5, \
|
|
arg6,arg7,arg8) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2,arg3,arg4,arg5,\
|
|
arg6,arg7,arg8))
|
|
|
|
#define FAILURE_MACRO9(api,err,ret,arg1,arg2,arg3,arg4,arg5, \
|
|
arg6,arg7,arg8,arg9) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2,arg3,arg4,arg5,\
|
|
arg6,arg7,arg8,arg9))
|
|
|
|
#define FAILURE_MACRO10(api,err,ret,arg1,arg2,arg3,arg4,arg5, \
|
|
arg6,arg7,arg8,arg9,arg10) \
|
|
(g_TestTrace() ? SetLastError(err), ret : api(arg1,arg2,arg3,arg4,arg5,\
|
|
arg6,arg7,arg8,arg9,arg10))
|
|
|
|
#define RandFailDisable() g_TestTraceDisable()
|
|
#define RandFailEnable() g_TestTraceEnable()
|
|
|
|
#else // !DEBUG
|
|
#define RandFailDisable() (void)0
|
|
#define RandFailEnable() (void)0
|
|
|
|
#endif
|
|
|
|
|
|
#if defined(DEBUG) && !defined(NOFAIL_WIN32API)
|
|
|
|
#define CreateDirectoryA(arg1,arg2) \
|
|
FAILURE_MACRO2(CreateDirectoryA, ERROR_ARENA_TRASHED, 0, arg1, arg2)
|
|
#define CreateDirectoryW(arg1,arg2) \
|
|
FAILURE_MACRO2(CreateDirectoryW, ERROR_ARENA_TRASHED, 0, arg1, arg2)
|
|
|
|
#define CreateDirectoryExA(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(CreateDirectoryExA, ERROR_ARENA_TRASHED, 0, \
|
|
arg1,arg2,arg3)
|
|
#define CreateDirectoryExW(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(CreateDirectoryExW, ERROR_ARENA_TRASHED, 0, \
|
|
arg1,arg2,arg3)
|
|
|
|
#define CreateEventA(arg1,arg2,arg3,arg4) \
|
|
FAILURE_MACRO4(CreateEventA, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3,arg4)
|
|
#define CreateEventW(arg1,arg2,arg3,arg4) \
|
|
FAILURE_MACRO4(CreateEventW, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3,arg4)
|
|
|
|
#define CreateFileA(arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
|
|
FAILURE_MACRO7(CreateFileA, ERROR_ARENA_TRASHED, INVALID_HANDLE_VALUE,\
|
|
arg1,arg2,arg3,arg4,arg5,arg6,arg7)
|
|
#define CreateFileW(arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
|
|
FAILURE_MACRO7(CreateFileW, ERROR_ARENA_TRASHED, INVALID_HANDLE_VALUE,\
|
|
arg1,arg2,arg3,arg4,arg5,arg6,arg7)
|
|
|
|
#define CreateFileMappingA(arg1,arg2,arg3,arg4,arg5,arg6) \
|
|
FAILURE_MACRO6(CreateFileMappingA, ERROR_ARENA_TRASHED, NULL,\
|
|
arg1,arg2,arg3,arg4,arg5,arg6)
|
|
#define CreateFileMappingW(arg1,arg2,arg3,arg4,arg5,arg6) \
|
|
FAILURE_MACRO6(CreateFileMappingW, ERROR_ARENA_TRASHED, NULL,\
|
|
arg1,arg2,arg3,arg4,arg5,arg6)
|
|
|
|
#define CreateIoCompletionPort(arg1,arg2,arg3,arg4) \
|
|
FAILURE_MACRO4(CreateIoCompletionPort, ERROR_ARENA_TRASHED, NULL,\
|
|
arg1,arg2,arg3,arg4)
|
|
|
|
#define CreateMutexA(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(CreateMutexA, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
#define CreateMutexW(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(CreateMutexW, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
|
|
#define CreateProcessA(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) \
|
|
FAILURE_MACRO10(CreateProcessA, ERROR_ARENA_TRASHED, 0, \
|
|
arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10)
|
|
#define CreateProcessW(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) \
|
|
FAILURE_MACRO10(CreateProcessW, ERROR_ARENA_TRASHED, 0, \
|
|
arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10)
|
|
|
|
#define CreateSemaphoreA(arg1,arg2,arg3,arg4) \
|
|
FAILURE_MACRO4(CreateSemaphoreA, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3,arg4)
|
|
#define CreateSemaphoreW(arg1,arg2,arg3,arg4) \
|
|
FAILURE_MACRO4(CreateSemaphoreW, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3,arg4)
|
|
|
|
#define CreateThread(arg1,arg2,arg3,arg4,arg5,arg6) \
|
|
FAILURE_MACRO6(CreateThread, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3,arg4,arg5,arg6)
|
|
|
|
#define GetQueuedCompletionStatus(arg1,arg2,arg3,arg4,arg5) \
|
|
FAILURE_MACRO5(GetQueuedCompletionStatus, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3,arg4,arg5)
|
|
|
|
#define OpenEventA(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenEventA, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
#define OpenEventW(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenEventW, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
|
|
#define OpenFileMappingA(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenFileMappingA, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
#define OpenFileMappingW(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenFileMappingW, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
|
|
#define OpenMutexA(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenMutexA, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
#define OpenMutexW(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenMutexW, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
|
|
#define OpenProcess(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenProcess, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
|
|
#define OpenSemaphoreA(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenSemaphoreA, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
#define OpenSemaphoreW(arg1,arg2,arg3) \
|
|
FAILURE_MACRO3(OpenSemaphoreW, ERROR_ARENA_TRASHED, NULL, \
|
|
arg1,arg2,arg3)
|
|
|
|
#define PostQueuedCompletionStatus(arg1,arg2,arg3,arg4) \
|
|
FAILURE_MACRO4(PostQueuedCompletionStatus, ERROR_ARENA_TRASHED, 0, \
|
|
arg1,arg2,arg3,arg4)
|
|
|
|
#define ReadFile(arg1,arg2,arg3,arg4,arg5) \
|
|
FAILURE_MACRO5(ReadFile, ERROR_ARENA_TRASHED, 0, \
|
|
arg1,arg2,arg3,arg4,arg5)
|
|
|
|
#define WriteFile(arg1,arg2,arg3,arg4,arg5) \
|
|
FAILURE_MACRO5(WriteFile, ERROR_ARENA_TRASHED, 0, \
|
|
arg1,arg2,arg3,arg4,arg5)
|
|
|
|
|
|
|
|
#endif
|
|
|
|
#if defined(DEBUG) && !defined(NOFAIL_RANDOM)
|
|
#define fTimeToFail() g_TestTrace()
|
|
#else
|
|
#define fTimeToFail() (0)
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|