    {-# 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

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