/*++ 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