#ifndef COSMOPOLITAN_LIBC_NT_STATUS_H_
#define COSMOPOLITAN_LIBC_NT_STATUS_H_

/* high two bits = {success,informational,warning,error} */
#define kNtStatusSuccess                  0x00000000u /* success statuses */
#define kNtStatusWait0                    0x00000000u
#define kNtStatusAbandonedWait0           0x00000080u
#define kNtStatusUserApc                  0x000000C0u
#define kNtStatusTimeout                  0x00000102u
#define kNtStatusPending                  0x00000103u
#define kNtStatusGuardPageViolation       0x80000001u /* warning statuses */
#define kNtStatusDatatypeMisalignment     0x80000002u
#define kNtStatusBreakpoint               0x80000003u
#define kNtStatusSingleStep               0x80000004u
#define kNtStatusLongjump                 0x80000026u
#define kNtStatusUnwindConsolidate        0x80000029u
#define kNtStatusAccessViolation          0xC0000005u /* error statuses */
#define kNtStatusInPageError              0xC0000006u
#define kNtStatusInvalidHandle            0xC0000008u
#define kNtStatusInvalidParameter         0xC000000Du
#define kNtStatusNoMemory                 0xC0000017u
#define kNtStatusIllegalInstruction       0xC000001Du
#define kNtStatusNoncontinuableException  0xC0000025u
#define kNtStatusInvalidDisposition       0xC0000026u
#define kNtStatusArrayBoundsExceeded      0xC000008Cu
#define kNtStatusFloatDenormalOperand     0xC000008Du
#define kNtStatusFloatDivideByZero        0xC000008Eu
#define kNtStatusFloatInexactResult       0xC000008Fu
#define kNtStatusFloatInvalidOperation    0xC0000090u
#define kNtStatusFloatOverflow            0xC0000091u
#define kNtStatusFloatStackCheck          0xC0000092u
#define kNtStatusFloatUnderflow           0xC0000093u
#define kNtStatusIntegerDivideBYZero      0xC0000094u
#define kNtStatusIntegerOverflow          0xC0000095u
#define kNtStatusPrivilegedInstruction    0xC0000096u
#define kNtStatusStackOverflow            0xC00000FDu
#define kNtStatusDllNotFound              0xC0000135u
#define kNtStatusOrdinalNotFound          0xC0000138u
#define kNtStatusEntrypointNotFound       0xC0000139u
#define kNtStatusControlCExit             0xC000013Au
#define kNtStatusDllInitFailed            0xC0000142u
#define kNtStatusFloatMultipleFaults      0xC00002B4u
#define kNtStatusFloatMultipleTraps       0xC00002B5u
#define kNtStatusRegNatConsumption        0xC00002C9u
#define kNtStatusHeapCorruption           0xC0000374u
#define kNtStatusStackBufferOverrun       0xC0000409u
#define kNtStatusInvalidCruntimeParameter 0xC0000417u
#define kNtStatusAssertionFailure         0xC0000420u
#define kNtStatusEnclaveViolation         0xC00004A2u
#define kNtStatusSegmentNotification      0x40000005u
#define kNtStatusFatalAppExit             0x40000015u
#define kNtStatusNotFound                 0xC0000225u
#define kNtStatusCancelled                0xC0000120u

#define kNtDbgExceptionHandled    0x00010001u
#define kNtDbgContinue            0x00010002u
#define kNtDbgReplyLater          0x40010001u
#define kNtDbgTerminateThread     0x40010003u
#define kNtDbgTerminateProcess    0x40010004u
#define kNtDbgControlC            0x40010005u
#define kNtDbgPrintexceptionC     0x40010006u
#define kNtDbgRipexception        0x40010007u
#define kNtDbgControlBreak        0x40010008u
#define kNtDbgCommandException    0x40010009u
#define kNtDbgPrintexceptionWideC 0x4001000Au
#define kNtDbgExceptionNotHandled 0x80010001u
#define kNtStillActive            kNtStatusPending

#if !(__ASSEMBLER__ + __LINKER__ + 0)

typedef uint32_t NtStatus;

#define NtSuccess(s)      ((NtStatus)(s) >= 0)
#define NtInformation(s)  (NtSeverity(s) == 1)
#define NtWarning(s)      (NtSeverity(s) == 2)
#define NtError(s)        (NtSeverity(s) == 3)
#define NtCode(s)         ((NtStatus)(s) & 0xffff)
#define NtSeverity(s)     ((NtStatus)(s) >> 30)
#define NtFacility(s)     (((NtStatus)(s) >> 16) & 0xfff)
#define NtFacilityCode(s) ((NtStatus)(s) & 0x0FFFFFFF)

#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_NT_STATUS_H_ */
