module System.Win32.SystemServices.Services.SERVICE_TYPE
( SERVICE_TYPE (..)
, peekServiceType
, pokeServiceType
) where
import Text.Printf
import Import
data SERVICE_TYPE
= FILE_SYSTEM_DRIVER
| KERNEL_DRIVER
| WIN32_OWN_PROCESS
| WIN32_SHARE_PROCESS
| SERVICE_INTERACTIVE_PROCESS
deriving (Show)
toDWORD :: SERVICE_TYPE -> DWORD
toDWORD FILE_SYSTEM_DRIVER = 0x00000002
toDWORD KERNEL_DRIVER = 0x00000001
toDWORD WIN32_OWN_PROCESS = 0x00000010
toDWORD WIN32_SHARE_PROCESS = 0x00000020
toDWORD SERVICE_INTERACTIVE_PROCESS = 0x00000100
fromDWORD :: DWORD -> Either String SERVICE_TYPE
fromDWORD 0x00000002 = Right FILE_SYSTEM_DRIVER
fromDWORD 0x00000001 = Right KERNEL_DRIVER
fromDWORD 0x00000010 = Right WIN32_OWN_PROCESS
fromDWORD 0x00000020 = Right WIN32_SHARE_PROCESS
fromDWORD 0x00000100 = Right SERVICE_INTERACTIVE_PROCESS
fromDWORD x = Left $ "Invalid SERVICE_TYPE: " ++ printf "%x" x
peekServiceType :: Ptr DWORD -> IO (Either String SERVICE_TYPE)
peekServiceType ptr = fromDWORD <$> peek ptr
pokeServiceType :: Ptr DWORD -> SERVICE_TYPE -> IO ()
pokeServiceType ptr x = poke ptr . toDWORD $ x