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

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

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

-- |

-- Module      :  System.Win32.File.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.File.Internal where

import System.Win32.Types
import System.Win32.Time

import Foreign hiding (void)

#include "windows_cconv.h"




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

-- Enumeration types

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


type AccessMode   = UINT

gENERIC_NONE :: AccessMode
gENERIC_NONE = 0

gENERIC_READ               :: AccessMode
gENERIC_READ               =  2147483648
gENERIC_WRITE              :: Word32
AccessMode
gENERIC_WRITE              =  1073741824
gENERIC_EXECUTE            :: Word32
AccessMode
gENERIC_EXECUTE            =  536870912
gENERIC_ALL                :: AccessMode
gENERIC_ALL                =  268435456
dELETE                     :: AccessMode
dELETE                     =  65536
rEAD_CONTROL               :: AccessMode
rEAD_CONTROL               =  131072
wRITE_DAC                  :: AccessMode
wRITE_DAC                  =  262144
wRITE_OWNER                :: AccessMode
wRITE_OWNER                =  524288
wRITE_OWNER :: Word32
sYNCHRONIZE                :: AccessMode
sYNCHRONIZE                =  1048576
sTANDARD_RIGHTS_REQUIRED   :: AccessMode
sTANDARD_RIGHTS_REQUIRED   =  983040
sTANDARD_RIGHTS_READ       :: AccessMode
sTANDARD_RIGHTS_READ       =  131072
sTANDARD_RIGHTS_WRITE      :: AccessMode
sTANDARD_RIGHTS_WRITE      =  131072
sTANDARD_RIGHTS_EXECUTE    :: AccessMode
sTANDARD_RIGHTS_EXECUTE    =  131072
sTANDARD_RIGHTS_ALL        :: AccessMode
sTANDARD_RIGHTS_ALL        =  2031616
sTANDARD_RIGHTS_ALL :: Word32
sPECIFIC_RIGHTS_ALL        :: AccessMode
sPECIFIC_RIGHTS_ALL        =  65535
aCCESS_SYSTEM_SECURITY     :: AccessMode
aCCESS_SYSTEM_SECURITY     =  16777216
mAXIMUM_ALLOWED            :: AccessMode
mAXIMUM_ALLOWED            =  33554432
fILE_ADD_FILE              :: AccessMode
fILE_ADD_FILE              =  2
fILE_ADD_SUBDIRECTORY      :: AccessMode
fILE_ADD_SUBDIRECTORY      =  4
fILE_ALL_ACCESS            :: AccessMode
fILE_ALL_ACCESS            =  2032127
fILE_APPEND_DATA           :: AccessMode
fILE_APPEND_DATA           =  4
fILE_CREATE_PIPE_INSTANCE  :: AccessMode
fILE_CREATE_PIPE_INSTANCE  =  4
fILE_DELETE_CHILD          :: AccessMode
fILE_DELETE_CHILD          =  64
fILE_EXECUTE               :: AccessMode
fILE_EXECUTE               =  32
fILE_LIST_DIRECTORY        :: AccessMode
fILE_LIST_DIRECTORY        =  1
fILE_READ_ATTRIBUTES       :: AccessMode
fILE_READ_ATTRIBUTES       =  128
fILE_READ_DATA             :: AccessMode
fILE_READ_DATA             =  1
fILE_READ_EA               :: AccessMode
fILE_READ_EA               =  8
fILE_TRAVERSE              :: AccessMode
fILE_TRAVERSE              =  32
fILE_WRITE_ATTRIBUTES      :: AccessMode
fILE_WRITE_ATTRIBUTES      =  256
fILE_WRITE_DATA            :: AccessMode
fILE_WRITE_DATA            =  2
fILE_WRITE_EA              :: AccessMode
fILE_WRITE_EA              =  16

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

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


type ShareMode   = UINT

fILE_SHARE_NONE :: ShareMode
fILE_SHARE_NONE = 0

fILE_SHARE_READ       :: ShareMode
fILE_SHARE_READ       =  1
fILE_SHARE_WRITE      :: ShareMode
fILE_SHARE_WRITE      =  2
fILE_SHARE_DELETE     :: ShareMode
fILE_SHARE_DELETE     =  4

{-# LINE 88 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type CreateMode   = UINT

cREATE_NEW            :: CreateMode
cREATE_NEW            =  1
cREATE_ALWAYS         :: CreateMode
cREATE_ALWAYS         =  2
oPEN_EXISTING         :: CreateMode
oPEN_EXISTING         =  3
oPEN_ALWAYS           :: CreateMode
oPEN_ALWAYS           =  4
tRUNCATE_EXISTING     :: CreateMode
tRUNCATE_EXISTING     =  5

{-# LINE 100 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type FileAttributeOrFlag   = UINT

fILE_ATTRIBUTE_READONLY       :: FileAttributeOrFlag
fILE_ATTRIBUTE_READONLY       =  1
fILE_ATTRIBUTE_HIDDEN         :: FileAttributeOrFlag
fILE_ATTRIBUTE_HIDDEN         =  2
fILE_ATTRIBUTE_SYSTEM         :: FileAttributeOrFlag
fILE_ATTRIBUTE_SYSTEM         =  4
fILE_ATTRIBUTE_DIRECTORY      :: FileAttributeOrFlag
fILE_ATTRIBUTE_DIRECTORY      =  16
fILE_ATTRIBUTE_ARCHIVE        :: FileAttributeOrFlag
fILE_ATTRIBUTE_ARCHIVE        =  32
fILE_ATTRIBUTE_NORMAL         :: FileAttributeOrFlag
fILE_ATTRIBUTE_NORMAL         =  128
fILE_ATTRIBUTE_TEMPORARY      :: FileAttributeOrFlag
fILE_ATTRIBUTE_TEMPORARY      =  256
fILE_ATTRIBUTE_COMPRESSED     :: FileAttributeOrFlag
fILE_ATTRIBUTE_COMPRESSED     =  2048
fILE_ATTRIBUTE_REPARSE_POINT  :: FileAttributeOrFlag
fILE_ATTRIBUTE_REPARSE_POINT  =  1024
fILE_FLAG_WRITE_THROUGH       :: FileAttributeOrFlag
fILE_FLAG_WRITE_THROUGH       =  2147483648
fILE_FLAG_OVERLAPPED          :: FileAttributeOrFlag
fILE_FLAG_OVERLAPPED          =  1073741824
fILE_FLAG_NO_BUFFERING        :: FileAttributeOrFlag
fILE_FLAG_NO_BUFFERING        =  536870912
fILE_FLAG_RANDOM_ACCESS       :: FileAttributeOrFlag
fILE_FLAG_RANDOM_ACCESS       =  268435456
fILE_FLAG_SEQUENTIAL_SCAN     :: FileAttributeOrFlag
fILE_FLAG_SEQUENTIAL_SCAN     =  134217728
fILE_FLAG_DELETE_ON_CLOSE     :: FileAttributeOrFlag
fILE_FLAG_DELETE_ON_CLOSE     =  67108864
fILE_FLAG_BACKUP_SEMANTICS    :: FileAttributeOrFlag
fILE_FLAG_BACKUP_SEMANTICS    =  33554432
fILE_FLAG_POSIX_SEMANTICS     :: FileAttributeOrFlag
fILE_FLAG_POSIX_SEMANTICS     =  16777216

{-# LINE 124 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

{-# LINE 125 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
sECURITY_ANONYMOUS            :: FileAttributeOrFlag
sECURITY_ANONYMOUS            =  0
sECURITY_IDENTIFICATION       :: FileAttributeOrFlag
sECURITY_IDENTIFICATION       =  65536
sECURITY_IMPERSONATION        :: FileAttributeOrFlag
sECURITY_IMPERSONATION        =  131072
sECURITY_DELEGATION           :: FileAttributeOrFlag
sECURITY_DELEGATION           =  196608
sECURITY_CONTEXT_TRACKING     :: FileAttributeOrFlag
sECURITY_CONTEXT_TRACKING     =  262144
sECURITY_EFFECTIVE_ONLY       :: FileAttributeOrFlag
sECURITY_EFFECTIVE_ONLY       =  524288
sECURITY_SQOS_PRESENT         :: FileAttributeOrFlag
sECURITY_SQOS_PRESENT         =  1048576
sECURITY_VALID_SQOS_FLAGS     :: FileAttributeOrFlag
sECURITY_VALID_SQOS_FLAGS     =  2031616

{-# LINE 135 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

{-# LINE 136 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type MoveFileFlag   = DWORD

mOVEFILE_REPLACE_EXISTING     :: MoveFileFlag
mOVEFILE_REPLACE_EXISTING     =  1
mOVEFILE_COPY_ALLOWED         :: MoveFileFlag
mOVEFILE_COPY_ALLOWED         =  2
mOVEFILE_DELAY_UNTIL_REBOOT   :: MoveFileFlag
mOVEFILE_DELAY_UNTIL_REBOOT   =  4

{-# LINE 146 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type FilePtrDirection   = DWORD

fILE_BEGIN    :: FilePtrDirection
fILE_BEGIN    =  0
fILE_CURRENT  :: FilePtrDirection
fILE_CURRENT  =  1
fILE_END      :: FilePtrDirection
fILE_END      =  2

{-# LINE 156 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type DriveType = UINT

dRIVE_UNKNOWN         :: DriveType
dRIVE_UNKNOWN         =  0
dRIVE_NO_ROOT_DIR     :: DriveType
dRIVE_NO_ROOT_DIR     =  1
dRIVE_REMOVABLE       :: DriveType
dRIVE_REMOVABLE       =  2
dRIVE_FIXED           :: DriveType
dRIVE_FIXED           =  3
dRIVE_REMOTE          :: DriveType
dRIVE_REMOTE          =  4
dRIVE_CDROM           :: DriveType
dRIVE_CDROM           =  5
dRIVE_RAMDISK         :: DriveType
dRIVE_RAMDISK         =  6

{-# LINE 170 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type DefineDosDeviceFlags = DWORD

dDD_RAW_TARGET_PATH           :: DefineDosDeviceFlags
dDD_RAW_TARGET_PATH           =  1
dDD_REMOVE_DEFINITION         :: DefineDosDeviceFlags
dDD_REMOVE_DEFINITION         =  2
dDD_EXACT_MATCH_ON_REMOVE     :: DefineDosDeviceFlags
dDD_EXACT_MATCH_ON_REMOVE     =  4

{-# LINE 180 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type BinaryType = DWORD

sCS_32BIT_BINARY      :: BinaryType
sCS_32BIT_BINARY      =  0
sCS_DOS_BINARY        :: BinaryType
sCS_DOS_BINARY        =  1
sCS_WOW_BINARY        :: BinaryType
sCS_WOW_BINARY        =  2
sCS_PIF_BINARY        :: BinaryType
sCS_PIF_BINARY        =  3
sCS_POSIX_BINARY      :: BinaryType
sCS_POSIX_BINARY      =  4
sCS_OS216_BINARY      :: BinaryType
sCS_OS216_BINARY      =  5

{-# LINE 193 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type FileNotificationFlag = DWORD

fILE_NOTIFY_CHANGE_FILE_NAME   :: FileNotificationFlag
fILE_NOTIFY_CHANGE_FILE_NAME   =  1
fILE_NOTIFY_CHANGE_DIR_NAME    :: FileNotificationFlag
fILE_NOTIFY_CHANGE_DIR_NAME    =  2
fILE_NOTIFY_CHANGE_ATTRIBUTES  :: FileNotificationFlag
fILE_NOTIFY_CHANGE_ATTRIBUTES  =  4
fILE_NOTIFY_CHANGE_SIZE        :: FileNotificationFlag
fILE_NOTIFY_CHANGE_SIZE        =  8
fILE_NOTIFY_CHANGE_LAST_WRITE  :: FileNotificationFlag
fILE_NOTIFY_CHANGE_LAST_WRITE  =  16
fILE_NOTIFY_CHANGE_SECURITY    :: FileNotificationFlag
fILE_NOTIFY_CHANGE_SECURITY    =  256

{-# LINE 206 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type FileType = DWORD

fILE_TYPE_UNKNOWN     :: FileType
fILE_TYPE_UNKNOWN     =  0
fILE_TYPE_DISK        :: FileType
fILE_TYPE_DISK        =  1
fILE_TYPE_CHAR        :: FileType
fILE_TYPE_CHAR        =  2
fILE_TYPE_PIPE        :: FileType
fILE_TYPE_PIPE        =  3
fILE_TYPE_REMOTE      :: FileType
fILE_TYPE_REMOTE      =  32768

{-# LINE 218 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


type LockMode = DWORD

lOCKFILE_EXCLUSIVE_LOCK    :: LockMode
lOCKFILE_EXCLUSIVE_LOCK    =  2
lOCKFILE_FAIL_IMMEDIATELY  :: LockMode
lOCKFILE_FAIL_IMMEDIATELY  =  1

{-# LINE 227 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


newtype GET_FILEEX_INFO_LEVELS = GET_FILEEX_INFO_LEVELS (Word32)
{-# LINE 231 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
    deriving (Eq, Ord)

getFileExInfoStandard  :: GET_FILEEX_INFO_LEVELS
getFileExInfoStandard  = GET_FILEEX_INFO_LEVELS 0
getFileExMaxInfoLevel  :: GET_FILEEX_INFO_LEVELS
getFileExMaxInfoLevel  = GET_FILEEX_INFO_LEVELS 1

{-# LINE 237 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

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


data SECURITY_ATTRIBUTES = SECURITY_ATTRIBUTES
    { nLength              :: !DWORD
    , lpSecurityDescriptor :: !LPVOID
    , bInheritHandle       :: !BOOL
    } deriving Show

type PSECURITY_ATTRIBUTES = Ptr SECURITY_ATTRIBUTES
type LPSECURITY_ATTRIBUTES = Ptr SECURITY_ATTRIBUTES
type MbLPSECURITY_ATTRIBUTES = Maybe LPSECURITY_ATTRIBUTES

instance Storable SECURITY_ATTRIBUTES where
    sizeOf = const (24)
{-# LINE 252 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
    alignment _ = 8
{-# LINE 253 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
    poke buf input = do
        ((\hsc_ptr -> pokeByteOff hsc_ptr 0))              buf (nLength input)
{-# LINE 255 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) buf (lpSecurityDescriptor input)
{-# LINE 256 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 16))       buf (bInheritHandle input)
{-# LINE 257 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
    peek buf = do
        nLength'              <- ((\hsc_ptr -> peekByteOff hsc_ptr 0))              buf
{-# LINE 259 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        lpSecurityDescriptor' <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) buf
{-# LINE 260 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        bInheritHandle'       <- ((\hsc_ptr -> peekByteOff hsc_ptr 16))       buf
{-# LINE 261 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        return $ SECURITY_ATTRIBUTES nLength' lpSecurityDescriptor' bInheritHandle'

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

-- Other types

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


data BY_HANDLE_FILE_INFORMATION = BY_HANDLE_FILE_INFORMATION
    { bhfiFileAttributes :: FileAttributeOrFlag
    , bhfiCreationTime, bhfiLastAccessTime, bhfiLastWriteTime :: FILETIME
    , bhfiVolumeSerialNumber :: DWORD
    , bhfiSize :: DDWORD
    , bhfiNumberOfLinks :: DWORD
    , bhfiFileIndex :: DDWORD
    } deriving (Show)

instance Storable BY_HANDLE_FILE_INFORMATION where
    sizeOf = const ((52))
{-# LINE 278 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
    alignment _ = 4
{-# LINE 279 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
    poke buf bhi = do
        ((\hsc_ptr -> pokeByteOff hsc_ptr 0))     buf (bhfiFileAttributes bhi)
{-# LINE 281 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 4))       buf (bhfiCreationTime bhi)
{-# LINE 282 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 12))     buf (bhfiLastAccessTime bhi)
{-# LINE 283 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 20))      buf (bhfiLastWriteTime bhi)
{-# LINE 284 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 28)) buf (bhfiVolumeSerialNumber bhi)
{-# LINE 285 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 32))        buf sizeHi
{-# LINE 286 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 36))         buf sizeLow
{-# LINE 287 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 40))       buf (bhfiNumberOfLinks bhi)
{-# LINE 288 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 44))       buf idxHi
{-# LINE 289 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 48))        buf idxLow
{-# LINE 290 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        where
            (sizeHi,sizeLow) = ddwordToDwords $ bhfiSize bhi
            (idxHi,idxLow) = ddwordToDwords $ bhfiFileIndex bhi

    peek buf = do
        attr <- ((\hsc_ptr -> peekByteOff hsc_ptr 0))     buf
{-# LINE 296 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ctim <- ((\hsc_ptr -> peekByteOff hsc_ptr 4))       buf
{-# LINE 297 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        lati <- ((\hsc_ptr -> peekByteOff hsc_ptr 12))     buf
{-# LINE 298 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        lwti <- ((\hsc_ptr -> peekByteOff hsc_ptr 20))      buf
{-# LINE 299 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        vser <- ((\hsc_ptr -> peekByteOff hsc_ptr 28)) buf
{-# LINE 300 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        fshi <- ((\hsc_ptr -> peekByteOff hsc_ptr 32))        buf
{-# LINE 301 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        fslo <- ((\hsc_ptr -> peekByteOff hsc_ptr 36))         buf
{-# LINE 302 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        link <- ((\hsc_ptr -> peekByteOff hsc_ptr 40))       buf
{-# LINE 303 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        idhi <- ((\hsc_ptr -> peekByteOff hsc_ptr 44))       buf
{-# LINE 304 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        idlo <- ((\hsc_ptr -> peekByteOff hsc_ptr 48))        buf
{-# LINE 305 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        return $ BY_HANDLE_FILE_INFORMATION attr ctim lati lwti vser
            (dwordsToDdword (fshi,fslo)) link (dwordsToDdword (idhi,idlo))

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


data WIN32_FILE_ATTRIBUTE_DATA = WIN32_FILE_ATTRIBUTE_DATA
    { fadFileAttributes :: DWORD
    , fadCreationTime , fadLastAccessTime , fadLastWriteTime :: FILETIME
    , fadFileSize :: DDWORD
    } deriving (Show)

instance Storable WIN32_FILE_ATTRIBUTE_DATA where
    sizeOf = const ((36))
{-# LINE 318 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
    alignment _ = 4
{-# LINE 319 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
    poke buf ad = do
        ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) buf (fadFileAttributes ad)
{-# LINE 321 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 4))   buf (fadCreationTime ad)
{-# LINE 322 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 12)) buf (fadLastAccessTime ad)
{-# LINE 323 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 20))  buf (fadLastWriteTime ad)
{-# LINE 324 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 28))    buf sizeHi
{-# LINE 325 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 32))     buf sizeLo
{-# LINE 326 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        where
            (sizeHi,sizeLo) = ddwordToDwords $ fadFileSize ad

    peek buf = do
        attr <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) buf
{-# LINE 331 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        ctim <- ((\hsc_ptr -> peekByteOff hsc_ptr 4))   buf
{-# LINE 332 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        lati <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) buf
{-# LINE 333 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        lwti <- ((\hsc_ptr -> peekByteOff hsc_ptr 20))  buf
{-# LINE 334 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        fshi <- ((\hsc_ptr -> peekByteOff hsc_ptr 28))    buf
{-# LINE 335 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        fslo <- ((\hsc_ptr -> peekByteOff hsc_ptr 32))     buf
{-# LINE 336 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
        return $ WIN32_FILE_ATTRIBUTE_DATA attr ctim lati lwti
            (dwordsToDdword (fshi,fslo))

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

-- File operations

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


foreign import WINDOWS_CCONV unsafe "windows.h DeleteFileW"
  c_DeleteFile :: LPCTSTR -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h CopyFileW"
  c_CopyFile :: LPCTSTR -> LPCTSTR -> Bool -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h MoveFileW"
  c_MoveFile :: LPCTSTR -> LPCTSTR -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h MoveFileExW"
  c_MoveFileEx :: LPCTSTR -> LPCTSTR -> MoveFileFlag -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h SetCurrentDirectoryW"
  c_SetCurrentDirectory :: LPCTSTR -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h CreateDirectoryW"
  c_CreateDirectory :: LPCTSTR -> LPSECURITY_ATTRIBUTES -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h CreateDirectoryExW"
  c_CreateDirectoryEx :: LPCTSTR -> LPCTSTR -> LPSECURITY_ATTRIBUTES -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h RemoveDirectoryW"
  c_RemoveDirectory :: LPCTSTR -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h GetBinaryTypeW"
  c_GetBinaryType :: LPCTSTR -> Ptr DWORD -> IO Bool

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

-- HANDLE operations

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


foreign import WINDOWS_CCONV unsafe "windows.h CreateFileW"
  c_CreateFile :: LPCTSTR -> AccessMode -> ShareMode -> LPSECURITY_ATTRIBUTES -> CreateMode -> FileAttributeOrFlag -> HANDLE -> IO HANDLE

foreign import WINDOWS_CCONV unsafe "windows.h CloseHandle"
  c_CloseHandle :: HANDLE -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h GetFileType"
  getFileType :: HANDLE -> IO FileType
--Apparently no error code


foreign import WINDOWS_CCONV unsafe "windows.h FlushFileBuffers"
  c_FlushFileBuffers :: HANDLE -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h SetEndOfFile"
  c_SetEndOfFile :: HANDLE -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h SetFileAttributesW"
  c_SetFileAttributes :: LPCTSTR -> FileAttributeOrFlag -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h GetFileAttributesW"
  c_GetFileAttributes :: LPCTSTR -> IO FileAttributeOrFlag

foreign import WINDOWS_CCONV unsafe "windows.h GetFileAttributesExW"
  c_GetFileAttributesEx :: LPCTSTR -> GET_FILEEX_INFO_LEVELS -> Ptr a -> IO BOOL

foreign import WINDOWS_CCONV unsafe "windows.h GetFileInformationByHandle"
    c_GetFileInformationByHandle :: HANDLE -> Ptr BY_HANDLE_FILE_INFORMATION -> IO BOOL

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

-- Read/write files

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


-- No support for this yet

data OVERLAPPED
  = OVERLAPPED { ovl_internal     :: ULONG_PTR
               , ovl_internalHigh :: ULONG_PTR
               , ovl_offset       :: DWORD
               , ovl_offsetHigh   :: DWORD
               , ovl_hEvent       :: HANDLE
               } deriving (Show)

instance Storable OVERLAPPED where
  sizeOf = const ((32))
{-# LINE 417 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
  alignment _ = 8
{-# LINE 418 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
  poke buf ad = do
      ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) buf (ovl_internal     ad)
{-# LINE 420 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) buf (ovl_internalHigh ad)
{-# LINE 421 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) buf (ovl_offset       ad)
{-# LINE 422 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      ((\hsc_ptr -> pokeByteOff hsc_ptr 20)) buf (ovl_offsetHigh   ad)
{-# LINE 423 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) buf (ovl_hEvent       ad)
{-# LINE 424 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}

  peek buf = do
      intnl      <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) buf
{-# LINE 427 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      intnl_high <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) buf
{-# LINE 428 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      off        <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) buf
{-# LINE 429 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      off_high   <- ((\hsc_ptr -> peekByteOff hsc_ptr 20)) buf
{-# LINE 430 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      hevnt      <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) buf
{-# LINE 431 "libraries\\Win32\\System\\Win32\\File\\Internal.hsc" #-}
      return $ OVERLAPPED intnl intnl_high off off_high hevnt

type LPOVERLAPPED = Ptr OVERLAPPED

type MbLPOVERLAPPED = Maybe LPOVERLAPPED

foreign import WINDOWS_CCONV unsafe "windows.h ReadFile"
  c_ReadFile :: HANDLE -> Ptr a -> DWORD -> Ptr DWORD -> LPOVERLAPPED -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h WriteFile"
  c_WriteFile :: HANDLE -> Ptr a -> DWORD -> Ptr DWORD -> LPOVERLAPPED -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h SetFilePointerEx"
  c_SetFilePointerEx :: HANDLE -> LARGE_INTEGER -> Ptr LARGE_INTEGER -> FilePtrDirection -> IO Bool

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

-- File Notifications

--

-- Use these to initialise, "increment" and close a HANDLE you can wait

-- on.

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


foreign import WINDOWS_CCONV unsafe "windows.h FindFirstChangeNotificationW"
  c_FindFirstChangeNotification :: LPCTSTR -> Bool -> FileNotificationFlag -> IO HANDLE

foreign import WINDOWS_CCONV unsafe "windows.h FindNextChangeNotification"
  c_FindNextChangeNotification :: HANDLE -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h FindCloseChangeNotification"
  c_FindCloseChangeNotification :: HANDLE -> IO Bool

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

-- Directories

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


type WIN32_FIND_DATA = ()

newtype FindData = FindData (ForeignPtr WIN32_FIND_DATA)

foreign import WINDOWS_CCONV unsafe "windows.h FindFirstFileW"
  c_FindFirstFile :: LPCTSTR -> Ptr WIN32_FIND_DATA -> IO HANDLE

foreign import WINDOWS_CCONV unsafe "windows.h FindNextFileW"
  c_FindNextFile :: HANDLE -> Ptr WIN32_FIND_DATA -> IO BOOL

foreign import WINDOWS_CCONV unsafe "windows.h FindClose"
  c_FindClose :: HANDLE -> IO BOOL

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

-- DOS Device flags

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


foreign import WINDOWS_CCONV unsafe "windows.h DefineDosDeviceW"
  c_DefineDosDevice :: DefineDosDeviceFlags -> LPCTSTR -> LPCTSTR -> IO Bool

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


-- These functions are very unusual in the Win32 API:

-- They don't return error codes


foreign import WINDOWS_CCONV unsafe "windows.h AreFileApisANSI"
  areFileApisANSI :: IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h SetFileApisToOEM"
  setFileApisToOEM :: IO ()

foreign import WINDOWS_CCONV unsafe "windows.h SetFileApisToANSI"
  setFileApisToANSI :: IO ()

foreign import WINDOWS_CCONV unsafe "windows.h SetHandleCount"
  setHandleCount :: UINT -> IO UINT

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


foreign import WINDOWS_CCONV unsafe "windows.h GetLogicalDrives"
  c_GetLogicalDrives :: IO DWORD

-- %fun GetDriveType :: Maybe String -> IO DriveType


foreign import WINDOWS_CCONV unsafe "windows.h GetDiskFreeSpaceW"
  c_GetDiskFreeSpace :: LPCTSTR -> Ptr DWORD -> Ptr DWORD -> Ptr DWORD -> Ptr DWORD -> IO Bool

foreign import WINDOWS_CCONV unsafe "windows.h SetVolumeLabelW"
  c_SetVolumeLabel :: LPCTSTR -> LPCTSTR -> IO Bool

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

-- File locks

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


foreign import WINDOWS_CCONV unsafe "LockFileEx"
  c_LockFileEx :: HANDLE -> DWORD -> DWORD -> DWORD -> DWORD -> LPOVERLAPPED
               -> IO BOOL

foreign import WINDOWS_CCONV unsafe "UnlockFileEx"
  c_UnlockFileEx :: HANDLE -> DWORD -> DWORD -> DWORD -> LPOVERLAPPED -> IO BOOL

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

-- End

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