}
//
-// Function: AFSBuildCRCTable
-//
-// Description:
-//
-// This function builds the CRC table for mapping filenames to a CRC value.
-//
-// Return:
-//
-// A status is returned for the function
-//
-
-void
-AFSBuildCRCTable()
-{
- ULONG crc;
- int i, j;
-
- for ( i = 0; i <= 255; i++)
- {
- crc = i;
- for ( j = 8; j > 0; j--)
- {
- if (crc & 1)
- {
- crc = ( crc >> 1 ) ^ CRC32_POLYNOMIAL;
- }
- else
- {
- crc >>= 1;
- }
- }
-
- AFSCRCTable[ i ] = crc;
- }
-}
-
-//
// Function: AFSGenerateCRC
//
// Description:
IN BOOLEAN UpperCaseName)
{
- ULONG crc;
- ULONG temp1, temp2;
- UNICODE_STRING UpcaseString;
- WCHAR *lpbuffer;
- USHORT size = 0;
-
- if( !AFSCRCTable[1])
- {
- AFSBuildCRCTable();
- }
-
- crc = 0xFFFFFFFFL;
-
- if( UpperCaseName)
- {
-
- RtlUpcaseUnicodeString( &UpcaseString,
- FileName,
- TRUE);
-
- lpbuffer = UpcaseString.Buffer;
-
- size = (UpcaseString.Length/sizeof( WCHAR));
- }
- else
- {
-
- lpbuffer = FileName->Buffer;
-
- size = (FileName->Length/sizeof( WCHAR));
- }
+ ULONG ulCRC = 0;
+ NTSTATUS ntStatus = STATUS_SUCCESS;
- while (size--)
- {
- temp1 = (crc >> 8) & 0x00FFFFFFL;
- temp2 = AFSCRCTable[((int)crc ^ *lpbuffer++) & 0xff];
- crc = temp1 ^ temp2;
- }
+ ntStatus = RtlHashUnicodeString( FileName,
+ UpperCaseName,
+ HASH_STRING_ALGORITHM_DEFAULT,
+ &ulCRC);
- if( UpperCaseName)
+ if( !NT_SUCCESS( ntStatus))
{
-
- RtlFreeUnicodeString( &UpcaseString);
+ ulCRC = 0;
}
- crc ^= 0xFFFFFFFFL;
-
- return crc;
+ return ulCRC;
}
void *
bAllocatedObjectCB = TRUE;
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitDirEntry initialized object %08lX Parent Object %08lX for %wZ\n",
pObjectInfoCB,
TRUE);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitDirEntry Initialized DE %p for %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",
+ pDirNode,
+ FileName,
+ ParentObjectInfo->FileId.Cell,
+ ParentObjectInfo->FileId.Volume,
+ ParentObjectInfo->FileId.Vnode,
+ ParentObjectInfo->FileId.Unique);
+
if( TargetName != NULL &&
TargetName->Length > 0)
{
{
ClearFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_VALID);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %08lX\n",
+ pCurrentDirEntry,
+ pCurrentDirEntry->OpenReferenceCount);
+
}
pCurrentDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
continue;
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateDirectoryCache Processing INVALID DE %p Reference count %08lX\n",
+ pCurrentDirEntry,
+ pCurrentDirEntry->OpenReferenceCount);
+
if( pCurrentDirEntry->OpenReferenceCount == 0)
{
if( pNonPagedDirEntry == NULL)
{
- AFSExFreePool( pDirNode);
-
- AFSDeleteObjectInfo( pObjectInfoCB);
-
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
try_exit:
- NOTHING;
+ if ( !NT_SUCCESS( ntStatus))
+ {
+
+ if ( pDirNode != NULL)
+ {
+
+ AFSExFreePool( pDirNode);
+ }
+
+ if ( pObjectInfoCB != NULL)
+ {
+
+ AFSDeleteObjectInfo( pObjectInfoCB);
+ }
+ }
}
return ntStatus;
// offset by the length of the server name
//
- AFSExFreePool( pwchBuffer);
-
if( uniFullPathName.Length > 0 &&
pwchBuffer != (WCHAR *)((char *)uniFullPathName.Buffer - ulNameDifference))
{
AFSExFreePool( uniFullPathName.Buffer);
}
+
+ AFSExFreePool( pwchBuffer);
}
}
// offset by the length of the server name
//
- AFSExFreePool( pwchBuffer);
-
if( uniFullPathName.Length > 0 &&
pwchBuffer != (WCHAR *)((char *)uniFullPathName.Buffer - ulNameDifference))
{
AFSExFreePool( uniFullPathName.Buffer);
}
+
+ AFSExFreePool( pwchBuffer);
}
}
if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveNameEntry DE %p for %wZ has NOT_IN flag set\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
try_return( ntStatus);
}
// Remove the entry from the parent tree
//
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveNameEntry DE %p for %wZ removing from case sensitive tree\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
AFSRemoveCaseSensitiveDirEntry( &ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
DirEntry);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveNameEntry DE %p for %wZ removing from case insensitive tree\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
AFSRemoveCaseInsensitiveDirEntry( &ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
DirEntry);
// From the short name tree
//
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveNameEntry DE %p for %wZ removing from shortname tree\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
AFSRemoveShortNameDirEntry( &ParentObjectInfo->Specific.Directory.ShortNameTree,
DirEntry);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRemoveNameEntry DE %p for %wZ setting NOT_IN flag\n",
+ DirEntry,
+ &DirEntry->NameInformation.FileName);
+
SetFlag( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE);
try_exit: