module System.Win32.SystemServices.Services.SERVICE_TYPE
( SERVICE_TYPE (..)
, peekServiceType
, pokeServiceType
) where
import Foreign
import System.Win32.Types (DWORD)
import Text.Printf
import Control.Error
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 -> Script SERVICE_TYPE
peekServiceType ptr = do
dword <- scriptIO $ peek ptr
hoistEither $ fromDWORD dword
pokeServiceType :: Ptr DWORD -> SERVICE_TYPE -> IO ()
pokeServiceType ptr x = poke ptr . toDWORD $ x