{-# LINE1"System\\Win32\\File.hsc"#-}{-# LINE2"System\\Win32\\File.hsc"#-}{-# LANGUAGE Safe #-}{-# LINE6"System\\Win32\\File.hsc"#-}------------------------------------------------------------------------------- |-- Module : System.Win32.File-- 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.-------------------------------------------------------------------------------moduleSystem.Win32.File(-- * Access modesAccessMode,gENERIC_NONE,gENERIC_READ,gENERIC_WRITE,gENERIC_EXECUTE,gENERIC_ALL,dELETE,rEAD_CONTROL,wRITE_DAC,wRITE_OWNER,sYNCHRONIZE,sTANDARD_RIGHTS_REQUIRED,sTANDARD_RIGHTS_READ,sTANDARD_RIGHTS_WRITE,sTANDARD_RIGHTS_EXECUTE,sTANDARD_RIGHTS_ALL,sPECIFIC_RIGHTS_ALL,aCCESS_SYSTEM_SECURITY,mAXIMUM_ALLOWED,fILE_ADD_FILE,fILE_ADD_SUBDIRECTORY,fILE_ALL_ACCESS,fILE_APPEND_DATA,fILE_CREATE_PIPE_INSTANCE,fILE_DELETE_CHILD,fILE_EXECUTE,fILE_LIST_DIRECTORY,fILE_READ_ATTRIBUTES,fILE_READ_DATA,fILE_READ_EA,fILE_TRAVERSE,fILE_WRITE_ATTRIBUTES,fILE_WRITE_DATA,fILE_WRITE_EA-- * Sharing modes,ShareMode,fILE_SHARE_NONE,fILE_SHARE_READ,fILE_SHARE_WRITE,fILE_SHARE_DELETE-- * Creation modes,CreateMode,cREATE_NEW,cREATE_ALWAYS,oPEN_EXISTING,oPEN_ALWAYS,tRUNCATE_EXISTING-- * File attributes and flags,FileAttributeOrFlag,fILE_ATTRIBUTE_READONLY,fILE_ATTRIBUTE_HIDDEN,fILE_ATTRIBUTE_SYSTEM,fILE_ATTRIBUTE_DIRECTORY,fILE_ATTRIBUTE_ARCHIVE,fILE_ATTRIBUTE_NORMAL,fILE_ATTRIBUTE_TEMPORARY,fILE_ATTRIBUTE_COMPRESSED,fILE_ATTRIBUTE_REPARSE_POINT,fILE_FLAG_WRITE_THROUGH,fILE_FLAG_OVERLAPPED,fILE_FLAG_NO_BUFFERING,fILE_FLAG_RANDOM_ACCESS,fILE_FLAG_SEQUENTIAL_SCAN,fILE_FLAG_DELETE_ON_CLOSE,fILE_FLAG_BACKUP_SEMANTICS,fILE_FLAG_POSIX_SEMANTICS{-# LINE92"System\\Win32\\File.hsc"#-},sECURITY_ANONYMOUS,sECURITY_IDENTIFICATION,sECURITY_IMPERSONATION,sECURITY_DELEGATION,sECURITY_CONTEXT_TRACKING,sECURITY_EFFECTIVE_ONLY,sECURITY_SQOS_PRESENT,sECURITY_VALID_SQOS_FLAGS{-# LINE101"System\\Win32\\File.hsc"#-}-- * Move file flags,MoveFileFlag,mOVEFILE_REPLACE_EXISTING,mOVEFILE_COPY_ALLOWED,mOVEFILE_DELAY_UNTIL_REBOOT-- * File pointer directions,FilePtrDirection,fILE_BEGIN,fILE_CURRENT,fILE_END-- * Drive types,DriveType,dRIVE_UNKNOWN,dRIVE_NO_ROOT_DIR,dRIVE_REMOVABLE,dRIVE_FIXED,dRIVE_REMOTE,dRIVE_CDROM,dRIVE_RAMDISK-- * Define DOS device flags,DefineDosDeviceFlags,dDD_RAW_TARGET_PATH,dDD_REMOVE_DEFINITION,dDD_EXACT_MATCH_ON_REMOVE-- * Binary types,BinaryType,sCS_32BIT_BINARY,sCS_DOS_BINARY,sCS_WOW_BINARY,sCS_PIF_BINARY,sCS_POSIX_BINARY,sCS_OS216_BINARY-- * File notification flags,FileNotificationFlag,fILE_NOTIFY_CHANGE_FILE_NAME,fILE_NOTIFY_CHANGE_DIR_NAME,fILE_NOTIFY_CHANGE_ATTRIBUTES,fILE_NOTIFY_CHANGE_SIZE,fILE_NOTIFY_CHANGE_LAST_WRITE,fILE_NOTIFY_CHANGE_SECURITY-- * File types,FileType,fILE_TYPE_UNKNOWN,fILE_TYPE_DISK,fILE_TYPE_CHAR,fILE_TYPE_PIPE,fILE_TYPE_REMOTE-- * Lock modes,LockMode,lOCKFILE_EXCLUSIVE_LOCK,lOCKFILE_FAIL_IMMEDIATELY-- * GetFileEx information levels,GET_FILEEX_INFO_LEVELS,getFileExInfoStandard,getFileExMaxInfoLevel-- * Security attributes,SECURITY_ATTRIBUTES(..),PSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,MbLPSECURITY_ATTRIBUTES-- * BY_HANDLE file information,BY_HANDLE_FILE_INFORMATION(..)-- * Win32 file attribute data,WIN32_FILE_ATTRIBUTE_DATA(..)-- * Helpers,failIfWithRetry,failIfWithRetry_,failIfFalseWithRetry_-- * File operations,deleteFile,copyFile,moveFile,moveFileEx,setCurrentDirectory,createDirectory,createDirectoryEx,removeDirectory,getBinaryType-- * HANDLE operations,createFile,closeHandle,getFileType,flushFileBuffers,setEndOfFile,setFileAttributes,getFileAttributes,getFileAttributesExStandard,getFileInformationByHandle-- ** Reading/writing-- | Some operations below bear the @win32_@ prefix to avoid shadowing-- operations from "Prelude".,OVERLAPPED(..),LPOVERLAPPED,MbLPOVERLAPPED,win32_ReadFile,win32_WriteFile,setFilePointerEx-- * File notifications,findFirstChangeNotification,findNextChangeNotification,findCloseChangeNotification-- * Directories,FindData,getFindDataFileName,findFirstFile,findNextFile,findClose-- * DOS device flags,defineDosDevice,areFileApisANSI,setFileApisToOEM,setFileApisToANSI,setHandleCount,getLogicalDrives,getDiskFreeSpace,setVolumeLabel-- * File locks,lockFile,unlockFile)whereimportSystem.Win32.TypesimportSystem.Win32.TimeimportForeignhiding(void)importControl.MonadimportControl.Concurrent#include "windows_cconv.h" ------------------------------------------------------------------ Enumeration types----------------------------------------------------------------typeAccessMode=UINTgENERIC_NONE::AccessModegENERIC_NONE=0gENERIC_READ::AccessModegENERIC_READ=2147483648gENERIC_WRITE::AccessModegENERIC_WRITE=1073741824gENERIC_EXECUTE::AccessModegENERIC_EXECUTE=536870912gENERIC_ALL::AccessModegENERIC_ALL=268435456dELETE::AccessModedELETE=65536rEAD_CONTROL::AccessModerEAD_CONTROL=131072wRITE_DAC::AccessModewRITE_DAC=262144wRITE_OWNER::AccessModewRITE_OWNER=524288sYNCHRONIZE::AccessModesYNCHRONIZE=1048576sTANDARD_RIGHTS_REQUIRED::AccessModesTANDARD_RIGHTS_REQUIRED=983040sTANDARD_RIGHTS_READ::AccessModesTANDARD_RIGHTS_READ=131072sTANDARD_RIGHTS_WRITE::AccessModesTANDARD_RIGHTS_WRITE=131072sTANDARD_RIGHTS_EXECUTE::AccessModesTANDARD_RIGHTS_EXECUTE=131072sTANDARD_RIGHTS_ALL::AccessModesTANDARD_RIGHTS_ALL=2031616sPECIFIC_RIGHTS_ALL::AccessModesPECIFIC_RIGHTS_ALL=65535aCCESS_SYSTEM_SECURITY::AccessModeaCCESS_SYSTEM_SECURITY=16777216mAXIMUM_ALLOWED::AccessModemAXIMUM_ALLOWED=33554432fILE_ADD_FILE::AccessModefILE_ADD_FILE=2fILE_ADD_SUBDIRECTORY::AccessModefILE_ADD_SUBDIRECTORY=4fILE_ALL_ACCESS::AccessModefILE_ALL_ACCESS=2032127fILE_APPEND_DATA::AccessModefILE_APPEND_DATA=4fILE_CREATE_PIPE_INSTANCE::AccessModefILE_CREATE_PIPE_INSTANCE=4fILE_DELETE_CHILD::AccessModefILE_DELETE_CHILD=64fILE_EXECUTE::AccessModefILE_EXECUTE=32fILE_LIST_DIRECTORY::AccessModefILE_LIST_DIRECTORY=1fILE_READ_ATTRIBUTES::AccessModefILE_READ_ATTRIBUTES=128fILE_READ_DATA::AccessModefILE_READ_DATA=1fILE_READ_EA::AccessModefILE_READ_EA=8fILE_TRAVERSE::AccessModefILE_TRAVERSE=32fILE_WRITE_ATTRIBUTES::AccessModefILE_WRITE_ATTRIBUTES=256fILE_WRITE_DATA::AccessModefILE_WRITE_DATA=2fILE_WRITE_EA::AccessModefILE_WRITE_EA=16{-# LINE296"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeShareMode=UINTfILE_SHARE_NONE::ShareModefILE_SHARE_NONE=0fILE_SHARE_READ::ShareModefILE_SHARE_READ=1fILE_SHARE_WRITE::ShareModefILE_SHARE_WRITE=2fILE_SHARE_DELETE::ShareModefILE_SHARE_DELETE=4{-# LINE309"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeCreateMode=UINTcREATE_NEW::CreateModecREATE_NEW=1cREATE_ALWAYS::CreateModecREATE_ALWAYS=2oPEN_EXISTING::CreateModeoPEN_EXISTING=3oPEN_ALWAYS::CreateModeoPEN_ALWAYS=4tRUNCATE_EXISTING::CreateModetRUNCATE_EXISTING=5{-# LINE321"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeFileAttributeOrFlag=UINTfILE_ATTRIBUTE_READONLY::FileAttributeOrFlagfILE_ATTRIBUTE_READONLY=1fILE_ATTRIBUTE_HIDDEN::FileAttributeOrFlagfILE_ATTRIBUTE_HIDDEN=2fILE_ATTRIBUTE_SYSTEM::FileAttributeOrFlagfILE_ATTRIBUTE_SYSTEM=4fILE_ATTRIBUTE_DIRECTORY::FileAttributeOrFlagfILE_ATTRIBUTE_DIRECTORY=16fILE_ATTRIBUTE_ARCHIVE::FileAttributeOrFlagfILE_ATTRIBUTE_ARCHIVE=32fILE_ATTRIBUTE_NORMAL::FileAttributeOrFlagfILE_ATTRIBUTE_NORMAL=128fILE_ATTRIBUTE_TEMPORARY::FileAttributeOrFlagfILE_ATTRIBUTE_TEMPORARY=256fILE_ATTRIBUTE_COMPRESSED::FileAttributeOrFlagfILE_ATTRIBUTE_COMPRESSED=2048fILE_ATTRIBUTE_REPARSE_POINT::FileAttributeOrFlagfILE_ATTRIBUTE_REPARSE_POINT=1024fILE_FLAG_WRITE_THROUGH::FileAttributeOrFlagfILE_FLAG_WRITE_THROUGH=2147483648fILE_FLAG_OVERLAPPED::FileAttributeOrFlagfILE_FLAG_OVERLAPPED=1073741824fILE_FLAG_NO_BUFFERING::FileAttributeOrFlagfILE_FLAG_NO_BUFFERING=536870912fILE_FLAG_RANDOM_ACCESS::FileAttributeOrFlagfILE_FLAG_RANDOM_ACCESS=268435456fILE_FLAG_SEQUENTIAL_SCAN::FileAttributeOrFlagfILE_FLAG_SEQUENTIAL_SCAN=134217728fILE_FLAG_DELETE_ON_CLOSE::FileAttributeOrFlagfILE_FLAG_DELETE_ON_CLOSE=67108864fILE_FLAG_BACKUP_SEMANTICS::FileAttributeOrFlagfILE_FLAG_BACKUP_SEMANTICS=33554432fILE_FLAG_POSIX_SEMANTICS::FileAttributeOrFlagfILE_FLAG_POSIX_SEMANTICS=16777216{-# LINE345"System\\Win32\\File.hsc"#-}{-# LINE346"System\\Win32\\File.hsc"#-}sECURITY_ANONYMOUS::FileAttributeOrFlagsECURITY_ANONYMOUS=0sECURITY_IDENTIFICATION::FileAttributeOrFlagsECURITY_IDENTIFICATION=65536sECURITY_IMPERSONATION::FileAttributeOrFlagsECURITY_IMPERSONATION=131072sECURITY_DELEGATION::FileAttributeOrFlagsECURITY_DELEGATION=196608sECURITY_CONTEXT_TRACKING::FileAttributeOrFlagsECURITY_CONTEXT_TRACKING=262144sECURITY_EFFECTIVE_ONLY::FileAttributeOrFlagsECURITY_EFFECTIVE_ONLY=524288sECURITY_SQOS_PRESENT::FileAttributeOrFlagsECURITY_SQOS_PRESENT=1048576sECURITY_VALID_SQOS_FLAGS::FileAttributeOrFlagsECURITY_VALID_SQOS_FLAGS=2031616{-# LINE356"System\\Win32\\File.hsc"#-}{-# LINE357"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeMoveFileFlag=DWORDmOVEFILE_REPLACE_EXISTING::MoveFileFlagmOVEFILE_REPLACE_EXISTING=1mOVEFILE_COPY_ALLOWED::MoveFileFlagmOVEFILE_COPY_ALLOWED=2mOVEFILE_DELAY_UNTIL_REBOOT::MoveFileFlagmOVEFILE_DELAY_UNTIL_REBOOT=4{-# LINE367"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeFilePtrDirection=DWORDfILE_BEGIN::FilePtrDirectionfILE_BEGIN=0fILE_CURRENT::FilePtrDirectionfILE_CURRENT=1fILE_END::FilePtrDirectionfILE_END=2{-# LINE377"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeDriveType=UINTdRIVE_UNKNOWN::DriveTypedRIVE_UNKNOWN=0dRIVE_NO_ROOT_DIR::DriveTypedRIVE_NO_ROOT_DIR=1dRIVE_REMOVABLE::DriveTypedRIVE_REMOVABLE=2dRIVE_FIXED::DriveTypedRIVE_FIXED=3dRIVE_REMOTE::DriveTypedRIVE_REMOTE=4dRIVE_CDROM::DriveTypedRIVE_CDROM=5dRIVE_RAMDISK::DriveTypedRIVE_RAMDISK=6{-# LINE391"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeDefineDosDeviceFlags=DWORDdDD_RAW_TARGET_PATH::DefineDosDeviceFlagsdDD_RAW_TARGET_PATH=1dDD_REMOVE_DEFINITION::DefineDosDeviceFlagsdDD_REMOVE_DEFINITION=2dDD_EXACT_MATCH_ON_REMOVE::DefineDosDeviceFlagsdDD_EXACT_MATCH_ON_REMOVE=4{-# LINE401"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeBinaryType=DWORDsCS_32BIT_BINARY::BinaryTypesCS_32BIT_BINARY=0sCS_DOS_BINARY::BinaryTypesCS_DOS_BINARY=1sCS_WOW_BINARY::BinaryTypesCS_WOW_BINARY=2sCS_PIF_BINARY::BinaryTypesCS_PIF_BINARY=3sCS_POSIX_BINARY::BinaryTypesCS_POSIX_BINARY=4sCS_OS216_BINARY::BinaryTypesCS_OS216_BINARY=5{-# LINE414"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeFileNotificationFlag=DWORDfILE_NOTIFY_CHANGE_FILE_NAME::FileNotificationFlagfILE_NOTIFY_CHANGE_FILE_NAME=1fILE_NOTIFY_CHANGE_DIR_NAME::FileNotificationFlagfILE_NOTIFY_CHANGE_DIR_NAME=2fILE_NOTIFY_CHANGE_ATTRIBUTES::FileNotificationFlagfILE_NOTIFY_CHANGE_ATTRIBUTES=4fILE_NOTIFY_CHANGE_SIZE::FileNotificationFlagfILE_NOTIFY_CHANGE_SIZE=8fILE_NOTIFY_CHANGE_LAST_WRITE::FileNotificationFlagfILE_NOTIFY_CHANGE_LAST_WRITE=16fILE_NOTIFY_CHANGE_SECURITY::FileNotificationFlagfILE_NOTIFY_CHANGE_SECURITY=256{-# LINE427"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeFileType=DWORDfILE_TYPE_UNKNOWN::FileTypefILE_TYPE_UNKNOWN=0fILE_TYPE_DISK::FileTypefILE_TYPE_DISK=1fILE_TYPE_CHAR::FileTypefILE_TYPE_CHAR=2fILE_TYPE_PIPE::FileTypefILE_TYPE_PIPE=3fILE_TYPE_REMOTE::FileTypefILE_TYPE_REMOTE=32768{-# LINE439"System\\Win32\\File.hsc"#-}----------------------------------------------------------------typeLockMode=DWORDlOCKFILE_EXCLUSIVE_LOCK::LockModelOCKFILE_EXCLUSIVE_LOCK=2lOCKFILE_FAIL_IMMEDIATELY::LockModelOCKFILE_FAIL_IMMEDIATELY=1{-# LINE448"System\\Win32\\File.hsc"#-}----------------------------------------------------------------newtypeGET_FILEEX_INFO_LEVELS=GET_FILEEX_INFO_LEVELS(Word32){-# LINE452"System\\Win32\\File.hsc"#-}deriving(Eq,Ord)getFileExInfoStandard::GET_FILEEX_INFO_LEVELSgetFileExInfoStandard=GET_FILEEX_INFO_LEVELS0getFileExMaxInfoLevel::GET_FILEEX_INFO_LEVELSgetFileExMaxInfoLevel=GET_FILEEX_INFO_LEVELS1{-# LINE458"System\\Win32\\File.hsc"#-}----------------------------------------------------------------dataSECURITY_ATTRIBUTES=SECURITY_ATTRIBUTES{nLength::!DWORD,lpSecurityDescriptor::!LPVOID,bInheritHandle::!BOOL}derivingShowtypePSECURITY_ATTRIBUTES=PtrSECURITY_ATTRIBUTEStypeLPSECURITY_ATTRIBUTES=PtrSECURITY_ATTRIBUTEStypeMbLPSECURITY_ATTRIBUTES=MaybeLPSECURITY_ATTRIBUTESinstanceStorableSECURITY_ATTRIBUTESwheresizeOf=const(24){-# LINE473"System\\Win32\\File.hsc"#-}alignment_=8{-# LINE474"System\\Win32\\File.hsc"#-}pokebufinput=do((\hsc_ptr->pokeByteOffhsc_ptr0))buf(nLengthinput){-# LINE476"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr8))buf(lpSecurityDescriptorinput){-# LINE477"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr16))buf(bInheritHandleinput){-# LINE478"System\\Win32\\File.hsc"#-}peekbuf=donLength'<-((\hsc_ptr->peekByteOffhsc_ptr0))buf{-# LINE480"System\\Win32\\File.hsc"#-}lpSecurityDescriptor'<-((\hsc_ptr->peekByteOffhsc_ptr8))buf{-# LINE481"System\\Win32\\File.hsc"#-}bInheritHandle'<-((\hsc_ptr->peekByteOffhsc_ptr16))buf{-# LINE482"System\\Win32\\File.hsc"#-}return$SECURITY_ATTRIBUTESnLength'lpSecurityDescriptor'bInheritHandle'------------------------------------------------------------------ Other types----------------------------------------------------------------dataBY_HANDLE_FILE_INFORMATION=BY_HANDLE_FILE_INFORMATION{bhfiFileAttributes::FileAttributeOrFlag,bhfiCreationTime,bhfiLastAccessTime,bhfiLastWriteTime::FILETIME,bhfiVolumeSerialNumber::DWORD,bhfiSize::DDWORD,bhfiNumberOfLinks::DWORD,bhfiFileIndex::DDWORD}deriving(Show)instanceStorableBY_HANDLE_FILE_INFORMATIONwheresizeOf=const((52)){-# LINE499"System\\Win32\\File.hsc"#-}alignment_=4{-# LINE500"System\\Win32\\File.hsc"#-}pokebufbhi=do((\hsc_ptr->pokeByteOffhsc_ptr0))buf(bhfiFileAttributesbhi){-# LINE502"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr4))buf(bhfiCreationTimebhi){-# LINE503"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr12))buf(bhfiLastAccessTimebhi){-# LINE504"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr20))buf(bhfiLastWriteTimebhi){-# LINE505"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr28))buf(bhfiVolumeSerialNumberbhi){-# LINE506"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr32))bufsizeHi{-# LINE507"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr36))bufsizeLow{-# LINE508"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr40))buf(bhfiNumberOfLinksbhi){-# LINE509"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr44))bufidxHi{-# LINE510"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr48))bufidxLow{-# LINE511"System\\Win32\\File.hsc"#-}where(sizeHi,sizeLow)=ddwordToDwords$bhfiSizebhi(idxHi,idxLow)=ddwordToDwords$bhfiFileIndexbhipeekbuf=doattr<-((\hsc_ptr->peekByteOffhsc_ptr0))buf{-# LINE517"System\\Win32\\File.hsc"#-}ctim<-((\hsc_ptr->peekByteOffhsc_ptr4))buf{-# LINE518"System\\Win32\\File.hsc"#-}lati<-((\hsc_ptr->peekByteOffhsc_ptr12))buf{-# LINE519"System\\Win32\\File.hsc"#-}lwti<-((\hsc_ptr->peekByteOffhsc_ptr20))buf{-# LINE520"System\\Win32\\File.hsc"#-}vser<-((\hsc_ptr->peekByteOffhsc_ptr28))buf{-# LINE521"System\\Win32\\File.hsc"#-}fshi<-((\hsc_ptr->peekByteOffhsc_ptr32))buf{-# LINE522"System\\Win32\\File.hsc"#-}fslo<-((\hsc_ptr->peekByteOffhsc_ptr36))buf{-# LINE523"System\\Win32\\File.hsc"#-}link<-((\hsc_ptr->peekByteOffhsc_ptr40))buf{-# LINE524"System\\Win32\\File.hsc"#-}idhi<-((\hsc_ptr->peekByteOffhsc_ptr44))buf{-# LINE525"System\\Win32\\File.hsc"#-}idlo<-((\hsc_ptr->peekByteOffhsc_ptr48))buf{-# LINE526"System\\Win32\\File.hsc"#-}return$BY_HANDLE_FILE_INFORMATIONattrctimlatilwtivser(dwordsToDdword(fshi,fslo))link(dwordsToDdword(idhi,idlo))----------------------------------------------------------------dataWIN32_FILE_ATTRIBUTE_DATA=WIN32_FILE_ATTRIBUTE_DATA{fadFileAttributes::DWORD,fadCreationTime,fadLastAccessTime,fadLastWriteTime::FILETIME,fadFileSize::DDWORD}deriving(Show)instanceStorableWIN32_FILE_ATTRIBUTE_DATAwheresizeOf=const((36)){-# LINE539"System\\Win32\\File.hsc"#-}alignment_=4{-# LINE540"System\\Win32\\File.hsc"#-}pokebufad=do((\hsc_ptr->pokeByteOffhsc_ptr0))buf(fadFileAttributesad){-# LINE542"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr4))buf(fadCreationTimead){-# LINE543"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr12))buf(fadLastAccessTimead){-# LINE544"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr20))buf(fadLastWriteTimead){-# LINE545"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr28))bufsizeHi{-# LINE546"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr32))bufsizeLo{-# LINE547"System\\Win32\\File.hsc"#-}where(sizeHi,sizeLo)=ddwordToDwords$fadFileSizeadpeekbuf=doattr<-((\hsc_ptr->peekByteOffhsc_ptr0))buf{-# LINE552"System\\Win32\\File.hsc"#-}ctim<-((\hsc_ptr->peekByteOffhsc_ptr4))buf{-# LINE553"System\\Win32\\File.hsc"#-}lati<-((\hsc_ptr->peekByteOffhsc_ptr12))buf{-# LINE554"System\\Win32\\File.hsc"#-}lwti<-((\hsc_ptr->peekByteOffhsc_ptr20))buf{-# LINE555"System\\Win32\\File.hsc"#-}fshi<-((\hsc_ptr->peekByteOffhsc_ptr28))buf{-# LINE556"System\\Win32\\File.hsc"#-}fslo<-((\hsc_ptr->peekByteOffhsc_ptr32))buf{-# LINE557"System\\Win32\\File.hsc"#-}return$WIN32_FILE_ATTRIBUTE_DATAattrctimlatilwti(dwordsToDdword(fshi,fslo))------------------------------------------------------------------ File operations------------------------------------------------------------------ | like failIfFalse_, but retried on sharing violations.-- This is necessary for many file operations; see-- http://support.microsoft.com/kb/316609--failIfWithRetry::(a->Bool)->String->IOa->IOafailIfWithRetrycondmsgaction=retryOrFailretrieswheredelay=100*1000-- in ms, we use threadDelayretries=20::Int-- KB article recommends 250/5-- retryOrFail :: Int -> IO aretryOrFailtimes|times<=0=errorWinmsg|otherwise=doret<-actionifnot(condret)thenreturnretelsedoerr_code<-getLastErroriferr_code==(32){-# LINE585"System\\Win32\\File.hsc"#-}thendothreadDelaydelay;retryOrFail(times-1)elseerrorWinmsgfailIfWithRetry_::(a->Bool)->String->IOa->IO()failIfWithRetry_condmsgaction=void$failIfWithRetrycondmsgactionfailIfFalseWithRetry_::String->IOBool->IO()failIfFalseWithRetry_=failIfWithRetry_notdeleteFile::String->IO()deleteFilename=withTStringname$\c_name->failIfFalseWithRetry_(unwords["DeleteFile",showname])$c_DeleteFilec_nameforeignimportWINDOWS_CCONVunsafe"windows.h DeleteFileW"c_DeleteFile::LPCTSTR->IOBoolcopyFile::String->String->Bool->IO()copyFilesrcdestover=withTStringsrc$\c_src->withTStringdest$\c_dest->failIfFalseWithRetry_(unwords["CopyFile",showsrc,showdest])$c_CopyFilec_srcc_destoverforeignimportWINDOWS_CCONVunsafe"windows.h CopyFileW"c_CopyFile::LPCTSTR->LPCTSTR->Bool->IOBoolmoveFile::String->String->IO()moveFilesrcdest=withTStringsrc$\c_src->withTStringdest$\c_dest->failIfFalseWithRetry_(unwords["MoveFile",showsrc,showdest])$c_MoveFilec_srcc_destforeignimportWINDOWS_CCONVunsafe"windows.h MoveFileW"c_MoveFile::LPCTSTR->LPCTSTR->IOBoolmoveFileEx::String->MaybeString->MoveFileFlag->IO()moveFileExsrcdestflags=withTStringsrc$\c_src->maybeWithwithTStringdest$\c_dest->failIfFalseWithRetry_(unwords["MoveFileEx",showsrc,showdest])$c_MoveFileExc_srcc_destflagsforeignimportWINDOWS_CCONVunsafe"windows.h MoveFileExW"c_MoveFileEx::LPCTSTR->LPCTSTR->MoveFileFlag->IOBoolsetCurrentDirectory::String->IO()setCurrentDirectoryname=withTStringname$\c_name->failIfFalse_(unwords["SetCurrentDirectory",showname])$c_SetCurrentDirectoryc_nameforeignimportWINDOWS_CCONVunsafe"windows.h SetCurrentDirectoryW"c_SetCurrentDirectory::LPCTSTR->IOBoolcreateDirectory::String->MaybeLPSECURITY_ATTRIBUTES->IO()createDirectorynamemb_attr=withTStringname$\c_name->failIfFalseWithRetry_(unwords["CreateDirectory",showname])$c_CreateDirectoryc_name(maybePtrmb_attr)foreignimportWINDOWS_CCONVunsafe"windows.h CreateDirectoryW"c_CreateDirectory::LPCTSTR->LPSECURITY_ATTRIBUTES->IOBoolcreateDirectoryEx::String->String->MaybeLPSECURITY_ATTRIBUTES->IO()createDirectoryExtemplatenamemb_attr=withTStringtemplate$\c_template->withTStringname$\c_name->failIfFalseWithRetry_(unwords["CreateDirectoryEx",showtemplate,showname])$c_CreateDirectoryExc_templatec_name(maybePtrmb_attr)foreignimportWINDOWS_CCONVunsafe"windows.h CreateDirectoryExW"c_CreateDirectoryEx::LPCTSTR->LPCTSTR->LPSECURITY_ATTRIBUTES->IOBoolremoveDirectory::String->IO()removeDirectoryname=withTStringname$\c_name->failIfFalseWithRetry_(unwords["RemoveDirectory",showname])$c_RemoveDirectoryc_nameforeignimportWINDOWS_CCONVunsafe"windows.h RemoveDirectoryW"c_RemoveDirectory::LPCTSTR->IOBoolgetBinaryType::String->IOBinaryTypegetBinaryTypename=withTStringname$\c_name->alloca$\p_btype->dofailIfFalse_(unwords["GetBinaryType",showname])$c_GetBinaryTypec_namep_btypepeekp_btypeforeignimportWINDOWS_CCONVunsafe"windows.h GetBinaryTypeW"c_GetBinaryType::LPCTSTR->PtrDWORD->IOBool------------------------------------------------------------------ HANDLE operations----------------------------------------------------------------createFile::String->AccessMode->ShareMode->MaybeLPSECURITY_ATTRIBUTES->CreateMode->FileAttributeOrFlag->MaybeHANDLE->IOHANDLEcreateFilenameaccesssharemb_attrmodeflagmb_h=withTStringname$\c_name->failIfWithRetry(==iNVALID_HANDLE_VALUE)(unwords["CreateFile",showname])$c_CreateFilec_nameaccessshare(maybePtrmb_attr)modeflag(maybePtrmb_h)foreignimportWINDOWS_CCONVunsafe"windows.h CreateFileW"c_CreateFile::LPCTSTR->AccessMode->ShareMode->LPSECURITY_ATTRIBUTES->CreateMode->FileAttributeOrFlag->HANDLE->IOHANDLEcloseHandle::HANDLE->IO()closeHandleh=failIfFalse_"CloseHandle"$c_CloseHandlehforeignimportWINDOWS_CCONVunsafe"windows.h CloseHandle"c_CloseHandle::HANDLE->IOBoolforeignimportWINDOWS_CCONVunsafe"windows.h GetFileType"getFileType::HANDLE->IOFileType--Apparently no error codeflushFileBuffers::HANDLE->IO()flushFileBuffersh=failIfFalse_"FlushFileBuffers"$c_FlushFileBuffershforeignimportWINDOWS_CCONVunsafe"windows.h FlushFileBuffers"c_FlushFileBuffers::HANDLE->IOBoolsetEndOfFile::HANDLE->IO()setEndOfFileh=failIfFalse_"SetEndOfFile"$c_SetEndOfFilehforeignimportWINDOWS_CCONVunsafe"windows.h SetEndOfFile"c_SetEndOfFile::HANDLE->IOBoolsetFileAttributes::String->FileAttributeOrFlag->IO()setFileAttributesnameattr=withTStringname$\c_name->failIfFalseWithRetry_(unwords["SetFileAttributes",showname])$c_SetFileAttributesc_nameattrforeignimportWINDOWS_CCONVunsafe"windows.h SetFileAttributesW"c_SetFileAttributes::LPCTSTR->FileAttributeOrFlag->IOBoolgetFileAttributes::String->IOFileAttributeOrFlaggetFileAttributesname=withTStringname$\c_name->failIfWithRetry(==0xFFFFFFFF)(unwords["GetFileAttributes",showname])$c_GetFileAttributesc_nameforeignimportWINDOWS_CCONVunsafe"windows.h GetFileAttributesW"c_GetFileAttributes::LPCTSTR->IOFileAttributeOrFlaggetFileAttributesExStandard::String->IOWIN32_FILE_ATTRIBUTE_DATAgetFileAttributesExStandardname=alloca$\res->dowithTStringname$\c_name->failIfFalseWithRetry_"getFileAttributesExStandard"$c_GetFileAttributesExc_namegetFileExInfoStandardrespeekresforeignimportWINDOWS_CCONVunsafe"windows.h GetFileAttributesExW"c_GetFileAttributesEx::LPCTSTR->GET_FILEEX_INFO_LEVELS->Ptra->IOBOOLgetFileInformationByHandle::HANDLE->IOBY_HANDLE_FILE_INFORMATIONgetFileInformationByHandleh=alloca$\res->dofailIfFalseWithRetry_"GetFileInformationByHandle"$c_GetFileInformationByHandlehrespeekresforeignimportWINDOWS_CCONVunsafe"windows.h GetFileInformationByHandle"c_GetFileInformationByHandle::HANDLE->PtrBY_HANDLE_FILE_INFORMATION->IOBOOL------------------------------------------------------------------ Read/write files------------------------------------------------------------------ No support for this yetdataOVERLAPPED=OVERLAPPED{ovl_internal::ULONG_PTR,ovl_internalHigh::ULONG_PTR,ovl_offset::DWORD,ovl_offsetHigh::DWORD,ovl_hEvent::HANDLE}deriving(Show)instanceStorableOVERLAPPEDwheresizeOf=const((32)){-# LINE753"System\\Win32\\File.hsc"#-}alignment_=8{-# LINE754"System\\Win32\\File.hsc"#-}pokebufad=do((\hsc_ptr->pokeByteOffhsc_ptr0))buf(ovl_internalad){-# LINE756"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr8))buf(ovl_internalHighad){-# LINE757"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr16))buf(ovl_offsetad){-# LINE758"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr20))buf(ovl_offsetHighad){-# LINE759"System\\Win32\\File.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr24))buf(ovl_hEventad){-# LINE760"System\\Win32\\File.hsc"#-}peekbuf=dointnl<-((\hsc_ptr->peekByteOffhsc_ptr0))buf{-# LINE763"System\\Win32\\File.hsc"#-}intnl_high<-((\hsc_ptr->peekByteOffhsc_ptr8))buf{-# LINE764"System\\Win32\\File.hsc"#-}off<-((\hsc_ptr->peekByteOffhsc_ptr16))buf{-# LINE765"System\\Win32\\File.hsc"#-}off_high<-((\hsc_ptr->peekByteOffhsc_ptr20))buf{-# LINE766"System\\Win32\\File.hsc"#-}hevnt<-((\hsc_ptr->peekByteOffhsc_ptr24))buf{-# LINE767"System\\Win32\\File.hsc"#-}return$OVERLAPPEDintnlintnl_highoffoff_highhevnttypeLPOVERLAPPED=PtrOVERLAPPEDtypeMbLPOVERLAPPED=MaybeLPOVERLAPPED--Sigh - I give up & prefix win32_ to the next two to avoid-- senseless Prelude name clashes. --sof.win32_ReadFile::HANDLE->Ptra->DWORD->MaybeLPOVERLAPPED->IODWORDwin32_ReadFilehbufnmb_over=alloca$\p_n->dofailIfFalse_"ReadFile"$c_ReadFilehbufnp_n(maybePtrmb_over)peekp_nforeignimportWINDOWS_CCONVunsafe"windows.h ReadFile"c_ReadFile::HANDLE->Ptra->DWORD->PtrDWORD->LPOVERLAPPED->IOBoolwin32_WriteFile::HANDLE->Ptra->DWORD->MaybeLPOVERLAPPED->IODWORDwin32_WriteFilehbufnmb_over=alloca$\p_n->dofailIfFalse_"WriteFile"$c_WriteFilehbufnp_n(maybePtrmb_over)peekp_nforeignimportWINDOWS_CCONVunsafe"windows.h WriteFile"c_WriteFile::HANDLE->Ptra->DWORD->PtrDWORD->LPOVERLAPPED->IOBoolsetFilePointerEx::HANDLE->LARGE_INTEGER->FilePtrDirection->IOLARGE_INTEGERsetFilePointerExhdistdir=alloca$\p_pos->dofailIfFalse_"SetFilePointerEx"$c_SetFilePointerExhdistp_posdirpeekp_posforeignimportWINDOWS_CCONVunsafe"windows.h SetFilePointerEx"c_SetFilePointerEx::HANDLE->LARGE_INTEGER->PtrLARGE_INTEGER->FilePtrDirection->IOBool------------------------------------------------------------------ File Notifications---- Use these to initialise, "increment" and close a HANDLE you can wait-- on.----------------------------------------------------------------findFirstChangeNotification::String->Bool->FileNotificationFlag->IOHANDLEfindFirstChangeNotificationpathwatchflag=withTStringpath$\c_path->failIfNull(unwords["FindFirstChangeNotification",showpath])$c_FindFirstChangeNotificationc_pathwatchflagforeignimportWINDOWS_CCONVunsafe"windows.h FindFirstChangeNotificationW"c_FindFirstChangeNotification::LPCTSTR->Bool->FileNotificationFlag->IOHANDLEfindNextChangeNotification::HANDLE->IO()findNextChangeNotificationh=failIfFalse_"FindNextChangeNotification"$c_FindNextChangeNotificationhforeignimportWINDOWS_CCONVunsafe"windows.h FindNextChangeNotification"c_FindNextChangeNotification::HANDLE->IOBoolfindCloseChangeNotification::HANDLE->IO()findCloseChangeNotificationh=failIfFalse_"FindCloseChangeNotification"$c_FindCloseChangeNotificationhforeignimportWINDOWS_CCONVunsafe"windows.h FindCloseChangeNotification"c_FindCloseChangeNotification::HANDLE->IOBool------------------------------------------------------------------ Directories----------------------------------------------------------------typeWIN32_FIND_DATA=()newtypeFindData=FindData(ForeignPtrWIN32_FIND_DATA)getFindDataFileName::FindData->IOFilePathgetFindDataFileName(FindDatafp)=withForeignPtrfp$\p->peekTString(((\hsc_ptr->hsc_ptr`plusPtr`44))p){-# LINE839"System\\Win32\\File.hsc"#-}findFirstFile::String->IO(HANDLE,FindData)findFirstFilestr=dofp_finddata<-mallocForeignPtrBytes(592){-# LINE843"System\\Win32\\File.hsc"#-}withForeignPtrfp_finddata$\p_finddata->dohandle<-withTStringstr$\tstr->dofailIf(==iNVALID_HANDLE_VALUE)"findFirstFile"$c_FindFirstFiletstrp_finddatareturn(handle,FindDatafp_finddata)foreignimportWINDOWS_CCONVunsafe"windows.h FindFirstFileW"c_FindFirstFile::LPCTSTR->PtrWIN32_FIND_DATA->IOHANDLEfindNextFile::HANDLE->FindData->IOBool-- False -> no more filesfindNextFileh(FindDatafinddata)=dowithForeignPtrfinddata$\p_finddata->dob<-c_FindNextFilehp_finddataifbthenreturnTrueelsedoerr_code<-getLastErroriferr_code==(18){-# LINE860"System\\Win32\\File.hsc"#-}thenreturnFalseelsefailWith"findNextFile"err_codeforeignimportWINDOWS_CCONVunsafe"windows.h FindNextFileW"c_FindNextFile::HANDLE->PtrWIN32_FIND_DATA->IOBOOLfindClose::HANDLE->IO()findCloseh=failIfFalse_"findClose"$c_FindClosehforeignimportWINDOWS_CCONVunsafe"windows.h FindClose"c_FindClose::HANDLE->IOBOOL------------------------------------------------------------------ DOS Device flags----------------------------------------------------------------defineDosDevice::DefineDosDeviceFlags->String->MaybeString->IO()defineDosDeviceflagsnamepath=maybeWithwithTStringpath$\c_path->withTStringname$\c_name->failIfFalse_"DefineDosDevice"$c_DefineDosDeviceflagsc_namec_pathforeignimportWINDOWS_CCONVunsafe"windows.h DefineDosDeviceW"c_DefineDosDevice::DefineDosDeviceFlags->LPCTSTR->LPCTSTR->IOBool------------------------------------------------------------------ These functions are very unusual in the Win32 API:-- They dont return error codesforeignimportWINDOWS_CCONVunsafe"windows.h AreFileApisANSI"areFileApisANSI::IOBoolforeignimportWINDOWS_CCONVunsafe"windows.h SetFileApisToOEM"setFileApisToOEM::IO()foreignimportWINDOWS_CCONVunsafe"windows.h SetFileApisToANSI"setFileApisToANSI::IO()foreignimportWINDOWS_CCONVunsafe"windows.h SetHandleCount"setHandleCount::UINT->IOUINT----------------------------------------------------------------getLogicalDrives::IODWORDgetLogicalDrives=failIfZero"GetLogicalDrives"$c_GetLogicalDrivesforeignimportWINDOWS_CCONVunsafe"windows.h GetLogicalDrives"c_GetLogicalDrives::IODWORD-- %fun GetDriveType :: Maybe String -> IO DriveTypegetDiskFreeSpace::MaybeString->IO(DWORD,DWORD,DWORD,DWORD)getDiskFreeSpacepath=maybeWithwithTStringpath$\c_path->alloca$\p_sectors->alloca$\p_bytes->alloca$\p_nfree->alloca$\p_nclusters->dofailIfFalse_"GetDiskFreeSpace"$c_GetDiskFreeSpacec_pathp_sectorsp_bytesp_nfreep_nclusterssectors<-peekp_sectorsbytes<-peekp_bytesnfree<-peekp_nfreenclusters<-peekp_nclustersreturn(sectors,bytes,nfree,nclusters)foreignimportWINDOWS_CCONVunsafe"windows.h GetDiskFreeSpaceW"c_GetDiskFreeSpace::LPCTSTR->PtrDWORD->PtrDWORD->PtrDWORD->PtrDWORD->IOBoolsetVolumeLabel::MaybeString->MaybeString->IO()setVolumeLabelpathname=maybeWithwithTStringpath$\c_path->maybeWithwithTStringname$\c_name->failIfFalse_"SetVolumeLabel"$c_SetVolumeLabelc_pathc_nameforeignimportWINDOWS_CCONVunsafe"windows.h SetVolumeLabelW"c_SetVolumeLabel::LPCTSTR->LPCTSTR->IOBool------------------------------------------------------------------ File locks------------------------------------------------------------------ | Locks a given range in a file handle, To lock an entire file-- use 0xFFFFFFFFFFFFFFFF for size and 0 for offset.lockFile::HANDLE-- ^ CreateFile handle->LockMode-- ^ Locking mode->DWORD64-- ^ Size of region to lock->DWORD64-- ^ Beginning offset of file to lock->IOBOOL-- ^ Indicates if locking was successful, if not query-- getLastError.lockFilehwndmodesizef_offset=dolets_low=fromIntegral(size.&.0xFFFFFFFF)s_hi=fromIntegral(size`shiftR`32)o_low=fromIntegral(f_offset.&.0xFFFFFFFF)o_hi=fromIntegral(f_offset`shiftR`32)ovlp=OVERLAPPED00o_lowo_hinullPtrwithovlp$\ptr->c_LockFileExhwndmode0s_lows_hiptrforeignimportWINDOWS_CCONVunsafe"LockFileEx"c_LockFileEx::HANDLE->DWORD->DWORD->DWORD->DWORD->LPOVERLAPPED->IOBOOL-- | Unlocks a given range in a file handle, To unlock an entire file-- use 0xFFFFFFFFFFFFFFFF for size and 0 for offset.unlockFile::HANDLE-- ^ CreateFile handle->DWORD64-- ^ Size of region to unlock->DWORD64-- ^ Beginning offset of file to unlock->IOBOOL-- ^ Indicates if unlocking was successful, if not query-- getLastError.unlockFilehwndsizef_offset=dolets_low=fromIntegral(size.&.0xFFFFFFFF)s_hi=fromIntegral(size`shiftR`32)o_low=fromIntegral(f_offset.&.0xFFFFFFFF)o_hi=fromIntegral(f_offset`shiftR`32)ovlp=OVERLAPPED00o_lowo_hinullPtrwithovlp$\ptr->c_UnlockFileExhwnd0s_lows_hiptrforeignimportWINDOWS_CCONVunsafe"UnlockFileEx"c_UnlockFileEx::HANDLE->DWORD->DWORD->DWORD->LPOVERLAPPED->IOBOOL------------------------------------------------------------------ End----------------------------------------------------------------