module System.Win32.DHCP.Internal where
import Foreign
import Foreign.C
import System.Win32.DLL
import System.Win32.Types
import System.Win32.DHCP.Client
import System.Win32.DHCP.SEARCH_INFO
import System.Win32.DHCP.SUBNET_CLIENT_INFO_ARRAY_V4
import System.Win32.DHCP.SUBNET_ELEMENT_INFO_ARRAY_V4
import System.Win32.DHCP.SUBNET_ELEMENT_DATA_V4
import System.Win32.DHCP.Types
type DeleteClientInfo = CWString -> Ptr SEARCH_INFO -> IO DWORD
foreign import stdcall "dynamic"
mkDeleteClientInfo :: FunPtr DeleteClientInfo -> DeleteClientInfo
type EnumSubnetClientsV4 = CWString -> Word32 -> Ptr RESUME_HANDLE
-> DWORD -> Ptr (Ptr SUBNET_CLIENT_INFO_ARRAY_V4) -> Ptr DWORD
-> Ptr DWORD -> IO DWORD
foreign import stdcall "dynamic"
mkEnumSubnetClientsV4 :: FunPtr EnumSubnetClientsV4
-> EnumSubnetClientsV4
type EnumSubnetElementsV4 = CWString -> Word32 -> CInt -> Ptr RESUME_HANDLE
-> DWORD -> Ptr (Ptr SUBNET_ELEMENT_INFO_ARRAY_V4) -> Ptr DWORD
-> Ptr DWORD -> IO DWORD
foreign import stdcall "dynamic"
mkEnumSubnetElementsV4 :: FunPtr EnumSubnetElementsV4
-> EnumSubnetElementsV4
type GetClientInfoV4 = CWString -> SEARCH_INFO_TYPE -> Ptr ()
-> Ptr (Ptr Client) -> IO DWORD
foreign import stdcall "dynamic"
mkGetClientInfoV4 :: FunPtr GetClientInfoV4 -> GetClientInfoV4
type RemoveSubnetElementV4 = CWString -> Word32 -> Ptr SUBNET_ELEMENT_DATA_V4
-> CInt -> IO DWORD
foreign import stdcall "dynamic"
mkRemoveSubnetElementV4 :: FunPtr RemoveSubnetElementV4
-> RemoveSubnetElementV4
type AddSubnetElementV4 = CWString -> Word32 -> Ptr SUBNET_ELEMENT_DATA_V4
-> IO DWORD
foreign import stdcall "dynamic"
mkAddSubnetElementV4 :: FunPtr AddSubnetElementV4 -> AddSubnetElementV4
type RpcFreeMemory = Ptr () -> IO ()
foreign import stdcall "dynamic"
mkRpcFreeMemory :: FunPtr RpcFreeMemory -> RpcFreeMemory
data DhcpApi = DhcpApi
{ c_DeleteClientInfo :: DeleteClientInfo
, c_EnumSubnetClientsV4 :: EnumSubnetClientsV4
, c_EnumSubnetElementsV4 :: EnumSubnetElementsV4
, c_GetClientInfoV4 :: GetClientInfoV4
, c_RemoveSubnetElementV4 :: RemoveSubnetElementV4
, c_AddSubnetElementV4 :: AddSubnetElementV4
, c_RpcFreeMemory :: RpcFreeMemory
}
loadDHCP :: IO DhcpApi
loadDHCP = do
lib <- loadLibrary "dhcpsapi"
deleteclient <- getProcAddress lib "DhcpDeleteClientInfo"
enumClients <- getProcAddress lib "DhcpEnumSubnetClientsV4"
enumElements <- getProcAddress lib "DhcpEnumSubnetElementsV4"
getclient <- getProcAddress lib "DhcpGetClientInfoV4"
remove <- getProcAddress lib "DhcpRemoveSubnetElementV4"
add <- getProcAddress lib "DhcpAddSubnetElementV4"
rpcfree <- getProcAddress lib "DhcpRpcFreeMemory"
return $ DhcpApi (mkDeleteClientInfo . castPtrToFunPtr $ deleteclient)
(mkEnumSubnetClientsV4 . castPtrToFunPtr $ enumClients)
(mkEnumSubnetElementsV4 . castPtrToFunPtr $ enumElements)
(mkGetClientInfoV4 . castPtrToFunPtr $ getclient)
(mkRemoveSubnetElementV4 . castPtrToFunPtr $ remove)
(mkAddSubnetElementV4 . castPtrToFunPtr $ add)
(mkRpcFreeMemory . castPtrToFunPtr $ rpcfree)
rpcFreeMemory :: DhcpApi -> Ptr a -> IO ()
rpcFreeMemory api ptr = c_RpcFreeMemory api $ castPtr ptr