호출한 프로세스를 최소한의 오버헤드(성능 낭비없이)로 즉시 종료시키기 위한 함수.
x86, x64 환경에서는 int 29h를 통해서 호출 된다. ARM, ARM64는 MSDN 문서 참고.
code 매개 변수는 ecx를 통하여 전달된다.
장단점 및 특징을 정리한 결과...
1. 빠른 실패 매커니즘은 Windows 8부터 지원된다.
그 이하의 운영 체제에서는 종료 작업은 수행되지만, 액세스 위반이나 UNEXPECTED_KERNEL_MODE_TRAP를 throw하는 방식으로 처리되어 종료 속도가 느려질 수 있다.
2. 명령 포인터(Instruction Pointer; IP) 이외에 다른 메모리 종속성을 가지지 않기 때문에, 메모리가 손상 된 경우에도 안정적인 처리가 가능하다.
3. 유저 모드에서 호출될 경우, 0xC0000409 예외 코드와 원인에 대한 code 매개 변수가 Windows 오류 보고(Windows Error Reporting; WER)를 통해서 처리되고 디버거가 존재할 경우 디버깅을 위한 기회가 제공된다.
4. 커널 모드에서 호출될 경우, KERNEL_SECURITY_CHECK_FAILURE(0x139)를 throw한다. (BSOD)
대표적으로, abort() 함수가 가능한 모든 예외 처리 체인을 호출 한 후(런타임 오류 throw, SEH 호출 등), 최종적으로 __fastfail을 실행한다.
부록) code 매개 변수 (from winnt.h)
#define FAST_FAIL_LEGACY_GS_VIOLATION 0
#define FAST_FAIL_VTGUARD_CHECK_FAILURE 1
#define FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2
#define FAST_FAIL_CORRUPT_LIST_ENTRY 3
#define FAST_FAIL_INCORRECT_STACK 4
#define FAST_FAIL_INVALID_ARG 5
#define FAST_FAIL_GS_COOKIE_INIT 6
#define FAST_FAIL_FATAL_APP_EXIT 7
#define FAST_FAIL_RANGE_CHECK_FAILURE 8
#define FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9
#define FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10
#define FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11
#define FAST_FAIL_INVALID_FIBER_SWITCH 12
#define FAST_FAIL_INVALID_SET_OF_CONTEXT 13
#define FAST_FAIL_INVALID_REFERENCE_COUNT 14
#define FAST_FAIL_INVALID_JUMP_BUFFER 18
#define FAST_FAIL_MRDATA_MODIFIED 19
#define FAST_FAIL_CERTIFICATION_FAILURE 20
#define FAST_FAIL_INVALID_EXCEPTION_CHAIN 21
#define FAST_FAIL_CRYPTO_LIBRARY 22
#define FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT 23
#define FAST_FAIL_INVALID_IMAGE_BASE 24
#define FAST_FAIL_DLOAD_PROTECTION_FAILURE 25
#define FAST_FAIL_UNSAFE_EXTENSION_CALL 26
#define FAST_FAIL_DEPRECATED_SERVICE_INVOKED 27
#define FAST_FAIL_INVALID_BUFFER_ACCESS 28
#define FAST_FAIL_INVALID_BALANCED_TREE 29
#define FAST_FAIL_INVALID_NEXT_THREAD 30
#define FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED 31 // Telemetry, nonfatal
#define FAST_FAIL_APCS_DISABLED 32
#define FAST_FAIL_INVALID_IDLE_STATE 33
#define FAST_FAIL_MRDATA_PROTECTION_FAILURE 34
#define FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION 35
#define FAST_FAIL_INVALID_LOCK_STATE 36
#define FAST_FAIL_GUARD_JUMPTABLE 37 // Known to compiler, must retain value 37
#define FAST_FAIL_INVALID_LONGJUMP_TARGET 38
#define FAST_FAIL_INVALID_DISPATCH_CONTEXT 39
#define FAST_FAIL_INVALID_THREAD 40
#define FAST_FAIL_INVALID_SYSCALL_NUMBER 41 // Telemetry, nonfatal
#define FAST_FAIL_INVALID_FILE_OPERATION 42 // Telemetry, nonfatal
#define FAST_FAIL_LPAC_ACCESS_DENIED 43 // Telemetry, nonfatal
#define FAST_FAIL_GUARD_SS_FAILURE 44
#define FAST_FAIL_LOADER_CONTINUITY_FAILURE 45 // Telemetry, nonfatal
#define FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE 46
#define FAST_FAIL_INVALID_CONTROL_STACK 47
#define FAST_FAIL_SET_CONTEXT_DENIED 48
#define FAST_FAIL_INVALID_IAT 49
#define FAST_FAIL_HEAP_METADATA_CORRUPTION 50
#define FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION 51
#define FAST_FAIL_LOW_LABEL_ACCESS_DENIED 52 // Telemetry, nonfatal
#define FAST_FAIL_ENCLAVE_CALL_FAILURE 53
#define FAST_FAIL_UNHANDLED_LSS_EXCEPTON 54
#define FAST_FAIL_ADMINLESS_ACCESS_DENIED 55 // Telemetry, nonfatal
#define FAST_FAIL_UNEXPECTED_CALL 56
#define FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS 57
#define FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR 58
#define FAST_FAIL_FLAGS_CORRUPTION 59
#define FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF
출처:
MSDN (__fastfail | Microsoft Docs)