{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE NoImplicitPrelude #-}
module GHC.Internal.Windows (
#if defined(javascript_HOST_ARCH)
) where
#else
BOOL,
LPBOOL,
BYTE,
DWORD,
DDWORD,
UINT,
ULONG,
ErrCode,
HANDLE,
LPWSTR,
LPTSTR,
LPCTSTR,
LPVOID,
LPDWORD,
LPSTR,
LPCSTR,
LPCWSTR,
WORD,
UCHAR,
NTSTATUS,
iNFINITE,
iNVALID_HANDLE_VALUE,
throwGetLastError,
failWith,
getLastError,
getErrorMessage,
errCodeToIOError,
failIf,
failIf_,
failIfNull,
failIfZero,
failIfFalse_,
failUnlessSuccess,
failUnlessSuccessOr,
c_maperrno,
c_maperrno_func,
ddwordToDwords,
dwordsToDdword,
nullHANDLE,
) where
import GHC.Internal.Data.Bits (finiteBitSize, shiftL, shiftR, (.|.), (.&.))
import GHC.Internal.Unicode (isSpace)
import GHC.Internal.Data.OldList
import GHC.Internal.Data.Maybe
import GHC.Internal.Word
import GHC.Internal.Int
import GHC.Internal.Foreign.C.Error
import GHC.Internal.Foreign.C.String
import GHC.Internal.Foreign.C.Types
import GHC.Internal.Foreign.Ptr
import GHC.Internal.Base
import GHC.Internal.Enum (maxBound)
import GHC.Internal.IO
import GHC.Internal.Num
import GHC.Internal.Real (fromIntegral)
import GHC.Internal.System.IO.Error
import qualified GHC.Internal.Numeric
type BOOL = Bool
type LPBOOL = Ptr BOOL
type BYTE = Word8
type DWORD = Word32
type UINT = Word32
type ULONG = Word32
type ErrCode = DWORD
type HANDLE = Ptr ()
type LPWSTR = Ptr CWchar
type LPCTSTR = LPTSTR
type LPVOID = Ptr ()
type LPDWORD = Ptr DWORD
type LPSTR = Ptr CChar
type LPCSTR = LPSTR
type LPCWSTR = LPWSTR
type WORD = Word16
type UCHAR = Word8
type NTSTATUS = Int32
nullHANDLE :: HANDLE
nullHANDLE :: HANDLE
nullHANDLE = HANDLE
forall a. Ptr a
nullPtr
type DDWORD = Word64
type LPTSTR = LPWSTR
iNFINITE :: DWORD
iNFINITE :: Word32
iNFINITE = Word32
0xFFFFFFFF
iNVALID_HANDLE_VALUE :: HANDLE
iNVALID_HANDLE_VALUE :: HANDLE
iNVALID_HANDLE_VALUE = WordPtr -> HANDLE
forall a. WordPtr -> Ptr a
wordPtrToPtr (-WordPtr
1)
throwGetLastError :: String -> IO a
throwGetLastError :: forall a. String -> IO a
throwGetLastError String
where_from =
IO Word32
getLastError IO Word32 -> (Word32 -> IO a) -> IO a
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> Word32 -> IO a
forall a. String -> Word32 -> IO a
failWith String
where_from
failWith :: String -> ErrCode -> IO a
failWith :: forall a. String -> Word32 -> IO a
failWith String
fn_name Word32
err_code =
String -> Word32 -> IO IOException
errCodeToIOError String
fn_name Word32
err_code IO IOException -> (IOException -> IO a) -> IO a
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IOException -> IO a
forall e a. (HasCallStack, Exception e) => e -> IO a
throwIO
errCodeToIOError :: String -> ErrCode -> IO IOError
errCodeToIOError :: String -> Word32 -> IO IOException
errCodeToIOError String
fn_name Word32
err_code = do
msg <- Word32 -> IO String
getErrorMessage Word32
err_code
let errno = Word32 -> Errno
c_maperrno_func Word32
err_code
let msg' = (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhileEnd Char -> Bool
isSpace String
msg
ioerror = String -> Errno -> Maybe Handle -> Maybe String -> IOException
errnoToIOError String
fn_name Errno
errno Maybe Handle
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
IOException -> String -> IOException
`ioeSetErrorString` String
msg'
return ioerror
getErrorMessage :: ErrCode -> IO String
getErrorMessage :: Word32 -> IO String
getErrorMessage Word32
err_code =
IO String -> IO String
forall a. IO a -> IO a
mask_ (IO String -> IO String) -> IO String -> IO String
forall a b. (a -> b) -> a -> b
$ do
c_msg <- Word32 -> IO (Ptr CWchar)
c_getErrorMessage Word32
err_code
if c_msg == nullPtr
then return $ "Error 0x" ++ GHC.Internal.Numeric.showHex err_code ""
else do msg <- peekCWString c_msg
_ <- localFree c_msg
return msg
failIf :: (a -> Bool) -> String -> IO a -> IO a
failIf :: forall a. (a -> Bool) -> String -> IO a -> IO a
failIf a -> Bool
p String
wh IO a
act = do
v <- IO a
act
if p v then throwGetLastError wh else return v
failIf_ :: (a -> Bool) -> String -> IO a -> IO ()
failIf_ :: forall a. (a -> Bool) -> String -> IO a -> IO ()
failIf_ a -> Bool
p String
wh IO a
act = do
v <- IO a
act
if p v then throwGetLastError wh else return ()
failIfNull :: String -> IO (Ptr a) -> IO (Ptr a)
failIfNull :: forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull = (Ptr a -> Bool) -> String -> IO (Ptr a) -> IO (Ptr a)
forall a. (a -> Bool) -> String -> IO a -> IO a
failIf (Ptr a -> Ptr a -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr a
forall a. Ptr a
nullPtr)
failIfZero :: (Eq a, Num a) => String -> IO a -> IO a
failIfZero :: forall a. (Eq a, Num a) => String -> IO a -> IO a
failIfZero = (a -> Bool) -> String -> IO a -> IO a
forall a. (a -> Bool) -> String -> IO a -> IO a
failIf (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0)
failIfFalse_ :: String -> IO Bool -> IO ()
failIfFalse_ :: String -> IO Bool -> IO ()
failIfFalse_ = (Bool -> Bool) -> String -> IO Bool -> IO ()
forall a. (a -> Bool) -> String -> IO a -> IO ()
failIf_ Bool -> Bool
not
failUnlessSuccess :: String -> IO ErrCode -> IO ()
failUnlessSuccess :: String -> IO Word32 -> IO ()
failUnlessSuccess String
fn_name IO Word32
act = do
r <- IO Word32
act
if r == 0 then return () else failWith fn_name r
failUnlessSuccessOr :: ErrCode -> String -> IO ErrCode -> IO Bool
failUnlessSuccessOr :: Word32 -> String -> IO Word32 -> IO Bool
failUnlessSuccessOr Word32
val String
fn_name IO Word32
act = do
r <- IO Word32
act
if r == 0 then return False
else if r == val then return True
else failWith fn_name r
foreign import ccall unsafe "maperrno"
c_maperrno :: IO ()
foreign import ccall unsafe "maperrno_func"
c_maperrno_func :: ErrCode -> Errno
foreign import ccall unsafe "base_getErrorMessage"
c_getErrorMessage :: DWORD -> IO LPWSTR
foreign import ccall unsafe "windows.h LocalFree"
localFree :: Ptr a -> IO (Ptr a)
foreign import ccall unsafe "windows.h GetLastError"
getLastError :: IO ErrCode
ddwordToDwords :: DDWORD -> (DWORD,DWORD)
ddwordToDwords :: Word64 -> (Word32, Word32)
ddwordToDwords Word64
n =
(Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
n Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`shiftR` Word32 -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize (Word32
forall a. HasCallStack => a
undefined :: DWORD))
,Word64 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64
n Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.&. Word32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32
forall a. Bounded a => a
maxBound :: DWORD)))
dwordsToDdword:: (DWORD,DWORD) -> DDWORD
dwordsToDdword :: (Word32, Word32) -> Word64
dwordsToDdword (Word32
hi,Word32
low) = (Word32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
low) Word64 -> Word64 -> Word64
forall a. Bits a => a -> a -> a
.|. (Word32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
hi Word64 -> Int -> Word64
forall a. Bits a => a -> Int -> a
`shiftL` Word32 -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize Word32
hi)
#endif