pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
- pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
+ pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
- ClearFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
- }
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitDirEntry FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfoCB->FileId.Cell,
+ pObjectInfoCB->FileId.Volume,
+ pObjectInfoCB->FileId.Vnode,
+ pObjectInfoCB->FileId.Unique));
+
+ ClearFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ }
//
// This reference count is either stored into the return DirectoryCB
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
IO_STATUS_BLOCK stIoStatus;
ULONG ulFilter = 0;
AFSObjectInfoCB * pParentObjectInfo = NULL;
{
(*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
-
- SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
(*ppObjectInfo)->Expiration.QuadPart = 0;
(*ppObjectInfo)->FileId.Vnode,
(*ppObjectInfo)->FileId.Unique));
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Acquiring Fcb lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ TRUE);
+
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateObject Flush/purge Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
}
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource);
- //
- // Clear out the extents
- // Get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Releasing Fcb lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->Resource);
+
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+
+ //
+ // Clear out the extents
+ // Get rid of them (note this involves waiting
+ // for any writes or reads to the cache to complete)
+ //
- AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
- NULL);
+ AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+ NULL);
+ }
}
(*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSSubstituteSysName No sysname %wZ Status %08lX\n",
- &ComponentName,
+ ComponentName,
STATUS_OBJECT_NAME_NOT_FOUND));
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
AFSDirEnumEntry *pDirEnumEntry = NULL;
AFSObjectInfoCB *pObjectInfo = DirEntry->ObjectInformation;
IO_STATUS_BLOCK stIoStatus;
AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry No DV change %I64X for Fcb %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSVerifyEntry No DV change %I64X for Fcb %wZ FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
pObjectInfo->DataVersion.QuadPart,
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry MountPoint FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Symlink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique));
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
}
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
- AFSFlushExtents( pObjectInfo->Fcb,
- AuthGroup);
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- //
- // Acquire the Fcb to purge the cache
- //
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->Resource,
- PsGetCurrentThread()));
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
- TRUE);
+ AFSFlushExtents( pObjectInfo->Fcb,
+ AuthGroup);
+
+ //
+ // Acquire the Fcb to purge the cache
+ //
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+ }
//
// Update the metadata for the entry
if ( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry File FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
break;
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Directory FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry DFSLink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
LARGE_INTEGER liSystemTime;
AFSDirEnumEntry *pDirEnumEntry = NULL;
AFSFcb *pCurrentFcb = NULL;
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry MountPoint FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
}
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Symlink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
}
AFSAcquireExcl( &pCurrentFcb->NPFcb->SectionObjectResource,
TRUE);
- //
- // Release Fcb->Resource to avoid Trend Micro deadlock
- //
-
- AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
-
- bReleaseFcb = FALSE;
-
__try
{
}
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
+ }
+ if (bReleaseFcb)
+ {
AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
bReleaseFcb = FALSE;
if ( bPurgeExtents &&
bSafeToPurge)
{
- AFSFlushExtents( pCurrentFcb,
- AuthGroup);
+
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ AFSFlushExtents( pCurrentFcb,
+ AuthGroup);
+ }
}
}
break;
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry File FID %08lX-%08lX-%08lX-%08lX No Purge Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
//
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Directory FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
}
UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
ULONG ulNameDifference = 0;
LONG lCount;
+ UNICODE_STRING uniDFSTargetName;
__Enter
{
- //
+ uniDFSTargetName.Length = 0;
+ uniDFSTargetName.MaximumLength = 0;
+ uniDFSTargetName.Buffer = NULL;
+
+ //
// Retrieve a target name for the entry
//
RtlZeroMemory( uniFullPathName.Buffer,
uniFullPathName.MaximumLength);
- RtlCopyMemory( uniFullPathName.Buffer,
- ParentPathName->Buffer,
- ParentPathName->Length);
+ if ( ParentPathName->Length > 0)
+ {
- uniFullPathName.Length = ParentPathName->Length;
+ RtlCopyMemory( uniFullPathName.Buffer,
+ ParentPathName->Buffer,
+ ParentPathName->Length);
- if( uniFullPathName.Buffer[ (uniFullPathName.Length/sizeof( WCHAR)) - 1] != L'\\' &&
- DirectoryCB->NameInformation.TargetName.Buffer[ 0] != L'\\')
- {
+ uniFullPathName.Length = ParentPathName->Length;
- uniFullPathName.Buffer[ uniFullPathName.Length/sizeof( WCHAR)] = L'\\';
+ if( uniFullPathName.Buffer[ (uniFullPathName.Length/sizeof( WCHAR)) - 1] != L'\\' &&
+ DirectoryCB->NameInformation.TargetName.Buffer[ 0] != L'\\')
+ {
- uniFullPathName.Length += sizeof( WCHAR);
- }
+ uniFullPathName.Buffer[ uniFullPathName.Length/sizeof( WCHAR)] = L'\\';
- RtlCopyMemory( &uniFullPathName.Buffer[ uniFullPathName.Length/sizeof( WCHAR)],
+ uniFullPathName.Length += sizeof( WCHAR);
+ }
+ }
+
+ RtlCopyMemory( &uniFullPathName.Buffer[ uniFullPathName.Length/sizeof( WCHAR)],
DirectoryCB->NameInformation.TargetName.Buffer,
DirectoryCB->NameInformation.TargetName.Length);
&NewVolumeReferenceReason,
&pNewParentDirEntry,
&pDirectoryEntry,
- NULL);
+ NULL,
+ &uniDFSTargetName);
if ( pNewVolumeCB != NULL)
{
pNewParentDirEntry = NULL;
- if( !NT_SUCCESS( ntStatus) ||
- ntStatus == STATUS_REPARSE)
+ if( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
+
+ //
+ // If the status is STATUS_REPARSE then attempt to retrieve the attributes from the target name returned
+ //
+
+ if( ntStatus == STATUS_REPARSE)
{
+ ntStatus = AFSRetrieveTargetFileInfo( &uniDFSTargetName,
+ FileInfo);
+
try_return( ntStatus);
}
AFSExFreePoolWithTag( pwchBuffer, 0);
}
+
+ if ( uniDFSTargetName.Buffer != NULL)
+ {
+
+ AFSExFreePoolWithTag( uniDFSTargetName.Buffer,
+ AFS_REPARSE_NAME_TAG);
+ }
}
return ntStatus;
&VolumeReferenceReason,
&pNewParentDirEntry,
&pDirectoryEntry,
- NULL);
+ NULL,
+ NULL);
if ( pNewVolumeCB != NULL)
{
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanupEntry Acquiring Fcb lock %p SHARED %08lX\n",
+ "AFSCleanupEntry Acquiring Fcb lock %p EXCL %08lX\n",
&Fcb->NPFcb->Resource,
PsGetCurrentThread()));
- AFSAcquireShared( &Fcb->NPFcb->Resource,
+ AFSAcquireExcl( &Fcb->NPFcb->Resource,
TRUE);
if( Fcb->OpenReferenceCount > 0)
}
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanupEntry Releasing Fcb lock %p SHARED %08lX\n",
+ "AFSCleanupEntry Releasing Fcb lock %p EXCL %08lX\n",
&Fcb->NPFcb->Resource,
PsGetCurrentThread()));
AFSReleaseResource( &Fcb->NPFcb->Resource);
- //
- // Wait for any currently running flush or release requests to complete
- //
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ //
+ // Wait for any currently running flush or release requests to complete
+ //
- AFSWaitOnQueuedFlushes( Fcb);
+ AFSWaitOnQueuedFlushes( Fcb);
- //
- // Now perform another flush on the file
- //
+ //
+ // Now perform another flush on the file
+ //
- if( !NT_SUCCESS( AFSFlushExtents( Fcb,
- NULL)))
- {
+ if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+ NULL)))
+ {
- AFSReleaseExtentsWithFlush( Fcb,
- NULL,
- TRUE);
- }
- }
+ AFSReleaseExtentsWithFlush( Fcb,
+ NULL,
+ TRUE);
+ }
+ }
+ }
- if( Fcb->OpenReferenceCount == 0 ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
- {
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
+ if( Fcb->OpenReferenceCount == 0 ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+ {
+
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ }
try_return( ntStatus);
}
KeQueryTickCount( &liTime);
- //
- // First up are there dirty extents in the cache to flush?
- //
-
- if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
- {
-
- //
- // The file has been marked as invalid. Dump it
- //
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ //
+ // First up are there dirty extents in the cache to flush?
+ //
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
- else if( ForceFlush ||
- ( ( Fcb->Specific.File.ExtentsDirtyCount ||
- Fcb->Specific.File.ExtentCount) &&
- (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
- >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
- {
- if( !NT_SUCCESS( AFSFlushExtents( Fcb,
- NULL)) &&
- Fcb->OpenReferenceCount == 0)
- {
+ if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+ {
+
+ //
+ // The file has been marked as invalid. Dump it
+ //
+
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ else if( ForceFlush ||
+ ( ( Fcb->Specific.File.ExtentsDirtyCount ||
+ Fcb->Specific.File.ExtentCount) &&
+ (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
+ >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
+ {
+
+ if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+ NULL)) &&
+ Fcb->OpenReferenceCount == 0)
+ {
- AFSReleaseExtentsWithFlush( Fcb,
- NULL,
- TRUE);
- }
+ AFSReleaseExtentsWithFlush( Fcb,
+ NULL,
+ TRUE);
+ }
+ }
}
//
(AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Acquiring Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ if ( AFSAcquireExcl( &Fcb->NPFcb->Resource, ForceFlush) == FALSE)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Failed to Acquire Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ try_return( ntStatus = STATUS_RETRY);
+ }
+
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupFcb Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
}
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
- if( Fcb->OpenReferenceCount <= 0)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- //
- // Tear em down we'll not be needing them again
- //
+ AFSReleaseResource( &Fcb->NPFcb->Resource);
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+
+ if( Fcb->OpenReferenceCount <= 0)
+ {
+
+ //
+ // Tear em down we'll not be needing them again
+ //
+
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ }
}
else
{
&Fcb->NPFcb->SectionObjectResource,
PsGetCurrentThread()));
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &Fcb->NPFcb->Resource);
+
ntStatus = STATUS_RETRY;
}
}
&NewVolumeReferenceReason,
&pNewParentDirEntry,
&pDirectoryEntry,
- NULL);
+ NULL,
+ NULL);
if ( pNewVolumeCB != NULL)
{
// If the final character is a \, jump over it
//
- if( ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] == L'\\')
+ if( ParentPath->Length >= sizeof( WCHAR)
+ && ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] == L'\\')
{
ParentPath->Length -= sizeof( WCHAR);
}
- while( ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] != L'\\')
+ while( ParentPath->Length >= sizeof( WCHAR)
+ && ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] != L'\\')
{
ParentPath->Length -= sizeof( WCHAR);
}
// And the separator
//
- ParentPath->Length -= sizeof( WCHAR);
+ if ( ParentPath->Length >= sizeof( WCHAR))
+ {
+ ParentPath->Length -= sizeof( WCHAR);
+ }
return;
}
__Enter
{
- switch( InvalidateReason)
+ switch( InvalidateReason)
{
case AFS_INVALIDATE_DELETED:
{
- if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DELETED\n",
+ ObjectInfo->FileType,
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
ObjectInfo->Fcb != NULL)
{
- AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
- TRUE);
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- ObjectInfo->Links = 0;
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
- ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
+ ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
- KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
- 0,
- FALSE);
+ KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
+ 0,
+ FALSE);
- //
- // Clear out the extents
- // And get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
+ //
+ // Clear out the extents
+ // And get rid of them (note this involves waiting
+ // for any writes or reads to the cache to complete)
+ //
- AFSTearDownFcbExtents( ObjectInfo->Fcb,
- NULL);
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
- }
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
+ }
+ }
+
+ ObjectInfo->Links = 0;
break;
}
ObjectInfo->Fcb != NULL)
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DATA_VERSION FCB %0p\n",
+ ObjectInfo->FileType,
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ObjectInfo->Fcb));
+
if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
{
AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
- __try
+ __try
{
if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
ObjectInfo->FileId.Unique));
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
ntStatus));
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
- bLocked = FALSE;
-
__try
{
ObjectInfo->FileId.Vnode,
ObjectInfo->FileId.Unique));
- SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
+ SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
else
{
bCleanExtents = TRUE;
}
}
- __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
ntStatus));
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
PsGetCurrentThread()));
AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+ bLocked = FALSE;
}
}
else
AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
- bLocked = FALSE;
-
//
// Must build a list of non-dirty ranges from the beginning of the file
// to the end. There can be at most (Fcb->Specific.File.ExtentsDirtyCount + 1)
ulSize = ByteRangeList[ulIndex].Length.QuadPart > DWORD_MAX ? DWORD_MAX : ByteRangeList[ulIndex].Length.LowPart;
- if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
- !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- &ByteRangeList[ulIndex].FileOffset,
- ulSize,
- FALSE))
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
- ObjectInfo->FileId.Cell,
- ObjectInfo->FileId.Volume,
- ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique));
-
- bPurgeOnClose = TRUE;
- }
- else
- {
-
- bCleanExtents = TRUE;
- }
+ __try
+ {
+
+ if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+ !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ &ByteRangeList[ulIndex].FileOffset,
+ ulSize,
+ FALSE))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ bPurgeOnClose = TRUE;
+ }
+ else
+ {
+
+ bCleanExtents = TRUE;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (1) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
ByteRangeList[ulIndex].Length.QuadPart -= ulSize;
if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
{
- if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- &pEntry->FileOffset,
- pEntry->Size,
- FALSE))
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
- ObjectInfo->FileId.Cell,
- ObjectInfo->FileId.Volume,
- ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique));
-
- bPurgeOnClose = TRUE;
- }
- else
- {
-
- bCleanExtents = TRUE;
- }
+ __try
+ {
+ if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ &pEntry->FileOffset,
+ pEntry->Size,
+ FALSE))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ bPurgeOnClose = TRUE;
+ }
+ else
+ {
+
+ bCleanExtents = TRUE;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (2) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
}
if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart)
ulFlushLength = liFlushLength.LowPart;
}
- if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- &liCurrentOffset,
- ulFlushLength,
- FALSE))
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
- ObjectInfo->FileId.Cell,
- ObjectInfo->FileId.Volume,
- ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique));
-
- bPurgeOnClose = TRUE;
- }
- else
- {
-
- bCleanExtents = TRUE;
- }
+ __try
+ {
+ if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ &liCurrentOffset,
+ ulFlushLength,
+ FALSE))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ bPurgeOnClose = TRUE;
+ }
+ else
+ {
+
+ bCleanExtents = TRUE;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (3) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
liFlushLength.QuadPart -= ulFlushLength;
}
}
else
{
- if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE))
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
- ObjectInfo->FileId.Cell,
- ObjectInfo->FileId.Volume,
- ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique));
-
- bPurgeOnClose = TRUE;
- }
- else
- {
-
- bCleanExtents = TRUE;
- }
+ __try
+ {
+ if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ bPurgeOnClose = TRUE;
+ }
+ else
+ {
+
+ bCleanExtents = TRUE;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (4) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
}
if ( bPurgeOnClose)
PsGetCurrentThread()));
AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+ bLocked = FALSE;
}
}
}
}
}
+ else if ( ObjectInfo->FileType == AFS_FILE_TYPE_FILE)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DATA_VERSION FCB NULL\n",
+ ObjectInfo->FileType,
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
break;
}
- }
+ }
//
// Destroy the reference passed in by the caller to AFSInvalidateObject
return bIgnoreReparsePoint;
}
+
+NTSTATUS
+AFSRetrieveTargetFileInfo( IN PUNICODE_STRING TargetName,
+ OUT AFSFileInfoCB *FileInfo)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ OBJECT_ATTRIBUTES stObjectAttribs;
+ HANDLE hFile = NULL;
+ IO_STATUS_BLOCK stIoStatus;
+ FILE_NETWORK_OPEN_INFORMATION stFileInfo;
+
+ __Enter
+ {
+
+ InitializeObjectAttributes( &stObjectAttribs,
+ TargetName,
+ OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ ntStatus = ZwCreateFile( &hFile,
+ FILE_READ_ATTRIBUTES,
+ &stObjectAttribs,
+ &stIoStatus,
+ NULL,
+ 0,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN,
+ FILE_SYNCHRONOUS_IO_NONALERT,
+ NULL,
+ 0);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ try_return( ntStatus);
+ }
+
+ ntStatus = ZwQueryInformationFile( hFile,
+ &stIoStatus,
+ &stFileInfo,
+ sizeof( FILE_NETWORK_OPEN_INFORMATION),
+ FileNetworkOpenInformation);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ try_return( ntStatus);
+ }
+
+ FileInfo->FileAttributes = stFileInfo.FileAttributes;
+
+ FileInfo->AllocationSize = stFileInfo.AllocationSize;
+
+ FileInfo->EndOfFile = stFileInfo.EndOfFile;
+
+ FileInfo->CreationTime = stFileInfo.CreationTime;
+
+ FileInfo->LastAccessTime = stFileInfo.LastAccessTime;
+
+ FileInfo->LastWriteTime = stFileInfo.LastWriteTime;
+
+ FileInfo->ChangeTime = stFileInfo.ChangeTime;
+
+try_exit:
+
+ if( hFile != NULL)
+ {
+ ZwClose( hFile);
+ }
+ }
+
+ return ntStatus;
+}
+
+BOOLEAN
+AFSIsShareName( IN UNICODE_STRING *FileName)
+{
+
+ BOOLEAN bIsShareName = TRUE;
+ USHORT usIndex = 1; // Skip the first \
+
+ //
+ // A share name will be of the form \Share so only a single \ at the beginning
+ //
+
+ while( usIndex < FileName->Length/sizeof( WCHAR))
+ {
+
+ if( FileName->Buffer[ usIndex] == L'\\')
+ {
+ bIsShareName = FALSE;
+ break;
+ }
+
+ usIndex++;
+ }
+
+ return bIsShareName;
+}
\ No newline at end of file