dist-install\build\System\Win32\Shell.hs

    {-# OPTIONS_GHC -optc-D_WIN32_IE=0x500 #-}
    {-# LINE 1 "libraries\Win32\System\Win32\Shell.hsc" #-}

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

    {-# LINE 6 "libraries\Win32\System\Win32\Shell.hsc" #-}
    -----------------------------------------------------------------------------
    -- |
    -- Module      :  System.Win32.Shell
    -- Copyright   :  (c) The University of Glasgow 2009
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  Esa Ilari Vuokko <ei@vuokko.info>
    -- Stability   :  provisional
    -- Portability :  portable
    --
    -- Win32 stuff from shell32.dll
    --
    -----------------------------------------------------------------------------

    module System.Win32.Shell (
      sHGetFolderPath,
      CSIDL,
      cSIDL_PROFILE,
      cSIDL_APPDATA,
      cSIDL_WINDOWS,
      cSIDL_PERSONAL,
      cSIDL_LOCAL_APPDATA,
      cSIDL_DESKTOPDIRECTORY,
      cSIDL_PROGRAM_FILES,
      SHGetFolderPathFlags,
      sHGFP_TYPE_CURRENT,
      sHGFP_TYPE_DEFAULT
     ) where

    import System.Win32.Types
    import Graphics.Win32.GDI.Types (HWND)

    import Foreign
    import Foreign.C
    import Control.Monad
    import System.IO.Error

    #include "windows_cconv.h"

    -- for SHGetFolderPath stuff

    {-# LINE 47 "libraries\Win32\System\Win32\Shell.hsc" #-}

    {-# LINE 48 "libraries\Win32\System\Win32\Shell.hsc" #-}

    {-# LINE 49 "libraries\Win32\System\Win32\Shell.hsc" #-}

    ----------------------------------------------------------------
    -- SHGetFolderPath
    --
    -- XXX: this is deprecated in Vista and later
    ----------------------------------------------------------------

    type CSIDL = CInt

    cSIDL_PROFILE   :: CSIDL
    cSIDL_PROFILE   =  40
    cSIDL_APPDATA   :: CSIDL
    cSIDL_APPDATA   =  26
    cSIDL_WINDOWS   :: CSIDL
    cSIDL_WINDOWS   =  36
    cSIDL_PERSONAL  :: CSIDL
    cSIDL_PERSONAL  =  5
    cSIDL_LOCAL_APPDATA  :: CSIDL
    cSIDL_LOCAL_APPDATA  =  28
    cSIDL_DESKTOPDIRECTORY  :: CSIDL
    cSIDL_DESKTOPDIRECTORY  =  16
    cSIDL_PROGRAM_FILES  :: CSIDL
    cSIDL_PROGRAM_FILES  =  38

    {-# LINE 67 "libraries\Win32\System\Win32\Shell.hsc" #-}
    -- XXX there are lots more of these

    type SHGetFolderPathFlags = DWORD

    sHGFP_TYPE_CURRENT  :: SHGetFolderPathFlags
    sHGFP_TYPE_CURRENT  =  0
    sHGFP_TYPE_DEFAULT  :: SHGetFolderPathFlags
    sHGFP_TYPE_DEFAULT  =  1

    {-# LINE 75 "libraries\Win32\System\Win32\Shell.hsc" #-}

    sHGetFolderPath :: HWND -> CSIDL -> HANDLE -> SHGetFolderPathFlags -> IO String
    sHGetFolderPath hwnd csidl hdl flags =
      allocaBytes ((260) * ((1))) $ \pstr -> do
    {-# LINE 79 "libraries\Win32\System\Win32\Shell.hsc" #-}
        r <- c_SHGetFolderPath hwnd csidl hdl flags pstr
        when (r < 0) $ raiseUnsupported "sHGetFolderPath"
        peekTString pstr

    raiseUnsupported :: String -> IO ()
    raiseUnsupported loc =
       ioError (ioeSetErrorString (mkIOError illegalOperationErrorType loc Nothing Nothing) "unsupported operation")

    foreign import WINDOWS_CCONV unsafe "SHGetFolderPathW"
      c_SHGetFolderPath :: HWND -> CInt -> HANDLE -> DWORD -> LPTSTR
                        -> IO HRESULT