Windows: !overwrite IOMgr populated FileInfo data
[openafs.git] / src / WINNT / afsrdr / kernel / lib / Include / AFSCommon.h
index 5bba777..55735e2 100644 (file)
@@ -203,6 +203,16 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
                  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,
@@ -212,6 +222,7 @@ NTSTATUS
 AFSEvaluateTargetByName( IN GUID *AuthGroup,
                          IN AFSObjectInfoCB *ParentObjectInfo,
                          IN PUNICODE_STRING SourceName,
+                         IN ULONG Flags,
                          OUT AFSDirEnumEntry **DirEnumEntry);
 
 NTSTATUS
@@ -253,6 +264,13 @@ AFSIsExtentRequestQueued( IN AFSFileID *FileID,
                           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
 //
@@ -308,6 +326,7 @@ AFSProcessOpen( IN PIRP Irp,
                 IN AFSVolumeCB *VolumeCB,
                 IN AFSDirectoryCB *ParentDirCB,
                 IN AFSDirectoryCB *DirectoryCB,
+               IN BOOLEAN bOpenedReparsePoint,
                 OUT AFSFcb **Fcb,
                 OUT AFSCcb **Ccb);
 
@@ -395,7 +414,8 @@ AFSFlushExtents( IN AFSFcb *pFcb,
 
 NTSTATUS
 AFSReleaseExtentsWithFlush( IN AFSFcb *Fcb,
-                            IN GUID *AuthGroup);
+                            IN GUID *AuthGroup,
+                            IN BOOLEAN bReleaseAll);
 
 NTSTATUS
 AFSReleaseCleanExtents( IN AFSFcb *Fcb,
@@ -412,6 +432,9 @@ VOID
 AFSTearDownFcbExtents( IN AFSFcb *Fcb,
                        IN GUID *AuthGroup);
 
+VOID
+AFSDeleteFcbExtents( IN AFSFcb *Fcb);
+
 void
 AFSTrimExtents( IN AFSFcb *Fcb,
                 IN PLARGE_INTEGER FileSize);
@@ -436,6 +459,9 @@ AFSRemoveEntryDirtyList( IN AFSFcb *Fcb,
 AFSExtent *
 ExtentFor( PLIST_ENTRY le, ULONG SkipList );
 
+AFSExtent *
+NextExtent( AFSExtent *Extent, ULONG SkipList );
+
 ULONG
 AFSConstructCleanByteRangeList( AFSFcb * pFcb,
                                 AFSByteRange ** pByteRangeList);
@@ -495,6 +521,7 @@ AFSProcessExtentRun( IN PVOID          SystemBuffer,
 // AFSClose.cpp Prototypes
 //
 
+
 NTSTATUS
 AFSClose( IN PDEVICE_OBJECT DeviceObject,
           IN PIRP Irp);
@@ -507,27 +534,22 @@ NTSTATUS
 AFSInitFcb( IN AFSDirectoryCB   *DirEntry);
 
 NTSTATUS
-AFSInitVolume( IN GUID *AuthGroup,
-               IN AFSFileID *RootFid,
-               OUT AFSVolumeCB **VolumeCB);
-
-NTSTATUS
-AFSRemoveVolume( IN AFSVolumeCB *VolumeCB);
-
-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);
 
-NTSTATUS
+void
 AFSRemoveCcb( IN AFSFcb *Fcb,
               IN AFSCcb *Ccb);
 
@@ -542,14 +564,18 @@ AFSInsertCcb( IN AFSFcb *Fcb,
 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,
@@ -565,9 +591,9 @@ AFSInsertDirectoryNode( IN AFSObjectInfoCB *ParentObjectInfo,
                         IN AFSDirectoryCB *DirEntry,
                         IN BOOLEAN InsertInEnumList);
 
-NTSTATUS
+void
 AFSDeleteDirEntry( IN AFSObjectInfoCB *ParentObjectInfo,
-                   IN AFSDirectoryCB *DirEntry);
+                   IN AFSDirectoryCB **ppDirEntry);
 
 NTSTATUS
 AFSRemoveDirNodeFromParent( IN AFSObjectInfoCB *ParentObjectInfo,
@@ -607,8 +633,9 @@ AFSBuildRootVolume( IN GUID *AuthGroup,
 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
@@ -684,8 +711,9 @@ AFSShareRead( IN PDEVICE_OBJECT DeviceObject,
 
 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,
@@ -699,6 +727,14 @@ NTSTATUS
 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
 //
@@ -762,24 +798,6 @@ AFSQueryStreamInfo( IN PIRP Irp,
                     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,
@@ -803,7 +821,8 @@ AFSSetFileInfo( IN PDEVICE_OBJECT DeviceObject,
 
 NTSTATUS
 AFSSetBasicInfo( IN PIRP Irp,
-                 IN AFSDirectoryCB *DirectoryCB);
+                IN AFSDirectoryCB *DirectoryCB,
+                OUT BOOLEAN *bUpdateFileInfo);
 
 NTSTATUS
 AFSSetDispositionInfo( IN PIRP Irp,
@@ -813,6 +832,9 @@ NTSTATUS
 AFSSetRenameInfo( IN PIRP Irp);
 
 NTSTATUS
+AFSSetFileLinkInfo( IN PIRP Irp);
+
+NTSTATUS
 AFSSetPositionInfo( IN PIRP Irp,
                     IN AFSDirectoryCB *DirectoryCB);
 
@@ -861,6 +883,27 @@ AFSFlushBuffers( IN PDEVICE_OBJECT DeviceObject,
                  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
 //
 
@@ -875,6 +918,7 @@ AFSSetVolumeInfo( IN PDEVICE_OBJECT DeviceObject,
 NTSTATUS
 AFSQueryFsVolumeInfo( IN AFSVolumeInfoCB *VolumeInfo,
                       IN PFILE_FS_VOLUME_INFORMATION Buffer,
+                      IN BOOLEAN bDosDevice,
                       IN OUT PULONG Length);
 
 NTSTATUS
@@ -946,6 +990,11 @@ BOOLEAN
 AFSIsNameInSnapshot( IN AFSSnapshotHdr *SnapshotHdr,
                      IN ULONG HashIndex);
 
+NTSTATUS
+AFSProcessDirectoryQueryDirect( IN AFSFcb *Fcb,
+                                IN AFSCcb *Ccb,
+                                IN IRP *Irp);
+
 //
 // AFSFSControl.cpp Prototypes
 //
@@ -1080,7 +1129,7 @@ AFSLockSystemBuffer( IN PIRP Irp,
 void *
 AFSLockUserBuffer( IN void *UserBuffer,
                    IN ULONG BufferLength,
-                                  OUT MDL ** Mdl);
+                   OUT MDL ** Mdl);
 
 void *
 AFSMapToService( IN PIRP Irp,
@@ -1170,7 +1219,8 @@ AFSInvalidateAllVolumes( VOID);
 
 NTSTATUS
 AFSVerifyEntry( IN GUID *AuthGroup,
-                IN AFSDirectoryCB *DirectoryCB);
+               IN AFSDirectoryCB *DirectoryCB,
+               IN BOOLEAN bFollowMountPoint);
 
 NTSTATUS
 AFSSetVolumeState( IN AFSVolumeStatusCB *VolumeStatus);
@@ -1195,7 +1245,8 @@ AFSUpdateMetaData( IN AFSDirectoryCB *DirEntry,
 NTSTATUS
 AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                   IN GUID *AuthGroup,
-                  IN BOOLEAN FastCall);
+                  IN BOOLEAN FastCall,
+                  IN BOOLEAN SafeToPurge);
 
 AFSDirectoryCB *
 AFSGetSpecialShareNameEntry( IN UNICODE_STRING *ShareName,
@@ -1223,6 +1274,9 @@ AFSEnumerateGlobalRoot( IN GUID *AuthGroup);
 BOOLEAN
 AFSIsRelativeName( IN UNICODE_STRING *Name);
 
+BOOLEAN
+AFSIsAbsoluteAFSName( IN UNICODE_STRING *Name);
+
 void
 AFSUpdateName( IN UNICODE_STRING *Name);
 
@@ -1232,40 +1286,6 @@ AFSUpdateTargetName( IN OUT UNICODE_STRING *TargetName,
                      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);
-
-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);
 
@@ -1294,8 +1314,24 @@ AFSObjectInfoCB *
 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 *ObjectInfo);
+AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo);
+
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB * VolumeCB,
+                   IN AFSFileID   * FileID,
+                   IN BOOLEAN       bUpdateLastUse);
+
+void
+AFSReleaseObjectInfo( IN OUT AFSObjectInfoCB **ppObjectInfo);
 
 NTSTATUS
 AFSEvaluateRootEntry( IN AFSDirectoryCB *DirectoryCB,
@@ -1377,6 +1413,10 @@ AFSLibExAllocatePoolWithTag( IN POOL_TYPE  PoolType,
                              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);
 
@@ -1397,6 +1437,51 @@ 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
 //
@@ -1432,9 +1517,6 @@ AFSIOWorkerThread( IN PVOID Context);
 void
 AFSPrimaryVolumeWorkerThread( IN PVOID Context);
 
-void
-AFSVolumeWorkerThread( IN PVOID Context);
-
 NTSTATUS
 AFSInsertWorkitem( IN AFSWorkItem *WorkItem);