Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

489 lines
12 KiB

/*
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_