-- Status.hs ---

-- Copyright (C) 2020 Nerd Ed

-- Author: Nerd Ed <nerded.nerded@gmail.com>

-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation; either version 3
-- of the License, or (at your option) any later version.

-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.

-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.

{-# LANGUAGE DerivingStrategies #-}

-- | This module implement the zycore/zydis status codes.
--
-- Zycore ref: https://github.com/zyantific/zycore-c/blob/71440fa634d1313db735d3262d453be641bb404f/include/Zycore/Status.h#L134
--
-- Zydis ref: https://github.com/zyantific/zydis/blob/675c90ee7bc80d1aa6273e5ecfba0bd293bf89e9/include/Zydis/Status.h#L55
--
module Zydis.Status
  ( ZyanCoreStatus(..)
  , ZydisStatus(..)
  , ZyanStatus
  , ZyanNativeStatus
  , fromZyanNativeStatus
  )
where

import           Data.Bits
import           Data.Word

data ZyanCoreStatus
  = ZyanCoreStatusSuccess
  | ZyanCoreStatusFailed
  | ZyanCoreStatusTrue
  | ZyanCoreStatusFalse
  | ZyanCoreStatusInvalidArgument
  | ZyanCoreStatusInvalidOperation
  | ZyanCoreStatusAccessDenied
  | ZyanCoreStatusNotFound
  | ZyanCoreStatusOutOfRange
  | ZyanCoreStatusInsufficientBufferSize
  | ZyanCoreStatusNotEnoughMemory
  | ZyanCoreStatusBadSystemCall
  | ZyanCoreStatusOutOfResources
  | ZyanCoreStatusMissingDependency
  deriving stock (Int -> ZyanCoreStatus -> ShowS
[ZyanCoreStatus] -> ShowS
ZyanCoreStatus -> String
(Int -> ZyanCoreStatus -> ShowS)
-> (ZyanCoreStatus -> String)
-> ([ZyanCoreStatus] -> ShowS)
-> Show ZyanCoreStatus
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ZyanCoreStatus] -> ShowS
$cshowList :: [ZyanCoreStatus] -> ShowS
show :: ZyanCoreStatus -> String
$cshow :: ZyanCoreStatus -> String
showsPrec :: Int -> ZyanCoreStatus -> ShowS
$cshowsPrec :: Int -> ZyanCoreStatus -> ShowS
Show, ZyanCoreStatus -> ZyanCoreStatus -> Bool
(ZyanCoreStatus -> ZyanCoreStatus -> Bool)
-> (ZyanCoreStatus -> ZyanCoreStatus -> Bool) -> Eq ZyanCoreStatus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ZyanCoreStatus -> ZyanCoreStatus -> Bool
$c/= :: ZyanCoreStatus -> ZyanCoreStatus -> Bool
== :: ZyanCoreStatus -> ZyanCoreStatus -> Bool
$c== :: ZyanCoreStatus -> ZyanCoreStatus -> Bool
Eq)

data ZydisStatus
  = ZydisStatusInvalidMask
  | ZydisStatusMalformedMvex
  | ZydisStatusMalformedEvex
  | ZydisStatusInvalidMap
  | ZydisStatusIllegalRex
  | ZydisStatusIllegalLegacyPFX
  | ZydisStatusIllegalLock
  | ZydisStatusBadRegister
  | ZydisStatusInstructionTooLong
  | ZydisStatusNoMoreData
  | ZydisStatusDecodingError
  | ZydisStatusSkipToken
  deriving stock (Int -> ZydisStatus -> ShowS
[ZydisStatus] -> ShowS
ZydisStatus -> String
(Int -> ZydisStatus -> ShowS)
-> (ZydisStatus -> String)
-> ([ZydisStatus] -> ShowS)
-> Show ZydisStatus
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ZydisStatus] -> ShowS
$cshowList :: [ZydisStatus] -> ShowS
show :: ZydisStatus -> String
$cshow :: ZydisStatus -> String
showsPrec :: Int -> ZydisStatus -> ShowS
$cshowsPrec :: Int -> ZydisStatus -> ShowS
Show, ZydisStatus -> ZydisStatus -> Bool
(ZydisStatus -> ZydisStatus -> Bool)
-> (ZydisStatus -> ZydisStatus -> Bool) -> Eq ZydisStatus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ZydisStatus -> ZydisStatus -> Bool
$c/= :: ZydisStatus -> ZydisStatus -> Bool
== :: ZydisStatus -> ZydisStatus -> Bool
$c== :: ZydisStatus -> ZydisStatus -> Bool
Eq)

type ZyanStatus = Either ZyanCoreStatus ZydisStatus

type IsError = Bool

type ZyanNativeModule = Word16

type ZyanNativeStatusCode = Word32

type ZyanNativeStatus = Word32

-- | Combine the values into a unique error code.
--
-- This function is a direct copy of https://github.com/zyantific/zycore-c/blob/71440fa634d1313db735d3262d453be641bb404f/include/Zycore/Status.h#L67
--
makeZyanNativeStatus
  :: IsError -> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatus
makeZyanNativeStatus :: Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
e ZyanNativeModule
m ZyanNativeStatusCode
c =
  ((if Bool
e then ZyanNativeStatusCode
1 else ZyanNativeStatusCode
0) ZyanNativeStatusCode -> Int -> ZyanNativeStatusCode
forall a. Bits a => a -> Int -> a
`shiftL` Int
31)
    ZyanNativeStatusCode
-> ZyanNativeStatusCode -> ZyanNativeStatusCode
forall a. Bits a => a -> a -> a
.|. ((ZyanNativeModule -> ZyanNativeStatusCode
forall a b. (Integral a, Num b) => a -> b
fromIntegral ZyanNativeModule
m ZyanNativeStatusCode
-> ZyanNativeStatusCode -> ZyanNativeStatusCode
forall a. Bits a => a -> a -> a
.&. ZyanNativeStatusCode
0x7FF) ZyanNativeStatusCode -> Int -> ZyanNativeStatusCode
forall a. Bits a => a -> Int -> a
`shiftL` Int
20)
    ZyanNativeStatusCode
-> ZyanNativeStatusCode -> ZyanNativeStatusCode
forall a. Bits a => a -> a -> a
.|. (ZyanNativeStatusCode
c ZyanNativeStatusCode
-> ZyanNativeStatusCode -> ZyanNativeStatusCode
forall a. Bits a => a -> a -> a
.&. ZyanNativeStatusCode
0xFFFFF)
{-# INLINE makeZyanNativeStatus #-}

-- * Core status

zyanModuleCore :: ZyanNativeModule
zyanModuleCore :: ZyanNativeModule
zyanModuleCore = ZyanNativeModule
0x001
{-# INLINE zyanModuleCore #-}

zyanCoreStatusSuccess :: ZyanNativeStatus
zyanCoreStatusSuccess :: ZyanNativeStatusCode
zyanCoreStatusSuccess = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
False ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x00
{-# INLINE zyanCoreStatusSuccess #-}

zyanCoreStatusFailed :: ZyanNativeStatus
zyanCoreStatusFailed :: ZyanNativeStatusCode
zyanCoreStatusFailed = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x01
{-# INLINE zyanCoreStatusFailed #-}

zyanCoreStatusTrue :: ZyanNativeStatus
zyanCoreStatusTrue :: ZyanNativeStatusCode
zyanCoreStatusTrue = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
False ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x02
{-# INLINE zyanCoreStatusTrue #-}

zyanCoreStatusFalse :: ZyanNativeStatus
zyanCoreStatusFalse :: ZyanNativeStatusCode
zyanCoreStatusFalse = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
False ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x03
{-# INLINE zyanCoreStatusFalse #-}

zyanCoreStatusInvalidArgument :: ZyanNativeStatus
zyanCoreStatusInvalidArgument :: ZyanNativeStatusCode
zyanCoreStatusInvalidArgument = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x04
{-# INLINE zyanCoreStatusInvalidArgument #-}

zyanCoreStatusInvalidOperation :: ZyanNativeStatus
zyanCoreStatusInvalidOperation :: ZyanNativeStatusCode
zyanCoreStatusInvalidOperation = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x05
{-# INLINE zyanCoreStatusInvalidOperation #-}

zyanCoreStatusAccessDenied :: ZyanNativeStatus
zyanCoreStatusAccessDenied :: ZyanNativeStatusCode
zyanCoreStatusAccessDenied = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x06
{-# INLINE zyanCoreStatusAccessDenied #-}

zyanCoreStatusNotFound :: ZyanNativeStatus
zyanCoreStatusNotFound :: ZyanNativeStatusCode
zyanCoreStatusNotFound = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x07
{-# INLINE zyanCoreStatusNotFound #-}

zyanCoreStatusOutOfRange :: ZyanNativeStatus
zyanCoreStatusOutOfRange :: ZyanNativeStatusCode
zyanCoreStatusOutOfRange = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x08
{-# INLINE zyanCoreStatusOutOfRange #-}

zyanCoreStatusInsufficientBufferSize :: ZyanNativeStatus
zyanCoreStatusInsufficientBufferSize :: ZyanNativeStatusCode
zyanCoreStatusInsufficientBufferSize =
  Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x09
{-# INLINE zyanCoreStatusInsufficientBufferSize #-}

zyanCoreStatusNotEnoughMemory :: ZyanNativeStatus
zyanCoreStatusNotEnoughMemory :: ZyanNativeStatusCode
zyanCoreStatusNotEnoughMemory = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x0A
{-# INLINE zyanCoreStatusNotEnoughMemory #-}

zyanCoreStatusBadSystemCall :: ZyanNativeStatus
zyanCoreStatusBadSystemCall :: ZyanNativeStatusCode
zyanCoreStatusBadSystemCall = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x0B
{-# INLINE zyanCoreStatusBadSystemCall #-}

zyanCoreStatusOutOfResources :: ZyanNativeStatus
zyanCoreStatusOutOfResources :: ZyanNativeStatusCode
zyanCoreStatusOutOfResources = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x0C
{-# INLINE zyanCoreStatusOutOfResources #-}

zyanCoreStatusMissingDependency :: ZyanNativeStatus
zyanCoreStatusMissingDependency :: ZyanNativeStatusCode
zyanCoreStatusMissingDependency = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleCore ZyanNativeStatusCode
0x0D
{-# INLINE zyanCoreStatusMissingDependency #-}

-- * Zydis status
zyanModuleZydis :: ZyanNativeModule
zyanModuleZydis :: ZyanNativeModule
zyanModuleZydis = ZyanNativeModule
0x002
{-# INLINE zyanModuleZydis #-}

zydisStatusNoMoreData :: ZyanNativeStatus
zydisStatusNoMoreData :: ZyanNativeStatusCode
zydisStatusNoMoreData = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x00
{-# INLINE zydisStatusNoMoreData #-}

zydisStatusDecodingError :: ZyanNativeStatus
zydisStatusDecodingError :: ZyanNativeStatusCode
zydisStatusDecodingError = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x01
{-# INLINE zydisStatusDecodingError #-}

zydisStatusInstructionTooLong :: ZyanNativeStatus
zydisStatusInstructionTooLong :: ZyanNativeStatusCode
zydisStatusInstructionTooLong = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x02
{-# INLINE zydisStatusInstructionTooLong #-}

zydisStatusBadRegister :: ZyanNativeStatus
zydisStatusBadRegister :: ZyanNativeStatusCode
zydisStatusBadRegister = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x03
{-# INLINE zydisStatusBadRegister #-}

zydisStatusIllegalLock :: ZyanNativeStatus
zydisStatusIllegalLock :: ZyanNativeStatusCode
zydisStatusIllegalLock = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x04
{-# INLINE zydisStatusIllegalLock #-}

zydisStatusIllegalLegacyPFX :: ZyanNativeStatus
zydisStatusIllegalLegacyPFX :: ZyanNativeStatusCode
zydisStatusIllegalLegacyPFX = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x05
{-# INLINE zydisStatusIllegalLegacyPFX #-}

zydisStatusIllegalRex :: ZyanNativeStatus
zydisStatusIllegalRex :: ZyanNativeStatusCode
zydisStatusIllegalRex = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x06
{-# INLINE zydisStatusIllegalRex #-}

zydisStatusInvalidMap :: ZyanNativeStatus
zydisStatusInvalidMap :: ZyanNativeStatusCode
zydisStatusInvalidMap = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x07
{-# INLINE zydisStatusInvalidMap #-}

zydisStatusMalformedEvex :: ZyanNativeStatus
zydisStatusMalformedEvex :: ZyanNativeStatusCode
zydisStatusMalformedEvex = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x08
{-# INLINE zydisStatusMalformedEvex #-}

zydisStatusMalformedMvex :: ZyanNativeStatus
zydisStatusMalformedMvex :: ZyanNativeStatusCode
zydisStatusMalformedMvex = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x09
{-# INLINE zydisStatusMalformedMvex #-}

zydisStatusInvalidMask :: ZyanNativeStatus
zydisStatusInvalidMask :: ZyanNativeStatusCode
zydisStatusInvalidMask = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
True ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x0A
{-# INLINE zydisStatusInvalidMask #-}

zydisStatusSkipToken :: ZyanNativeStatus
zydisStatusSkipToken :: ZyanNativeStatusCode
zydisStatusSkipToken = Bool
-> ZyanNativeModule -> ZyanNativeStatusCode -> ZyanNativeStatusCode
makeZyanNativeStatus Bool
False ZyanNativeModule
zyanModuleZydis ZyanNativeStatusCode
0x0B
{-# INLINE zydisStatusSkipToken #-}

-- | Marshal low level Zyan/Zydis status to our "ZyanStatus".
--
-- This function must cover the complete range of possibilities.
--
fromZyanNativeStatus :: ZyanNativeStatus -> ZyanStatus
fromZyanNativeStatus :: ZyanNativeStatusCode -> ZyanStatus
fromZyanNativeStatus ZyanNativeStatusCode
s
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusSuccess = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusSuccess
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusFailed = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusFailed
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusTrue = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusTrue
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusFalse = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusFalse
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusInvalidArgument = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusInvalidArgument
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusInvalidOperation = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusInvalidOperation
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusAccessDenied = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusAccessDenied
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusNotFound = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusNotFound
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusOutOfRange = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusOutOfRange
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusInsufficientBufferSize = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left
    ZyanCoreStatus
ZyanCoreStatusInsufficientBufferSize
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusNotEnoughMemory = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusNotEnoughMemory
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusBadSystemCall = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusBadSystemCall
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusOutOfResources = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusOutOfResources
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zyanCoreStatusMissingDependency = ZyanCoreStatus -> ZyanStatus
forall a b. a -> Either a b
Left ZyanCoreStatus
ZyanCoreStatusMissingDependency
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusNoMoreData = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusNoMoreData
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusInvalidMask = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusInvalidMask
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusMalformedMvex = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusMalformedMvex
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusMalformedEvex = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusMalformedEvex
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusInvalidMap = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusInvalidMap
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusIllegalRex = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusIllegalRex
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusIllegalLegacyPFX = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusIllegalLegacyPFX
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusIllegalLock = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusIllegalLock
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusBadRegister = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusBadRegister
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusInstructionTooLong = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusInstructionTooLong
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusDecodingError = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusDecodingError
  | ZyanNativeStatusCode
s ZyanNativeStatusCode -> ZyanNativeStatusCode -> Bool
forall a. Eq a => a -> a -> Bool
== ZyanNativeStatusCode
zydisStatusSkipToken = ZydisStatus -> ZyanStatus
forall a b. b -> Either a b
Right ZydisStatus
ZydisStatusSkipToken
  | Bool
otherwise = String -> ZyanStatus
forall a. HasCallStack => String -> a
error (String -> ZyanStatus) -> String -> ZyanStatus
forall a b. (a -> b) -> a -> b
$ String
"Fatal error, missing zyan status code: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> ZyanNativeStatusCode -> String
forall a. Show a => a -> String
show ZyanNativeStatusCode
s
{-# INLINE fromZyanNativeStatus #-}