#include <ntifs.h>
#include <wdmsec.h> // for IoCreateDeviceSecure
#include <initguid.h>
+#include <ntintsafe.h>
#include "AFSDefines.h"
OUT AFSFileID *UpdatedFID);
NTSTATUS
+AFSNotifyHardLink( IN AFSObjectInfoCB *ObjectInfo,
+ IN GUID *AuthGroup,
+ IN AFSObjectInfoCB *ParentObjectInfo,
+ IN AFSObjectInfoCB *TargetParentObjectInfo,
+ IN AFSDirectoryCB *SourceDirectoryCB,
+ IN UNICODE_STRING *TargetName,
+ IN BOOLEAN bReplaceIfExists,
+ OUT AFSDirectoryCB **TargetDirectoryCB);
+
+NTSTATUS
AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
IN GUID *AuthGroup,
IN BOOLEAN FastCall,
NTSTATUS
AFSEvaluateTargetByName( IN GUID *AuthGroup,
- IN AFSFileID *ParentFileId,
+ IN AFSObjectInfoCB *ParentObjectInfo,
IN PUNICODE_STRING SourceName,
+ IN ULONG Flags,
OUT AFSDirEnumEntry **DirEnumEntry);
NTSTATUS
OUT AFSVolumeInfoCB *VolumeInformation);
NTSTATUS
+AFSRetrieveVolumeSizeInformation( IN GUID *AuthGroup,
+ IN AFSFileID *FileID,
+ OUT AFSVolumeSizeInfoCB *VolumeSizeInformation);
+
+NTSTATUS
AFSNotifyPipeTransceive( IN AFSCcb *Ccb,
IN ULONG InputLength,
IN ULONG OutputLength,
IN LARGE_INTEGER *ExtentOffset,
IN ULONG Length);
+NTSTATUS
+AFSCreateSymlink( IN GUID *AuthGroup,
+ IN AFSObjectInfoCB *ParentObjectInfo,
+ IN UNICODE_STRING *FileName,
+ IN AFSObjectInfoCB *ObjectInfo,
+ IN UNICODE_STRING *TargetName);
+
//
// AFSCreate.cpp Prototypes
//
IN AFSVolumeCB *VolumeCB,
IN AFSDirectoryCB *ParentDirCB,
IN AFSDirectoryCB *DirectoryCB,
+ IN BOOLEAN bOpenedReparsePoint,
OUT AFSFcb **Fcb,
OUT AFSCcb **Ccb);
IN ULONG Size);
NTSTATUS
-AFSWaitForExtentMapping ( IN AFSFcb *Fcb );
+AFSWaitForExtentMapping ( IN AFSFcb *Fcb,
+ IN AFSCcb *Ccb);
NTSTATUS
AFSProcessSetFileExtents( IN AFSSetFileExtentsCB *SetExtents );
NTSTATUS
AFSReleaseExtentsWithFlush( IN AFSFcb *Fcb,
- IN GUID *AuthGroup);
+ IN GUID *AuthGroup,
+ IN BOOLEAN bReleaseAll);
+
+NTSTATUS
+AFSReleaseCleanExtents( IN AFSFcb *Fcb,
+ IN GUID *AuthGroup);
VOID
AFSMarkDirty( IN AFSFcb *pFcb,
IN AFSExtent *StartExtent,
IN ULONG ExtentsCount,
- IN LARGE_INTEGER *StartingByte);
+ IN LARGE_INTEGER *StartingByte,
+ IN BOOLEAN DerefExtents);
-BOOLEAN
+VOID
AFSTearDownFcbExtents( IN AFSFcb *Fcb,
IN GUID *AuthGroup);
+VOID
+AFSDeleteFcbExtents( IN AFSFcb *Fcb);
+
void
AFSTrimExtents( IN AFSFcb *Fcb,
IN PLARGE_INTEGER FileSize);
AFSRemoveEntryDirtyList( IN AFSFcb *Fcb,
IN AFSExtent *Extent);
+AFSExtent *
+ExtentFor( PLIST_ENTRY le, ULONG SkipList );
+
+AFSExtent *
+NextExtent( AFSExtent *Extent, ULONG SkipList );
+
+ULONG
+AFSConstructCleanByteRangeList( AFSFcb * pFcb,
+ AFSByteRange ** pByteRangeList);
+
#if GEN_MD5
void
AFSSetupMD5Hash( IN AFSFcb *Fcb,
// AFSClose.cpp Prototypes
//
+
NTSTATUS
AFSClose( IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
//
NTSTATUS
-AFSInitFcb( IN AFSDirectoryCB *DirEntry,
- IN OUT AFSFcb **Fcb);
-
-NTSTATUS
-AFSInitVolume( IN GUID *AuthGroup,
- IN AFSFileID *RootFid,
- OUT AFSVolumeCB **VolumeCB);
-
-NTSTATUS
-AFSRemoveVolume( IN AFSVolumeCB *VolumeCB);
+AFSInitFcb( IN AFSDirectoryCB *DirEntry);
NTSTATUS
AFSInitRootFcb( IN ULONGLONG ProcessID,
IN AFSVolumeCB *VolumeCB);
void
-AFSRemoveRootFcb( IN AFSFcb *RootFcb);
+AFSRemoveRootFcb( IN AFSVolumeCB *VolumeCB);
NTSTATUS
-AFSInitCcb( IN OUT AFSCcb **Ccb);
+AFSInitCcb( IN OUT AFSCcb **Ccb,
+ IN AFSDirectoryCB *DirectoryCB,
+ IN ACCESS_MASK GrantedAccess,
+ IN ULONG FileAccess);
void
-AFSRemoveFcb( IN AFSFcb *Fcb);
+AFSRemoveFcb( IN AFSFcb **Fcb);
-NTSTATUS
+void
AFSRemoveCcb( IN AFSFcb *Fcb,
IN AFSCcb *Ccb);
NTSTATUS
AFSLocateNameEntry( IN GUID *AuthGroup,
IN PFILE_OBJECT FileObject,
- IN UNICODE_STRING *RootPathName,
+ IN OUT UNICODE_STRING *RootPathName,
IN UNICODE_STRING *ParsedPathName,
IN AFSNameArrayHdr *NameArray,
IN ULONG Flags,
- OUT AFSVolumeCB **VolumeCB,
- IN OUT AFSDirectoryCB **ParentDirectoryCB,
- OUT AFSDirectoryCB **DirectoryCB,
- OUT PUNICODE_STRING ComponentName);
+ IN AFSVolumeCB *VolumeCB,
+ IN AFSDirectoryCB *ParentDirectoryCB,
+ OUT AFSVolumeCB **OutVolumeCB,
+ OUT LONG *OutVolumeReferenceReason,
+ OUT AFSDirectoryCB **OutParentDirectoryCB,
+ OUT AFSDirectoryCB **OutDirectoryCB,
+ OUT PUNICODE_STRING ComponentName,
+ OUT PUNICODE_STRING TargetName);
NTSTATUS
AFSCreateDirEntry( IN GUID *AuthGroup,
IN AFSDirectoryCB *DirEntry,
IN BOOLEAN InsertInEnumList);
-NTSTATUS
+void
AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
- IN AFSDirectoryCB *DirEntry);
+ IN AFSDirectoryCB **ppDirEntry);
NTSTATUS
AFSRemoveDirNodeFromParent( IN AFSObjectInfoCB *ParentObjectInfo,
NTSTATUS
AFSProcessDFSLink( IN AFSDirectoryCB *DirEntry,
IN PFILE_OBJECT FileObject,
- IN UNICODE_STRING *RemainingPath,
- IN GUID *AuthGroup);
+ IN PUNICODE_STRING RemainingPath,
+ IN GUID *AuthGroup,
+ OUT PUNICODE_STRING TargetName);
//
// AFSNetworkProviderSupport.cpp
NTSTATUS
AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN HANDLE CallingUser);
+ IN PIRP Irp,
+ IN HANDLE CallingUser,
+ IN BOOLEAN bRetry);
NTSTATUS
AFSWrite( IN PDEVICE_OBJECT DeviceObject,
AFSShareWrite( IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
+NTSTATUS
+AFSDeferWrite( IN PDEVICE_OBJECT DeviceObject,
+ IN PFILE_OBJECT FileObject,
+ IN HANDLE CallingUser,
+ IN PIRP Irp,
+ IN ULONG BytesToWrite,
+ IN BOOLEAN Retrying);
+
//
// AFSFileInfo.cpp Prototypes
//
IN OUT PLONG Length);
NTSTATUS
-AFSQueryAccess( IN PIRP Irp,
- IN AFSFcb *Fcb,
- IN OUT PFILE_ACCESS_INFORMATION Buffer,
- IN OUT PLONG Length);
-
-NTSTATUS
-AFSQueryMode( IN PIRP Irp,
- IN AFSFcb *Fcb,
- IN OUT PFILE_MODE_INFORMATION Buffer,
- IN OUT PLONG Length);
-
-NTSTATUS
-AFSQueryAlignment( IN PIRP Irp,
- IN AFSFcb *Fcb,
- IN OUT PFILE_ALIGNMENT_INFORMATION Buffer,
- IN OUT PLONG Length);
-
-NTSTATUS
AFSQueryAttribTagInfo( IN PIRP Irp,
IN AFSDirectoryCB *DirectoryCB,
IN OUT FILE_ATTRIBUTE_TAG_INFORMATION *Buffer,
NTSTATUS
AFSSetBasicInfo( IN PIRP Irp,
- IN AFSDirectoryCB *DirectoryCB);
+ IN AFSDirectoryCB *DirectoryCB,
+ OUT BOOLEAN *bUpdateFileInfo);
NTSTATUS
AFSSetDispositionInfo( IN PIRP Irp,
AFSSetRenameInfo( IN PIRP Irp);
NTSTATUS
+AFSSetFileLinkInfo( IN PIRP Irp);
+
+NTSTATUS
AFSSetPositionInfo( IN PIRP Irp,
IN AFSDirectoryCB *DirectoryCB);
IN PIRP Irp);
//
+// AFSVolume.cpp Prototypes
+//
+
+NTSTATUS
+AFSInitVolume( IN GUID *AuthGroup,
+ IN AFSFileID *RootFid,
+ IN LONG VolumeReferenceReason,
+ OUT AFSVolumeCB **VolumeCB);
+
+NTSTATUS
+AFSRemoveVolume( IN AFSVolumeCB *VolumeCB);
+
+LONG
+AFSVolumeIncrement( IN AFSVolumeCB *VolumeCB,
+ IN LONG Reason);
+
+LONG
+AFSVolumeDecrement( IN AFSVolumeCB *VolumeCB,
+ IN LONG Reason);
+
+//
// AFSVolumeInfo.cpp Prototypes
//
NTSTATUS
AFSQueryFsVolumeInfo( IN AFSVolumeInfoCB *VolumeInfo,
IN PFILE_FS_VOLUME_INFORMATION Buffer,
+ IN BOOLEAN bDosDevice,
IN OUT PULONG Length);
NTSTATUS
AFSIsNameInSnapshot( IN AFSSnapshotHdr *SnapshotHdr,
IN ULONG HashIndex);
+NTSTATUS
+AFSProcessDirectoryQueryDirect( IN AFSFcb *Fcb,
+ IN AFSCcb *Ccb,
+ IN IRP *Irp);
+
//
// AFSFSControl.cpp Prototypes
//
//
ULONG
-AFSExceptionFilter( IN ULONG Code,
+AFSExceptionFilter( IN CHAR *FunctionString,
+ IN ULONG Code,
IN PEXCEPTION_POINTERS ExceptPtrs);
BOOLEAN
void *
AFSLockUserBuffer( IN void *UserBuffer,
IN ULONG BufferLength,
- OUT MDL ** Mdl);
+ OUT MDL ** Mdl);
void *
AFSMapToService( IN PIRP Irp,
NTSTATUS
AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB);
+NTSTATUS
+AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
+ IN ULONG Reason);
+
BOOLEAN
AFSIsChildOfParent( IN AFSFcb *Dcb,
IN AFSFcb *Fcb);
AFSInvalidateVolume( IN AFSVolumeCB *VolumeCB,
IN ULONG Reason);
+VOID
+AFSInvalidateAllVolumes( VOID);
+
NTSTATUS
AFSVerifyEntry( IN GUID *AuthGroup,
- IN AFSDirectoryCB *DirectoryCB);
+ IN AFSDirectoryCB *DirectoryCB,
+ IN BOOLEAN bFollowMountPoint);
NTSTATUS
AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus);
NTSTATUS
AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
IN GUID *AuthGroup,
- IN BOOLEAN PurgeContent,
- IN BOOLEAN FastCall);
+ IN BOOLEAN FastCall,
+ IN BOOLEAN SafeToPurge);
AFSDirectoryCB *
AFSGetSpecialShareNameEntry( IN UNICODE_STRING *ShareName,
BOOLEAN
AFSIsRelativeName( IN UNICODE_STRING *Name);
+BOOLEAN
+AFSIsAbsoluteAFSName( IN UNICODE_STRING *Name);
+
void
AFSUpdateName( IN UNICODE_STRING *Name);
IN WCHAR *NameBuffer,
IN USHORT NameLength);
-AFSNameArrayHdr *
-AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
- IN ULONG InitialElementCount);
-
-NTSTATUS
-AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
- IN UNICODE_STRING *Path,
- IN AFSDirectoryCB *DirectoryCB);
-
-NTSTATUS
-AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
- IN AFSNameArrayHdr *RelatedNameArray,
- IN AFSDirectoryCB *DirectoryCB);
-
-NTSTATUS
-AFSFreeNameArray( IN AFSNameArrayHdr *NameArray);
-
-NTSTATUS
-AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirEntry);
-
-void
-AFSReplaceCurrentElement( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirectoryCB);
-
-AFSDirectoryCB *
-AFSBackupEntry( IN AFSNameArrayHdr *NameArray);
-
-AFSDirectoryCB *
-AFSGetParentEntry( IN AFSNameArrayHdr *NameArray);
-
-void
-AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirEntry);
-
-void
-AFSDumpNameArray( IN IN AFSNameArrayHdr *NameArray);
-
void
AFSSetEnumerationEvent( IN AFSFcb *Fcb);
AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo,
IN ULONGLONG HashIndex);
+LONG
+AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo,
+ IN LONG Reason);
+
+LONG
+AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo,
+ IN LONG Reason);
+
+void
+AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo);
+
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB * VolumeCB,
+ IN AFSFileID * FileID,
+ IN BOOLEAN bUpdateLastUse);
+
void
-AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo);
+AFSReleaseObjectInfo( IN OUT AFSObjectInfoCB **ppObjectInfo);
NTSTATUS
AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
IN SIZE_T NumberOfBytes,
IN ULONG Tag);
+#define AFSLibExFreePool(x) ExFreePool(x)
+
+#define AFSLibExFreePoolWithTag(x,y) ExFreePoolWithTag(x,y)
+
BOOLEAN
AFSValidNameFormat( IN UNICODE_STRING *FileName);
IN BOOLEAN WriteAccess,
OUT GUID *AuthGroup);
+NTSTATUS
+AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
+ IN ULONG InvalidateReason);
+
+BOOLEAN
+AFSIgnoreReparsePointToFile( void);
+
+NTSTATUS
+AFSRetrieveTargetFileInfo( IN PUNICODE_STRING TargetName,
+ OUT AFSFileInfoCB *FileInfo);
+
+//
+// AFSNameArray.cpp Prototypes
+//
+
+AFSNameArrayHdr *
+AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
+ IN ULONG InitialElementCount);
+
+NTSTATUS
+AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
+ IN UNICODE_STRING *Path,
+ IN AFSDirectoryCB *DirectoryCB);
+
+NTSTATUS
+AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
+ IN AFSNameArrayHdr *RelatedNameArray,
+ IN AFSDirectoryCB *DirectoryCB);
+
+NTSTATUS
+AFSFreeNameArray( IN AFSNameArrayHdr *NameArray);
+
+NTSTATUS
+AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
+ IN AFSDirectoryCB *DirEntry);
+
+AFSDirectoryCB *
+AFSBackupEntry( IN AFSNameArrayHdr *NameArray);
+
+AFSDirectoryCB *
+AFSGetParentEntry( IN AFSNameArrayHdr *NameArray);
+
+void
+AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
+ IN AFSDirectoryCB *DirEntry);
+
+void
+AFSDumpNameArray( IN IN AFSNameArrayHdr *NameArray);
+
//
// AFSWorker.cpp Prototypes
//
void
AFSPrimaryVolumeWorkerThread( IN PVOID Context);
-void
-AFSVolumeWorkerThread( IN PVOID Context);
-
NTSTATUS
AFSInsertWorkitem( IN AFSWorkItem *WorkItem);
IN GUID *AuthGroup);
NTSTATUS
-AFSQueueAsyncRead( IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN HANDLE CallerProcess);
-
-NTSTATUS
-AFSQueueAsyncWrite( IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN HANDLE CallerProcess);
-
-NTSTATUS
AFSQueueGlobalRootEnumeration( void);
NTSTATUS
IN ULONG RunCount,
IN AFSGatherIo *GatherIo);
+NTSTATUS
+AFSQueueInvalidateObject( IN AFSObjectInfoCB *ObjectInfo,
+ IN ULONG InvalidateReason);
+
//
// AFSMD5Support.cpp Prototypes
//