AFSDirControl( IN PDEVICE_OBJECT LibDeviceObject,
IN PIRP Irp)
{
-
+ UNREFERENCED_PARAMETER(LibDeviceObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
- ULONG ulRequestType = 0;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
- AFSFcb *pFcb = NULL;
__try
{
AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
BOOLEAN bInitialQuery = FALSE;
- ULONG ulIndex;
PUCHAR pBuffer;
ULONG ulUserBufferLength;
PUNICODE_STRING puniArgFileName = NULL;
UNICODE_STRING uniTmpMaskName;
- UNICODE_STRING uniDirUniBuf;
WCHAR wchMaskBuffer[ 4];
FILE_INFORMATION_CLASS FileInformationClass;
- ULONG ulFileIndex, ulDOSFileIndex;
+ ULONG ulFileIndex;
BOOLEAN bRestartScan;
BOOLEAN bReturnSingleEntry;
BOOLEAN bIndexSpecified;
ULONG ulNextEntry = 0;
ULONG ulLastEntry = 0;
- BOOLEAN bDoCase;
PFILE_DIRECTORY_INFORMATION pDirInfo;
PFILE_FULL_DIR_INFORMATION pFullDirInfo;
PFILE_BOTH_DIR_INFORMATION pBothDirInfo;
AFSDirectoryCB *pDirEntry = NULL;
BOOLEAN bReleaseMain = FALSE;
BOOLEAN bReleaseFcb = FALSE;
- ULONG ulTargetFileType = AFS_FILE_TYPE_UNKNOWN;
AFSFileInfoCB stFileInfo;
AFSObjectInfoCB *pObjectInfo = NULL;
ULONG ulAdditionalAttributes = 0;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSQueryDirectory Attempted access (%08lX) when pFcb == NULL\n",
+ "AFSQueryDirectory Attempted access (%p) when pFcb == NULL\n",
Irp);
try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSQueryDirectory Attempted access (%08lX) to non-directory Fcb %08lX NodeType %u\n",
+ "AFSQueryDirectory Attempted access (%p) to non-directory Fcb %p NodeType %u\n",
Irp,
pFcb,
pFcb->Header.NodeTypeCode);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Acquiring Dcb lock %08lX EXCL %08lX\n",
+ "AFSQueryDirectory Acquiring Dcb lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Acquiring Dcb lock %08lX SHARED %08lX\n",
+ "AFSQueryDirectory Acquiring Dcb lock %p SHARED %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSQueryDirectory (%08lX) Unknown FileInformationClass %u\n",
+ "AFSQueryDirectory (%p) Unknown FileInformationClass %u\n",
Irp,
FileInformationClass);
{
ULONG ulBytesRemainingInBuffer;
- int rc;
+
+ //
+ // Drop the DirOpenReferenceCount held during a prior
+ // execution of the loop
+ //
+
+ if ( pDirEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSQueryDirectory Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
+ pDirEntry,
+ pCcb,
+ lCount);
+
+ ASSERT( lCount >= 0);
+
+ pDirEntry = NULL;
+ }
ulAdditionalAttributes = 0;
try_return( ntStatus);
}
+ //
+ // On Success, pDirEntry has a held DirOpenReferenceCount
+ //
+
pDirEntry = AFSLocateNextDirEntry( pFcb->ObjectInformation,
pCcb);
BooleanFlagOn( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED))
{
- lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- pCcb,
- lCount);
-
- ASSERT( lCount >= 0);
-
continue;
}
if( !FlagOn( pObjectInfo->FileAttributes, FILE_ATTRIBUTE_DIRECTORY))
{
- lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- pCcb,
- lCount);
-
- ASSERT( lCount >= 0);
-
continue;
}
}
NULL))
{
- lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- pCcb,
- lCount);
-
- ASSERT( lCount >= 0);
-
continue;
}
}
TRUE))
{
- lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- pCcb,
- lCount);
-
- ASSERT( lCount >= 0);
-
continue;
}
}
// We don't worry about entries while enumerating the directory
//
- AFSValidateEntry( pDirEntry,
- &pCcb->AuthGroup,
- FALSE,
- FALSE);
+ if ( BooleanFlagOn( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY))
+ {
+
+ ntStatus = AFSValidateEntry( pDirEntry,
+ &pCcb->AuthGroup,
+ FALSE,
+ FALSE);
+ if ( NT_SUCCESS( ntStatus))
+ {
+
+ ClearFlag( pDirEntry->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ }
+ else
+ {
+
+ ntStatus = STATUS_SUCCESS;
+ }
+ }
pObjectInfo = pDirEntry->ObjectInformation;
pCcb->CurrentDirIndex--;
- lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- pCcb,
- lCount);
-
- ASSERT( lCount >= 0);
-
try_return( ntStatus = STATUS_SUCCESS);
}
break;
}
+
default:
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSQueryDirectory (%08lX) Unknown FileInformationClass %u\n",
+ "AFSQueryDirectory (%p) Unknown FileInformationClass %u\n",
Irp,
FileInformationClass);
- lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Decrement6 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- pCcb,
- lCount);
-
- ASSERT( lCount >= 0);
-
try_return( ntStatus = STATUS_INVALID_INFO_CLASS);
-
- break;
}
}
if( ulBytesConverted < pDirEntry->NameInformation.FileName.Length)
{
- lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
+ try_return( ntStatus = STATUS_BUFFER_OVERFLOW);
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueryDirectory Decrement7 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- pCcb,
- lCount);
+ dStatus = STATUS_SUCCESS;
- ASSERT( lCount >= 0);
+ // Set ourselves up for the next iteration
+ ulLastEntry = ulNextEntry;
+ ulNextEntry += (ULONG)QuadAlign( ulBaseLength + ulBytesConverted);
+ }
- try_return( ntStatus = STATUS_BUFFER_OVERFLOW);
- }
+try_exit:
+
+ if ( pDirEntry != NULL)
+ {
lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
lCount);
ASSERT( lCount >= 0);
-
- dStatus = STATUS_SUCCESS;
-
- // Set ourselves up for the next iteration
- ulLastEntry = ulNextEntry;
- ulNextEntry += (ULONG)QuadAlign( ulBaseLength + ulBytesConverted);
}
-try_exit:
-
if( bReleaseMain)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNotifyChangeDirectory Attempted access (%08lX) when pFcb == NULL\n",
+ "AFSNotifyChangeDirectory Attempted access (%p) when pFcb == NULL\n",
Irp);
try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSNotifyChangeDirectory Acquiring Dcb lock %08lX EXCL %08lX\n",
+ "AFSNotifyChangeDirectory Acquiring Dcb lock %p EXCL %08lX\n",
&pFcb->NPFcb->Resource,
PsGetCurrentThread());
pDirEntry = ObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
- if( pDirEntry != NULL)
- {
-
- lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNextDirEntry Increment count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- Ccb,
- lCount);
-
- ASSERT( lCount >= 0);
- }
-
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSLocateNextDirEntry Returning PIOctl entry %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",
pDirEntry = AFSGlobalDotDirEntry;
- if( pDirEntry != NULL)
- {
-
- lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNextDirEntry Increment2 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- Ccb,
- lCount);
-
- ASSERT( lCount >= 0);
- }
-
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSLocateNextDirEntry Returning1 snapshot entry %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",
pDirEntry = AFSGlobalDotDotDirEntry;
- if( pDirEntry != NULL)
- {
-
- lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNextDirEntry Increment3 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- Ccb,
- lCount);
-
- ASSERT( lCount >= 0);
- }
-
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSLocateNextDirEntry Returning2 snapshot entry %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
ObjectInfo->FileId.Unique);
-
- lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNextDirEntry Increment4 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirEntry->NameInformation.FileName,
- pDirEntry,
- Ccb,
- lCount);
-
- ASSERT( lCount >= 0);
}
else
{
try_exit:
+ if( pDirEntry != NULL)
+ {
+
+ lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSLocateNextDirEntry Increment count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
+ pDirEntry,
+ Ccb,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
AFSReleaseResource( &Ccb->NPCcb->CcbLock);
AFSReleaseResource( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIR_NOTIF_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSFsRtlNotifyFullChangeDirectory Registering notification on %wZ Irp %08lX Filter %08lX Tree %02lX\n",
+ "AFSFsRtlNotifyFullChangeDirectory Registering notification on %wZ Irp %p Filter %08lX Tree %02lX\n",
&Ccb->NotifyMask,
NotifyIrp,
CompletionFilter,
AFSNotifyReportChangeCallback( IN void *NotifyContext,
IN void *FilterContext)
{
-
+ UNREFERENCED_PARAMETER(NotifyContext);
+ UNREFERENCED_PARAMETER(FilterContext);
BOOLEAN bReturn = TRUE;
- AFSCcb *pDirCcb = (AFSCcb *)NotifyContext;
- AFSCcb *pNotifyCcb = (AFSCcb *)FilterContext;
__Enter
{