|
|
/*
Copyright (c) 1992 Microsoft Corporation
Module Name:
fileio.h
Abstract:
This file defines the file I/O prototypes
Author:
Jameel Hyder (microsoft!jameelh)
Revision History: 18 Jun 1992 Initial Version
Notes: Tab stop: 4 --*/
#ifndef _FILEIO_
#define _FILEIO_
#define FILEIO_OPEN_FILE (FILE_NON_DIRECTORY_FILE |\
FILE_RANDOM_ACCESS |\ FILE_SYNCHRONOUS_IO_NONALERT)
#define FILEIO_OPEN_FILE_SEQ (FILE_NON_DIRECTORY_FILE |\
FILE_SEQUENTIAL_ONLY |\ FILE_NO_INTERMEDIATE_BUFFERING |\ FILE_SYNCHRONOUS_IO_NONALERT)
#define FILEIO_OPEN_DIR (FILE_DIRECTORY_FILE |\
FILE_SYNCHRONOUS_IO_NONALERT)
#define FILEIO_OPEN_EITHER (FILE_SYNCHRONOUS_IO_NONALERT)
#define FILEIO_ACCESS_NONE (FILE_READ_ATTRIBUTES |\
SYNCHRONIZE) #define FILEIO_ACCESS_READ (GENERIC_READ |\
SYNCHRONIZE) #define FILEIO_ACCESS_WRITE (GENERIC_WRITE |\
SYNCHRONIZE) #define FILEIO_ACCESS_READWRITE (FILEIO_ACCESS_READ |\
FILEIO_ACCESS_WRITE) #define FILEIO_ACCESS_DELETE (DELETE |\
SYNCHRONIZE) #define FILEIO_ACCESS_MAX 4
// Note that READ and WRITE share modes are enforced on a per-stream
// basis, whereas DELETE share mode is still per-file. We must include
// SHARE_DELETE even for deny-all since things like cmd.exe will open
// a directory for DELETE when cd-ing into that directory. If we were to
// then try to open the AFP_AfpInfo stream with no share delete access it
// would fail. Since mac has no concept of share delete this is acceptible.
// In addition, mac must open for delete in order to rename/move a file/dir.
//
// The sharing modes are strictly per-stream except for the following
// exceptions:
//
// To delete the entire file, the caller must open the unnamed data
// stream (file) or the directory for delete access.
//
// If an open of any stream does not permit delete access to that stream
// then no one may open the file for for delete access. Conversely if
// the file is already opened for delete access then any open of a
// stream which denies delete access will fail with a sharing violation.
//
// The reasoning is that if someone wants to prevent a stream from being
// deleted then they must prevent anyone from opening the file for
// delete.
#define FILEIO_DENY_NONE (FILE_SHARE_READ |\
FILE_SHARE_WRITE |\ FILE_SHARE_DELETE) #define FILEIO_DENY_READ (FILE_SHARE_WRITE |\
FILE_SHARE_DELETE) #define FILEIO_DENY_WRITE (FILE_SHARE_READ |\
FILE_SHARE_DELETE) #define FILEIO_DENY_ALL FILE_SHARE_DELETE
#define FILEIO_DENY_MAX 4
#define FILEIO_CREATE_SOFT FILE_CREATE
#define FILEIO_CREATE_HARD FILE_SUPERSEDE
#define FILEIO_CREATE_INTERNAL FILE_OPEN_IF
#define FILEIO_CREATE_MAX 2
// do NOT change the order of these unless you also change the code in
// afpVolumeCloseHandleAndFreeDesc for deleting streams from volume root.
#define AFP_STREAM_DATA 0
#define AFP_STREAM_RESC 1
#define AFP_STREAM_IDDB 2
#define AFP_STREAM_DT 3
#define AFP_STREAM_INFO 4
#define AFP_STREAM_COMM 5
#define AFP_STREAM_MAX 6
// directories to ignore when enumerating
GLOBAL UNICODE_STRING Dot EQU {0, 0, NULL}; GLOBAL UNICODE_STRING DotDot EQU {0, 0, NULL};
// stream not to create during CopyFile
GLOBAL UNICODE_STRING DataStreamName EQU {0, 0, NULL}; #define IS_DATA_STREAM(pUnicodeStreamName) \
EQUAL_UNICODE_STRING(pUnicodeStreamName, &DataStreamName, False)
GLOBAL UNICODE_STRING FullCommentStreamName EQU {0, 0, NULL}; #define IS_COMMENT_STREAM(pUnicodeStreamName) \
EQUAL_UNICODE_STRING(pUnicodeStreamName, &FullCommentStreamName, False)
GLOBAL UNICODE_STRING FullResourceStreamName EQU {0, 0, NULL}; #define IS_RESOURCE_STREAM(pUnicodeStreamName) \
EQUAL_UNICODE_STRING(pUnicodeStreamName, &FullResourceStreamName, True)
GLOBAL UNICODE_STRING FullInfoStreamName EQU {0, 0, NULL}; #define IS_INFO_STREAM(pUnicodeStreamName) \
EQUAL_UNICODE_STRING(pUnicodeStreamName, &FullInfoStreamName, True)
// temporary filename when renaming files for FpExchangeFiles
// the name is composed of 40 spaces
#define AFP_TEMP_EXCHANGE_NAME L" "
GLOBAL UNICODE_STRING AfpExchangeName EQU {0, 0, NULL};
GLOBAL UNICODE_STRING DosDevices EQU {0, 0, NULL};
GLOBAL UNICODE_STRING AfpStreams[AFP_STREAM_MAX] EQU { 0 };
#define AfpIdDbStream AfpStreams[AFP_STREAM_IDDB]
#define AfpDesktopStream AfpStreams[AFP_STREAM_DT]
#define AfpResourceStream AfpStreams[AFP_STREAM_RESC]
#define AfpInfoStream AfpStreams[AFP_STREAM_INFO]
#define AfpCommentStream AfpStreams[AFP_STREAM_COMM]
#define AfpDataStream AfpStreams[AFP_STREAM_DATA]
#pragma warning(disable:4010)
#if 0
GLOBAL DWORD AfpAccessModes[FILEIO_ACCESS_MAX] EQU \ { \ FILEIO_ACCESS_NONE, \ FILEIO_ACCESS_READ, \ FILEIO_ACCESS_WRITE, \ FILEIO_ACCESS_READWRITE \ }; #endif
GLOBAL DWORD AfpDenyModes[FILEIO_DENY_MAX] EQU \ { \ FILEIO_DENY_NONE, \ FILEIO_DENY_READ, \ FILEIO_DENY_WRITE, \ FILEIO_DENY_ALL \ };
GLOBAL DWORD AfpCreateDispositions[FILEIO_CREATE_MAX] EQU\ { \ FILEIO_CREATE_SOFT, \ FILEIO_CREATE_HARD \ };
// This structure is used by file-system interface code
#if DBG
#define FSH_SIGNATURE *(DWORD *)"FSH"
#define VALID_FSH(pFSH) (((pFSH) != NULL) && \
((pFSH)->fsh_FileHandle != NULL) && \ ((pFSH)->fsh_FileObject != NULL) && \ ((pFSH)->Signature == FSH_SIGNATURE)) #else
#define VALID_FSH(pFSH) (((pFSH)->fsh_FileHandle != NULL) && \
((pFSH)->fsh_FileObject != NULL)) #endif
// NOTE: We overload the FileObject pointer to keep track of internal/client
// handles. We always mask off this while actually accessing it. The
// assumption here is that this pointer will never be odd.
//
#define FSH_INTERNAL_MASK 1
#define AfpGetRealFileObject(pFileObject) (PFILE_OBJECT)((ULONG_PTR)(pFileObject) & ~FSH_INTERNAL_MASK)
typedef struct _FileSysHandle { #if DBG
DWORD Signature; #endif
HANDLE fsh_FileHandle; // Host file handle
PFILE_OBJECT fsh_FileObject; // File Object corres. to the file handle
PDEVICE_OBJECT fsh_DeviceObject; // Device Object corres. to the file handle
} FILESYSHANDLE, *PFILESYSHANDLE;
#define INTERNAL_HANDLE(pFSHandle) ((ULONG_PTR)((pFSHandle)->fsh_FileObject) & FSH_INTERNAL_MASK) ? True : False
#define UPGRADE_HANDLE(pFSHandle) ((ULONG_PTR)((pFSHandle)->fsh_FileObject) &= ~FSH_INTERNAL_MASK)
typedef struct _StreamsInfo { UNICODE_STRING si_StreamName; LARGE_INTEGER si_StreamSize; } STREAM_INFO, *PSTREAM_INFO;
typedef struct _CopyFileInfo { LONG cfi_NumStreams; PFILESYSHANDLE cfi_SrcStreamHandle; PFILESYSHANDLE cfi_DstStreamHandle; } COPY_FILE_INFO, *PCOPY_FILE_INFO;
#define AFP_RETRIEVE_MODTIME 1
#define AFP_RESTORE_MODTIME 2
extern NTSTATUS AfpFileIoInit( VOID );
extern VOID AfpFileIoDeInit( VOID );
extern AFPSTATUS AfpIoOpen( IN PFILESYSHANDLE hRelative, IN DWORD StreamId, IN DWORD Options, IN PUNICODE_STRING pObject, IN DWORD AfpAccess, IN DWORD AfpDenyMode, IN BOOLEAN CheckAccess, OUT PFILESYSHANDLE pFileSysHandle );
extern AFPSTATUS AfpIoCreate( IN PFILESYSHANDLE hRelative, // create relative to this
IN DWORD StreamId, // Id of stream to create
IN PUNICODE_STRING pObject, // Name of file
IN DWORD AfpAccess, // FILEIO_ACCESS_XXX desired access
IN DWORD AfpDenyMode, // FILEIO_DENY_XXX
IN DWORD CreateOptions, // File/Directory etc.
IN DWORD Disposition, // Soft or hard create
IN DWORD Attributes, // hidden, archive, normal, etc.
IN BOOLEAN CheckAccess, // If TRUE, enforce security
IN PSECURITY_DESCRIPTOR pSecDesc OPTIONAL, // Security descriptor to slap on
OUT PFILESYSHANDLE pFileSysHandle, // Place holder for the handle
OUT PDWORD pInformation OPTIONAL, // file opened, created, etc.
IN struct _VolDesc * pVolDesc OPTIONAL, // only if NotifyPath
IN PUNICODE_STRING pNotifyPath OPTIONAL, IN PUNICODE_STRING pNotifyParentPath OPTIONAL );
extern AFPSTATUS AfpIoRead( IN PFILESYSHANDLE pFileSysHandle, IN PFORKOFFST pForkOffset, IN LONG SizeReq, OUT PLONG pSizeRead, OUT PBYTE pBuffer );
extern AFPSTATUS AfpIoWrite( IN PFILESYSHANDLE pFileSysHandle, IN PFORKOFFST pForkOffset, IN LONG SizeReq, OUT PBYTE pBuffer );
extern AFPSTATUS FASTCALL AfpIoQuerySize( IN PFILESYSHANDLE pFileSysHandle, OUT PFORKSIZE pForkLength );
extern AFPSTATUS FASTCALL AfpIoSetSize( IN PFILESYSHANDLE pFileSysHandle, IN LONG ForkLength );
extern AFPSTATUS AfpIoChangeNTModTime( IN PFILESYSHANDLE pFileHandle, OUT PTIME pModTime );
extern AFPSTATUS AfpIoQueryTimesnAttr( IN PFILESYSHANDLE pFileHandle, OUT PDWORD pCreatTime OPTIONAL, OUT PTIME pModTime OPTIONAL, OUT PDWORD pAttr OPTIONAL );
extern AFPSTATUS AfpIoSetTimesnAttr( IN PFILESYSHANDLE pFileSysHandle, IN PAFPTIME pCreateTime OPTIONAL, IN PAFPTIME pModTime OPTIONAL, IN DWORD AttrSet, IN DWORD AttrClear, IN struct _VolDesc * pVolDesc OPTIONAL, // only if NotifyPath
IN PUNICODE_STRING pNotifyPath OPTIONAL );
extern AFPSTATUS AfpIoRestoreTimeStamp( IN PFILESYSHANDLE pFileSysHandle, IN OUT PTIME pOriginalModTime, IN DWORD dwFlag );
extern AFPSTATUS FASTCALL AfpIoQueryShortName( IN PFILESYSHANDLE pFileSysHandle, OUT PANSI_STRING pName );
extern NTSTATUS AfpIoQueryLongName( IN PFILESYSHANDLE pFileHandle, IN PUNICODE_STRING pShortname, OUT PUNICODE_STRING pLongName );
extern PSTREAM_INFO FASTCALL AfpIoQueryStreams( IN PFILESYSHANDLE pFileHandle
);
extern NTSTATUS AfpIoMarkFileForDelete( IN PFILESYSHANDLE pFileSysHandle, IN struct _VolDesc * pVolDesc OPTIONAL, // only if pNotifyPath
IN PUNICODE_STRING pNotifyPath OPTIONAL, IN PUNICODE_STRING pNotifyParentPath OPTIONAL );
extern NTSTATUS AfpIoQueryDirectoryFile( IN PFILESYSHANDLE pFileSysHandle, OUT PVOID Enumbuf, IN ULONG Enumbuflen, IN ULONG FileInfoClass, IN BOOLEAN ReturnSingleEntry, IN BOOLEAN RestartScan, IN PUNICODE_STRING pString OPTIONAL );
NTSTATUS AfpIoQueryBasicInfo( IN PFILESYSHANDLE pFileHandle, OUT PVOID BasicInfoBuf );
extern AFPSTATUS FASTCALL AfpIoClose( IN PFILESYSHANDLE pFileSysHandle );
extern AFPSTATUS AfpIoQueryVolumeSize( IN struct _VolDesc * pVolDesc, OUT LARGE_INTEGER * pFreeBytes, OUT LARGE_INTEGER * pVolumeSize OPTIONAL );
extern AFPSTATUS AfpIoMoveAndOrRename( IN PFILESYSHANDLE pfshFile, IN PFILESYSHANDLE pfshNewParent OPTIONAL,// Supply for Move operation
IN PUNICODE_STRING pNewName, IN struct _VolDesc * pVolDesc OPTIONAL,// only if NotifyPath
IN PUNICODE_STRING pNotifyPath1 OPTIONAL,// REMOVE or RENAME action
IN PUNICODE_STRING pNotifyParentPath1 OPTIONAL, IN PUNICODE_STRING pNotifyPath2 OPTIONAL,// ADDED action
IN PUNICODE_STRING pNotifyParentPath2 OPTIONAL );
extern AFPSTATUS AfpIoCopyFile1( IN PFILESYSHANDLE phSrcFile, IN PFILESYSHANDLE phDstDir, IN PUNICODE_STRING pNewName, IN struct _VolDesc * pVolDesc OPTIONAL, // only if pNotifyPath
IN PUNICODE_STRING pNotifyPath OPTIONAL, IN PUNICODE_STRING pNotifyParentPath OPTIONAL, OUT PCOPY_FILE_INFO pCopyFileInfo );
extern AFPSTATUS AfpIoCopyFile2( IN PCOPY_FILE_INFO pCopyFileInfo, IN struct _VolDesc * pVolDesc OPTIONAL, // only if pNotifyPath
IN PUNICODE_STRING pNotifyPath OPTIONAL, IN PUNICODE_STRING pNotifyParentPath OPTIONAL );
extern AFPSTATUS FASTCALL AfpIoConvertNTStatusToAfpStatus( IN NTSTATUS Status );
extern VOID FASTCALL AfpUpgradeHandle( IN PFILESYSHANDLE pFileHandle );
extern NTSTATUS FASTCALL AfpIoWait( IN PVOID pObject, IN PLARGE_INTEGER pTimeOut OPTIONAL );
extern NTSTATUS AfpQueryPath( IN HANDLE FileHandle, IN PUNICODE_STRING pPath, IN ULONG MaximumBuf );
extern BOOLEAN FASTCALL AfpIoIsSupportedDevice( IN PFILESYSHANDLE pFileHandle, OUT PDWORD pFlags );
#ifdef FILEIO_LOCALS
LOCAL UNICODE_STRING afpNTFSName = { 0 }; LOCAL UNICODE_STRING afpCDFSName = { 0 };
LOCAL UNICODE_STRING afpAHFSName = { 0 };
LOCAL VOID FASTCALL afpUpdateOpenFiles( IN BOOLEAN Internal, // True for internal handles
IN BOOLEAN Open // True for open, False for close
);
LOCAL VOID FASTCALL afpUpdateFastIoStat( IN BOOLEAN Success );
#endif // FILEIO_LOCALS
#endif // _FILEIO_
|