    {-# LINE 1 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

    {-# LINE 2 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
    {-# LANGUAGE Safe #-}

    {-# LINE 6 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
    -----------------------------------------------------------------------------

    -- |

    -- Module      :  System.Win32.Info.Internal

    -- Copyright   :  (c) Alastair Reid, 1997-2003

    -- License     :  BSD-style (see the file libraries/base/LICENSE)

    --

    -- Maintainer  :  Esa Ilari Vuokko <ei@vuokko.info>

    -- Stability   :  provisional

    -- Portability :  portable

    --

    -- A collection of FFI declarations for interfacing with Win32.

    --

    -----------------------------------------------------------------------------

    module System.Win32.Info.Internal where

    import Foreign.Ptr (Ptr)
    import Foreign.Storable (Storable(..))
    import System.Win32.Types (DWORD, LPDWORD, LPCTSTR, LPTSTR, LPVOID, UINT, WORD)

    {-# LINE 29 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

    #include "windows_cconv.h"

    ----------------------------------------------------------------

    -- Environment Strings

    ----------------------------------------------------------------

    -- %fun ExpandEnvironmentStrings :: String -> IO String

    ----------------------------------------------------------------

    -- Computer Name

    ----------------------------------------------------------------

    -- %fun GetComputerName :: IO String

    -- %fun SetComputerName :: String -> IO ()

    -- %end free(arg1)

    ----------------------------------------------------------------

    -- Hardware Profiles

    ----------------------------------------------------------------

    -- %fun GetCurrentHwProfile :: IO HW_PROFILE_INFO

    ----------------------------------------------------------------

    -- Keyboard Type

    ----------------------------------------------------------------

    -- %fun GetKeyboardType :: KeyboardTypeKind -> IO KeyboardType

    ----------------------------------------------------------------

    -- System Color

    ----------------------------------------------------------------

    type SystemColor   = UINT

    -- ToDo: This list is out of date.

    cOLOR_SCROLLBAR       :: SystemColor
    cOLOR_SCROLLBAR :: SMSetting
    cOLOR_SCROLLBAR       =  SMSetting
    0
    cOLOR_BACKGROUND      :: SystemColor
    cOLOR_BACKGROUND :: SMSetting
    cOLOR_BACKGROUND      =  SMSetting
    1
    cOLOR_ACTIVECAPTION   :: SystemColor
    cOLOR_ACTIVECAPTION :: SMSetting
    cOLOR_ACTIVECAPTION   =  SMSetting
    2
    cOLOR_INACTIVECAPTION  :: SystemColor
    cOLOR_INACTIVECAPTION :: SMSetting
    cOLOR_INACTIVECAPTION  =  SMSetting
    3
    cOLOR_MENU            :: SystemColor
    cOLOR_MENU :: SMSetting
    cOLOR_MENU            =  SMSetting
    4
    cOLOR_WINDOW          :: SystemColor
    cOLOR_WINDOW :: SMSetting
    cOLOR_WINDOW          =  SMSetting
    5
    cOLOR_WINDOWFRAME     :: SystemColor
    cOLOR_WINDOWFRAME :: SMSetting
    cOLOR_WINDOWFRAME     =  SMSetting
    6
    cOLOR_MENUTEXT        :: SystemColor
    cOLOR_MENUTEXT :: SMSetting
    cOLOR_MENUTEXT        =  SMSetting
    7
    cOLOR_WINDOWTEXT      :: SystemColor
    cOLOR_WINDOWTEXT :: SMSetting
    cOLOR_WINDOWTEXT      =  SMSetting
    8
    cOLOR_CAPTIONTEXT     :: SystemColor
    cOLOR_CAPTIONTEXT :: SMSetting
    cOLOR_CAPTIONTEXT     =  SMSetting
    9
    cOLOR_ACTIVEBORDER    :: SystemColor
    cOLOR_ACTIVEBORDER :: SMSetting
    cOLOR_ACTIVEBORDER    =  SMSetting
    10
    cOLOR_INACTIVEBORDER  :: SystemColor
    cOLOR_INACTIVEBORDER :: SMSetting
    cOLOR_INACTIVEBORDER  =  SMSetting
    11
    cOLOR_APPWORKSPACE    :: SystemColor
    cOLOR_APPWORKSPACE :: SMSetting
    cOLOR_APPWORKSPACE    =  SMSetting
    12
    cOLOR_HIGHLIGHT       :: SystemColor
    cOLOR_HIGHLIGHT :: SMSetting
    cOLOR_HIGHLIGHT       =  SMSetting
    13
    cOLOR_HIGHLIGHTTEXT   :: SystemColor
    cOLOR_HIGHLIGHTTEXT :: SMSetting
    cOLOR_HIGHLIGHTTEXT   =  SMSetting
    14
    cOLOR_BTNFACE         :: SystemColor
    cOLOR_BTNFACE :: SMSetting
    cOLOR_BTNFACE         =  SMSetting
    15
    cOLOR_BTNSHADOW       :: SystemColor
    cOLOR_BTNSHADOW :: SMSetting
    cOLOR_BTNSHADOW       =  SMSetting
    16
    cOLOR_GRAYTEXT        :: SystemColor
    cOLOR_GRAYTEXT :: SMSetting
    cOLOR_GRAYTEXT        =  SMSetting
    17
    cOLOR_BTNTEXT         :: SystemColor
    cOLOR_BTNTEXT :: SMSetting
    cOLOR_BTNTEXT         =  SMSetting
    18
    cOLOR_INACTIVECAPTIONTEXT  :: SystemColor
    cOLOR_INACTIVECAPTIONTEXT :: SMSetting
    cOLOR_INACTIVECAPTIONTEXT  =  SMSetting
    19
    cOLOR_BTNHIGHLIGHT    :: SystemColor
    cOLOR_BTNHIGHLIGHT :: SMSetting
    cOLOR_BTNHIGHLIGHT    =  SMSetting
    20

    {-# LINE 92 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

    -- %fun GetSysColor :: SystemColor -> IO COLORREF

    -- %fun SetSysColors :: [(SystemColor,COLORREF)] -> IO ()

    ----------------------------------------------------------------

    -- Standard Directories

    ----------------------------------------------------------------

    foreign import WINDOWS_CCONV unsafe "GetWindowsDirectoryW"
      c_getWindowsDirectory :: LPTSTR -> UINT -> IO UINT

    foreign import WINDOWS_CCONV unsafe "GetSystemDirectoryW"
      c_getSystemDirectory :: LPTSTR -> UINT -> IO UINT

    foreign import WINDOWS_CCONV unsafe "GetCurrentDirectoryW"
      c_getCurrentDirectory :: DWORD -> LPTSTR -> IO UINT

    foreign import WINDOWS_CCONV unsafe "GetTempPathW"
      c_getTempPath :: DWORD -> LPTSTR -> IO UINT

    foreign import WINDOWS_CCONV unsafe "GetFullPathNameW"
      c_GetFullPathName :: LPCTSTR -> DWORD -> LPTSTR -> Ptr LPTSTR -> IO DWORD

    foreign import WINDOWS_CCONV unsafe "GetLongPathNameW"
      c_GetLongPathName :: LPCTSTR -> LPTSTR -> DWORD -> IO DWORD

    foreign import WINDOWS_CCONV unsafe "GetShortPathNameW"
      c_GetShortPathName :: LPCTSTR -> LPTSTR -> DWORD -> IO DWORD

    foreign import WINDOWS_CCONV unsafe "SearchPathW"
      c_SearchPath :: LPCTSTR -> LPCTSTR -> LPCTSTR -> DWORD -> LPTSTR -> Ptr LPTSTR
                   -> IO DWORD

    ----------------------------------------------------------------

    -- System Info (Info about processor and memory subsystem)

    ----------------------------------------------------------------

    data ProcessorArchitecture = PaUnknown WORD | PaIntel | PaMips | PaAlpha | PaPpc | PaIa64 | PaIa32OnIa64 | PaAmd64
        deriving (Show,Eq)

    instance Storable ProcessorArchitecture where
        sizeOf _ = sizeOf (undefined::WORD)
        alignment _ = alignment (undefined::WORD)
        poke buf pa = pokeByteOff buf 0 $ case pa of
            PaUnknown w -> w
            PaIntel     -> 0
    {-# LINE 138 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            PaMips      -> 1
    {-# LINE 139 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            PaAlpha     -> 2
    {-# LINE 140 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            PaPpc       -> 3
    {-# LINE 141 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            PaIa64      -> 6
    {-# LINE 142 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

    {-# LINE 143 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            PaIa32OnIa64 -> 10
    {-# LINE 144 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

    {-# LINE 145 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            PaAmd64     -> 9
    {-# LINE 146 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
        peek buf = do
            v <- (peekByteOff buf 0:: IO WORD)
            return $ case v of
                (0) -> PaIntel
    {-# LINE 150 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
                (1)  -> PaMips
    {-# LINE 151 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
                (2) -> PaAlpha
    {-# LINE 152 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
                (3)   -> PaPpc
    {-# LINE 153 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
                (6)  -> PaIa64
    {-# LINE 154 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

    {-# LINE 155 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
                (10) -> PaIa32OnIa64
    {-# LINE 156 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

    {-# LINE 157 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
                (9) -> PaAmd64
    {-# LINE 158 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
                w                                   -> PaUnknown w

    data SYSTEM_INFO = SYSTEM_INFO
        { siProcessorArchitecture :: ProcessorArchitecture
        , siPageSize :: DWORD
        , siMinimumApplicationAddress, siMaximumApplicationAddress :: LPVOID
        , siActiveProcessorMask :: DWORD
        , siNumberOfProcessors :: DWORD
        , siProcessorType :: DWORD
        , siAllocationGranularity :: DWORD
        , siProcessorLevel :: WORD
        , siProcessorRevision :: WORD
        } deriving (Show)

    instance Storable SYSTEM_INFO where
        sizeOf = const (48)
    {-# LINE 174 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
        alignment _ = 8
    {-# LINE 175 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
        poke buf si = do
            ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) buf (siProcessorArchitecture si)
    {-# LINE 177 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 4))             buf (siPageSize si)
    {-# LINE 178 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) buf (siMinimumApplicationAddress si)
    {-# LINE 179 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) buf (siMaximumApplicationAddress si)
    {-# LINE 180 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 24))  buf (siActiveProcessorMask si)
    {-# LINE 181 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 32))   buf (siNumberOfProcessors si)
    {-# LINE 182 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 36))        buf (siProcessorType si)
    {-# LINE 183 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 40)) buf (siAllocationGranularity si)
    {-# LINE 184 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 44))        buf (siProcessorLevel si)
    {-# LINE 185 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            ((\hsc_ptr -> pokeByteOff hsc_ptr 46))     buf (siProcessorRevision si)
    {-# LINE 186 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

        peek buf = do
            processorArchitecture <-
                ((\hsc_ptr -> peekByteOff hsc_ptr 0)) buf
    {-# LINE 190 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            pageSize            <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) buf
    {-# LINE 191 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            minimumApplicationAddress <-
                ((\hsc_ptr -> peekByteOff hsc_ptr 8)) buf
    {-# LINE 193 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            maximumApplicationAddress <-
                ((\hsc_ptr -> peekByteOff hsc_ptr 16)) buf
    {-# LINE 195 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            activeProcessorMask <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) buf
    {-# LINE 196 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            numberOfProcessors  <- ((\hsc_ptr -> peekByteOff hsc_ptr 32)) buf
    {-# LINE 197 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            processorType       <- ((\hsc_ptr -> peekByteOff hsc_ptr 36)) buf
    {-# LINE 198 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            allocationGranularity <-
                ((\hsc_ptr -> peekByteOff hsc_ptr 40)) buf
    {-# LINE 200 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            processorLevel      <- ((\hsc_ptr -> peekByteOff hsc_ptr 44)) buf
    {-# LINE 201 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            processorRevision   <- ((\hsc_ptr -> peekByteOff hsc_ptr 46)) buf
    {-# LINE 202 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}
            return $ SYSTEM_INFO {
                siProcessorArchitecture     = processorArchitecture,
                siPageSize                  = pageSize,
                siMinimumApplicationAddress = minimumApplicationAddress,
                siMaximumApplicationAddress = maximumApplicationAddress,
                siActiveProcessorMask       = activeProcessorMask,
                siNumberOfProcessors        = numberOfProcessors,
                siProcessorType             = processorType,
                siAllocationGranularity     = allocationGranularity,
                siProcessorLevel            = processorLevel,
                siProcessorRevision         = processorRevision
                }

    foreign import WINDOWS_CCONV unsafe "windows.h GetSystemInfo"
        c_GetSystemInfo :: Ptr SYSTEM_INFO -> IO ()

    ----------------------------------------------------------------

    -- System metrics

    ----------------------------------------------------------------

    type SMSetting = UINT

    sM_ARRANGE            :: SMSetting
    sM_ARRANGE            =  56
    sM_CLEANBOOT          :: SMSetting
    sM_CLEANBOOT          =  67
    sM_CMETRICS           :: SMSetting
    sM_CMETRICS           =  97
    sM_CMOUSEBUTTONS      :: SMSetting
    sM_CMOUSEBUTTONS      =  43
    sM_CXBORDER           :: SMSetting
    sM_CXBORDER           =  5
    sM_CYBORDER           :: SMSetting
    sM_CYBORDER           =  6
    sM_CXCURSOR           :: SMSetting
    sM_CXCURSOR           =  13
    sM_CYCURSOR           :: SMSetting
    sM_CYCURSOR           =  14
    sM_CXDLGFRAME         :: SMSetting
    sM_CXDLGFRAME         =  7
    sM_CYDLGFRAME         :: SMSetting
    sM_CYDLGFRAME         =  8
    sM_CXDOUBLECLK        :: SMSetting
    sM_CXDOUBLECLK        =  36
    sM_CYDOUBLECLK        :: SMSetting
    sM_CYDOUBLECLK        =  37
    sM_CXDRAG             :: SMSetting
    sM_CXDRAG             =  68
    sM_CYDRAG             :: SMSetting
    sM_CYDRAG             =  69
    sM_CXEDGE             :: SMSetting
    sM_CXEDGE             =  45
    sM_CYEDGE             :: SMSetting
    sM_CYEDGE             =  46
    sM_CXFRAME            :: SMSetting
    sM_CXFRAME            =  32
    sM_CYFRAME            :: SMSetting
    sM_CYFRAME            =  33
    sM_CXFULLSCREEN       :: SMSetting
    sM_CXFULLSCREEN       =  16
    sM_CYFULLSCREEN       :: SMSetting
    sM_CYFULLSCREEN       =  17
    sM_CXHSCROLL          :: SMSetting
    sM_CXHSCROLL          =  21
    sM_CYVSCROLL          :: SMSetting
    sM_CYVSCROLL          =  20
    sM_CXICON             :: SMSetting
    sM_CXICON             =  11
    sM_CYICON             :: SMSetting
    sM_CYICON             =  12
    sM_CXICONSPACING      :: SMSetting
    sM_CXICONSPACING      =  38
    sM_CYICONSPACING      :: SMSetting
    sM_CYICONSPACING      =  39
    sM_CXMAXIMIZED        :: SMSetting
    sM_CXMAXIMIZED        =  61
    sM_CYMAXIMIZED        :: SMSetting
    sM_CYMAXIMIZED        =  62
    sM_CXMENUCHECK        :: SMSetting
    sM_CXMENUCHECK        =  71
    sM_CYMENUCHECK        :: SMSetting
    sM_CYMENUCHECK        =  72
    sM_CXMENUSIZE         :: SMSetting
    sM_CXMENUSIZE         =  54
    sM_CYMENUSIZE         :: SMSetting
    sM_CYMENUSIZE         =  55
    sM_CXMIN              :: SMSetting
    sM_CXMIN              =  28
    sM_CYMIN              :: SMSetting
    sM_CYMIN              =  29
    sM_CXMINIMIZED        :: SMSetting
    sM_CXMINIMIZED        =  57
    sM_CYMINIMIZED        :: SMSetting
    sM_CYMINIMIZED        =  58
    sM_CXMINTRACK         :: SMSetting
    sM_CXMINTRACK         =  34
    sM_CYMINTRACK         :: SMSetting
    sM_CYMINTRACK         =  35
    sM_CXSCREEN           :: SMSetting
    sM_CXSCREEN           =  0
    sM_CYSCREEN           :: SMSetting
    sM_CYSCREEN           =  1
    sM_CXSIZE             :: SMSetting
    sM_CXSIZE             =  30
    sM_CYSIZE             :: SMSetting
    sM_CYSIZE             =  31
    sM_CXSIZEFRAME        :: SMSetting
    sM_CXSIZEFRAME        =  32
    sM_CYSIZEFRAME        :: SMSetting
    sM_CYSIZEFRAME        =  33
    sM_CXSMICON           :: SMSetting
    sM_CXSMICON           =  49
    sM_CYSMICON           :: SMSetting
    sM_CYSMICON           =  50
    sM_CXSMSIZE           :: SMSetting
    sM_CXSMSIZE           =  52
    sM_CYSMSIZE           :: SMSetting
    sM_CYSMSIZE           =  53
    sM_CXVSCROLL          :: SMSetting
    sM_CXVSCROLL          =  2
    sM_CYHSCROLL          :: SMSetting
    sM_CYHSCROLL          =  3
    sM_CYVTHUMB           :: SMSetting
    sM_CYVTHUMB           =  9
    sM_CYCAPTION          :: SMSetting
    sM_CYCAPTION          =  4
    sM_CYKANJIWINDOW      :: SMSetting
    sM_CYKANJIWINDOW      =  18
    sM_CYMENU             :: SMSetting
    sM_CYMENU             =  15
    sM_CYSMCAPTION        :: SMSetting
    sM_CYSMCAPTION        =  51
    sM_DBCSENABLED        :: SMSetting
    sM_DBCSENABLED        =  42
    sM_DEBUG              :: SMSetting
    sM_DEBUG              =  22
    sM_MENUDROPALIGNMENT  :: SMSetting
    sM_MENUDROPALIGNMENT  =  40
    sM_MIDEASTENABLED     :: SMSetting
    sM_MIDEASTENABLED     =  74
    sM_MOUSEPRESENT       :: SMSetting
    sM_MOUSEPRESENT       =  19
    sM_NETWORK            :: SMSetting
    sM_NETWORK            =  63
    sM_PENWINDOWS         :: SMSetting
    sM_PENWINDOWS         =  41
    sM_SECURE             :: SMSetting
    sM_SECURE             =  44
    sM_SHOWSOUNDS         :: SMSetting
    sM_SHOWSOUNDS         =  70
    sM_SLOWMACHINE        :: SMSetting
    sM_SLOWMACHINE        =  73
    sM_SWAPBUTTON         :: SMSetting
    sM_SWAPBUTTON         =  23

    {-# LINE 292 "libraries\\Win32\\System\\Win32\\Info\\Internal.hsc" #-}

    -- %fun GetSystemMetrics :: SMSetting -> IO Int

    ----------------------------------------------------------------

    -- Thread Desktops

    ----------------------------------------------------------------

    -- %fun GetThreadDesktop :: ThreadId -> IO HDESK

    -- %fun SetThreadDesktop :: ThreadId -> HDESK -> IO ()

    ----------------------------------------------------------------

    -- User name

    ----------------------------------------------------------------

    -- %fun GetUserName :: IO String

    foreign import WINDOWS_CCONV unsafe "windows.h GetUserNameW"
      c_GetUserName :: LPTSTR -> LPDWORD -> IO Bool

    ----------------------------------------------------------------

    -- End

    ----------------------------------------------------------------