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

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

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

-- |

-- Module      :  System.Win32.DLL

-- 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.DLL
    ( disableThreadLibraryCalls
    , freeLibrary
    , getModuleFileName
    , getModuleHandle
    , getProcAddress
    , loadLibrary
    , loadLibraryEx
    , setDllDirectory
    , LoadLibraryFlags
    , lOAD_LIBRARY_AS_DATAFILE
    , lOAD_WITH_ALTERED_SEARCH_PATH
    ) where

import System.Win32.DLL.Internal
import System.Win32.Types

import Foreign
import Foreign.C
import Data.Maybe (fromMaybe)

disableThreadLibraryCalls :: HMODULE -> IO ()
disableThreadLibraryCalls :: HMODULE -> IO ()
disableThreadLibraryCalls HMODULE
hmod =
  String -> IO Bool -> IO ()
failIfFalse_ String
"DisableThreadLibraryCalls" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ HMODULE -> IO Bool
c_DisableThreadLibraryCalls HMODULE
hmod

freeLibrary :: HMODULE -> IO ()
freeLibrary :: HMODULE -> IO ()
freeLibrary HMODULE
hmod =
  String -> IO Bool -> IO ()
failIfFalse_ String
"FreeLibrary" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ HMODULE -> IO Bool
c_FreeLibrary HMODULE
hmod

getModuleFileName :: HMODULE -> IO String
getModuleFileName :: HMODULE -> IO String
getModuleFileName HMODULE
hmod =
  Int -> (Ptr TCHAR -> IO String) -> IO String
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
512 ((Ptr TCHAR -> IO String) -> IO String)
-> (Ptr TCHAR -> IO String) -> IO String
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_str -> do
  String -> IO Bool -> IO ()
failIfFalse_ String
"GetModuleFileName" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ HMODULE -> Ptr TCHAR -> Int -> IO Bool
c_GetModuleFileName HMODULE
hmod Ptr TCHAR
c_str Int
512
  Ptr TCHAR -> IO String
peekTString Ptr TCHAR
c_str

getModuleHandle :: Maybe String -> IO HMODULE
getModuleHandle :: Maybe String -> IO HMODULE
getModuleHandle Maybe String
mb_name =
  (String -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE)
-> Maybe String -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith String -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a. String -> (Ptr TCHAR -> IO a) -> IO a
withTString Maybe String
mb_name ((Ptr TCHAR -> IO HMODULE) -> IO HMODULE)
-> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_name ->
  String -> IO HMODULE -> IO HMODULE
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"GetModuleHandle" (IO HMODULE -> IO HMODULE) -> IO HMODULE -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ Ptr TCHAR -> IO HMODULE
c_GetModuleHandle Ptr TCHAR
c_name

getProcAddress :: HMODULE -> String -> IO Addr
getProcAddress :: HMODULE -> String -> IO HMODULE
getProcAddress HMODULE
hmod String
procname =
  String -> (CString -> IO HMODULE) -> IO HMODULE
forall a. String -> (CString -> IO a) -> IO a
withCAString String
procname ((CString -> IO HMODULE) -> IO HMODULE)
-> (CString -> IO HMODULE) -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ \ CString
c_procname ->
  String -> IO HMODULE -> IO HMODULE
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"GetProcAddress" (IO HMODULE -> IO HMODULE) -> IO HMODULE -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ HMODULE -> CString -> IO HMODULE
c_GetProcAddress HMODULE
hmod CString
c_procname

loadLibrary :: String -> IO HINSTANCE
loadLibrary :: String -> IO HMODULE
loadLibrary String
name =
  String -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a. String -> (Ptr TCHAR -> IO a) -> IO a
withTString String
name ((Ptr TCHAR -> IO HMODULE) -> IO HMODULE)
-> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_name ->
  String -> IO HMODULE -> IO HMODULE
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"LoadLibrary" (IO HMODULE -> IO HMODULE) -> IO HMODULE -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ Ptr TCHAR -> IO HMODULE
c_LoadLibrary Ptr TCHAR
c_name

loadLibraryEx :: String -> HANDLE -> LoadLibraryFlags -> IO HINSTANCE
loadLibraryEx :: String -> HMODULE -> LoadLibraryFlags -> IO HMODULE
loadLibraryEx String
name HMODULE
h LoadLibraryFlags
flags =
  String -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a. String -> (Ptr TCHAR -> IO a) -> IO a
withTString String
name ((Ptr TCHAR -> IO HMODULE) -> IO HMODULE)
-> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_name ->
  String -> IO HMODULE -> IO HMODULE
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"LoadLibraryEx" (IO HMODULE -> IO HMODULE) -> IO HMODULE -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ Ptr TCHAR -> HMODULE -> LoadLibraryFlags -> IO HMODULE
c_LoadLibraryEx Ptr TCHAR
c_name HMODULE
h LoadLibraryFlags
flags

setDllDirectory :: Maybe String -> IO ()
setDllDirectory :: Maybe String -> IO ()
setDllDirectory Maybe String
name =
  (String -> (Ptr TCHAR -> IO ()) -> IO ())
-> Maybe String -> (Ptr TCHAR -> IO ()) -> IO ()
forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith String -> (Ptr TCHAR -> IO ()) -> IO ()
forall a. String -> (Ptr TCHAR -> IO a) -> IO a
withTString Maybe String
name ((Ptr TCHAR -> IO ()) -> IO ()) -> (Ptr TCHAR -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_name ->
  String -> IO Bool -> IO ()
failIfFalse_ ([String] -> String
unwords [String
"SetDllDirectory", String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
"NULL" Maybe String
name]) (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr TCHAR -> IO Bool
c_SetDllDirectory Ptr TCHAR
c_name