windows-nt/Source/XPSP1/NT/base/fs/ntfs/colatsup.c
2020-09-26 16:20:57 +08:00

681 lines
15 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
ColatSup.c
Abstract:
This module implements the collation routine callbacks for Ntfs
Author:
Tom Miller [TomM] 26-Nov-1991
Revision History:
--*/
#include "NtfsProc.h"
//
// Local debug trace level
//
#define Dbg (DEBUG_TRACE_INDEXSUP)
FSRTL_COMPARISON_RESULT
NtfsFileCompareValues (
IN PWCH UnicodeTable,
IN ULONG UnicodeTableSize,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN FSRTL_COMPARISON_RESULT WildCardIs,
IN BOOLEAN IgnoreCase
);
BOOLEAN
NtfsFileIsInExpression (
IN PWCH UnicodeTable,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN BOOLEAN IgnoreCase
);
BOOLEAN
NtfsFileIsEqual (
IN PWCH UnicodeTable,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN BOOLEAN IgnoreCase
);
BOOLEAN
NtfsFileContainsWildcards (
IN PVOID Value
);
VOID
NtfsFileUpcaseValue (
IN PWCH UnicodeTable,
IN ULONG UnicodeTableSize,
IN PVOID Value
);
FSRTL_COMPARISON_RESULT
DummyCompareValues (
IN PWCH UnicodeTable,
IN ULONG UnicodeTableSize,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN FSRTL_COMPARISON_RESULT WildCardIs,
IN BOOLEAN IgnoreCase
);
BOOLEAN
DummyIsInExpression (
IN PWCH UnicodeTable,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN BOOLEAN IgnoreCase
);
BOOLEAN
DummyIsEqual (
IN PWCH UnicodeTable,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN BOOLEAN IgnoreCase
);
BOOLEAN
DummyContainsWildcards (
IN PVOID Value
);
VOID
DummyUpcaseValue (
IN PWCH UnicodeTable,
IN ULONG UnicodeTableSize,
IN OUT PVOID Value
);
PCOMPARE_VALUES NtfsCompareValues[COLLATION_NUMBER_RULES] = {&DummyCompareValues,
&NtfsFileCompareValues,
&DummyCompareValues};
PIS_IN_EXPRESSION NtfsIsInExpression[COLLATION_NUMBER_RULES] = {&DummyIsInExpression,
&NtfsFileIsInExpression,
&DummyIsInExpression};
PARE_EQUAL NtfsIsEqual[COLLATION_NUMBER_RULES] = {&DummyIsEqual,
&NtfsFileIsEqual,
&DummyIsEqual};
PCONTAINS_WILDCARD NtfsContainsWildcards[COLLATION_NUMBER_RULES] = {&DummyContainsWildcards,
&NtfsFileContainsWildcards,
&DummyContainsWildcards};
PUPCASE_VALUE NtfsUpcaseValue[COLLATION_NUMBER_RULES] = {&DummyUpcaseValue,
&NtfsFileUpcaseValue,
&DummyUpcaseValue};
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, DummyCompareValues)
#pragma alloc_text(PAGE, DummyContainsWildcards)
#pragma alloc_text(PAGE, DummyIsEqual)
#pragma alloc_text(PAGE, DummyIsInExpression)
#pragma alloc_text(PAGE, DummyUpcaseValue)
#pragma alloc_text(PAGE, NtfsFileCompareValues)
#pragma alloc_text(PAGE, NtfsFileContainsWildcards)
#pragma alloc_text(PAGE, NtfsFileIsEqual)
#pragma alloc_text(PAGE, NtfsFileIsInExpression)
#pragma alloc_text(PAGE, NtfsFileNameIsInExpression)
#pragma alloc_text(PAGE, NtfsFileNameIsEqual)
#pragma alloc_text(PAGE, NtfsFileUpcaseValue)
#endif
FSRTL_COMPARISON_RESULT
NtfsFileCompareValues (
IN PWCH UnicodeTable,
IN ULONG UnicodeTableSize,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN FSRTL_COMPARISON_RESULT WildCardIs,
IN BOOLEAN IgnoreCase
)
/*++
RoutineDescription:
This routine is called to compare a file name expression (the value) with
a file name from the index to see if it is less than, equal to or greater
than. If a wild card is encountered in the expression, WildCardIs is
returned.
Arguments:
Value - Pointer to the value expression, which is a FILE_NAME.
IndexEntry - Pointer to the index entry being compared to.
WildCardIs - Value to be returned if a wild card is encountered in the
expression.
IgnoreCase - whether case should be ignored or not.
ReturnValue:
Result of the comparison
--*/
{
PFILE_NAME ValueName, IndexName;
UNICODE_STRING ValueString, IndexString;
PAGED_CODE();
//
// Point to the file name attribute records.
//
ValueName = (PFILE_NAME)Value;
IndexName = (PFILE_NAME)(IndexEntry + 1);
//
// Build the unicode strings and call namesup.
//
ValueString.Length =
ValueString.MaximumLength = (USHORT)ValueName->FileNameLength << 1;
ValueString.Buffer = &ValueName->FileName[0];
IndexString.Length =
IndexString.MaximumLength = (USHORT)IndexName->FileNameLength << 1;
IndexString.Buffer = &IndexName->FileName[0];
return NtfsCollateNames( UnicodeTable,
UnicodeTableSize,
&ValueString,
&IndexString,
WildCardIs,
IgnoreCase );
}
BOOLEAN
NtfsFileIsInExpression (
IN PWCH UnicodeTable,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN BOOLEAN IgnoreCase
)
/*++
RoutineDescription:
This routine is called to compare a file name expression (the value) with
a file name from the index to see if the file name is a match in this expression.
Arguments:
Value - Pointer to the value expression, which is a FILE_NAME.
IndexEntry - Pointer to the index entry being compared to.
IgnoreCase - whether case should be ignored or not.
ReturnValue:
TRUE - if the file name is in the specified expression.
--*/
{
PFILE_NAME ValueName, IndexName;
UNICODE_STRING ValueString, IndexString;
PAGED_CODE();
if (NtfsSegmentNumber( &IndexEntry->FileReference ) < FIRST_USER_FILE_NUMBER &&
NtfsProtectSystemFiles) {
return FALSE;
}
//
// Point to the file name attribute records.
//
ValueName = (PFILE_NAME)Value;
IndexName = (PFILE_NAME)(IndexEntry + 1);
//
// Build the unicode strings and call namesup.
//
ValueString.Length =
ValueString.MaximumLength = (USHORT)ValueName->FileNameLength << 1;
ValueString.Buffer = &ValueName->FileName[0];
IndexString.Length =
IndexString.MaximumLength = (USHORT)IndexName->FileNameLength << 1;
IndexString.Buffer = &IndexName->FileName[0];
return NtfsIsNameInExpression( UnicodeTable,
&ValueString,
&IndexString,
IgnoreCase );
}
BOOLEAN
NtfsFileIsEqual (
IN PWCH UnicodeTable,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN BOOLEAN IgnoreCase
)
/*++
RoutineDescription:
This routine is called to compare a constant file name (the value) with
a file name from the index to see if the file name is an exact match.
Arguments:
Value - Pointer to the value expression, which is a FILE_NAME.
IndexEntry - Pointer to the index entry being compared to.
IgnoreCase - whether case should be ignored or not.
ReturnValue:
TRUE - if the file name is a constant match.
--*/
{
PFILE_NAME ValueName, IndexName;
UNICODE_STRING ValueString, IndexString;
PAGED_CODE();
//
// Point to the file name attribute records.
//
ValueName = (PFILE_NAME)Value;
IndexName = (PFILE_NAME)(IndexEntry + 1);
//
// Build the unicode strings and call namesup.
//
ValueString.Length =
ValueString.MaximumLength = (USHORT)ValueName->FileNameLength << 1;
ValueString.Buffer = &ValueName->FileName[0];
IndexString.Length =
IndexString.MaximumLength = (USHORT)IndexName->FileNameLength << 1;
IndexString.Buffer = &IndexName->FileName[0];
return NtfsAreNamesEqual( UnicodeTable,
&ValueString,
&IndexString,
IgnoreCase );
}
BOOLEAN
NtfsFileContainsWildcards (
IN PVOID Value
)
/*++
RoutineDescription:
This routine is called to see if a file name attribute contains wildcards.
Arguments:
Value - Pointer to the value expression, which is a FILE_NAME.
ReturnValue:
TRUE - if the file name contains a wild card.
--*/
{
PFILE_NAME ValueName;
UNICODE_STRING ValueString;
PAGED_CODE();
//
// Point to the file name attribute records.
//
ValueName = (PFILE_NAME)Value;
//
// Build the unicode strings and call namesup.
//
ValueString.Length =
ValueString.MaximumLength = (USHORT)ValueName->FileNameLength << 1;
ValueString.Buffer = &ValueName->FileName[0];
return FsRtlDoesNameContainWildCards( &ValueString );
}
VOID
NtfsFileUpcaseValue (
IN PWCH UnicodeTable,
IN ULONG UnicodeTableSize,
IN PVOID Value
)
/*++
RoutineDescription:
This routine is called to upcase a file name attribute in place.
Arguments:
Value - Pointer to the value expression, which is a FILE_NAME.
ValueLength - Length of the value expression in bytes.
ReturnValue:
None.
--*/
{
PFILE_NAME ValueName;
UNICODE_STRING ValueString;
PAGED_CODE();
//
// Point to the file name attribute records.
//
ValueName = (PFILE_NAME)Value;
//
// Build the unicode strings and call namesup.
//
ValueString.Length =
ValueString.MaximumLength = (USHORT)ValueName->FileNameLength << 1;
ValueString.Buffer = &ValueName->FileName[0];
NtfsUpcaseName( UnicodeTable, UnicodeTableSize, &ValueString );
return;
}
//
// The other collation rules are currently unused.
//
FSRTL_COMPARISON_RESULT
DummyCompareValues (
IN PWCH UnicodeTable,
IN ULONG UnicodeTableSize,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN FSRTL_COMPARISON_RESULT WildCardIs,
IN BOOLEAN IgnoreCase
)
{
//
// Most parameters are ignored since this is a catch-all for
// a corrupt volume. We simply raise to indicate the corruption
//
UNREFERENCED_PARAMETER( UnicodeTable );
UNREFERENCED_PARAMETER( UnicodeTableSize );
UNREFERENCED_PARAMETER( IgnoreCase );
UNREFERENCED_PARAMETER( WildCardIs );
UNREFERENCED_PARAMETER( IndexEntry );
UNREFERENCED_PARAMETER( Value );
PAGED_CODE();
ASSERTMSG("Unused collation rule\n", FALSE);
return EqualTo;
}
BOOLEAN
DummyIsInExpression (
IN PWCH UnicodeTable,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN BOOLEAN IgnoreCase
)
{
//
// Most parameters are ignored since this is a catch-all for
// a corrupt volume. We simply raise to indicate the corruption
//
UNREFERENCED_PARAMETER( UnicodeTable );
UNREFERENCED_PARAMETER( Value );
UNREFERENCED_PARAMETER( IndexEntry );
UNREFERENCED_PARAMETER( IgnoreCase );
PAGED_CODE();
ASSERTMSG("Unused collation rule\n", FALSE);
return EqualTo;
}
BOOLEAN
DummyIsEqual (
IN PWCH UnicodeTable,
IN PVOID Value,
IN PINDEX_ENTRY IndexEntry,
IN BOOLEAN IgnoreCase
)
{
//
// Most parameters are ignored since this is a catch-all for
// a corrupt volume. We simply raise to indicate the corruption
//
UNREFERENCED_PARAMETER( UnicodeTable );
UNREFERENCED_PARAMETER( Value );
UNREFERENCED_PARAMETER( IndexEntry );
UNREFERENCED_PARAMETER( IgnoreCase );
PAGED_CODE();
ASSERTMSG("Unused collation rule\n", FALSE);
return EqualTo;
}
BOOLEAN
DummyContainsWildcards (
IN PVOID Value
)
{
//
// Most parameters are ignored since this is a catch-all for
// a corrupt volume. We simply raise to indicate the corruption
//
UNREFERENCED_PARAMETER( Value );
PAGED_CODE();
ASSERTMSG("Unused collation rule\n", FALSE);
return EqualTo;
}
VOID
DummyUpcaseValue (
IN PWCH UnicodeTable,
IN ULONG UnicodeTableSize,
IN PVOID Value
)
{
//
// Most parameters are ignored since this is a catch-all for
// a corrupt volume. We simply raise to indicate the corruption
//
UNREFERENCED_PARAMETER( UnicodeTable );
UNREFERENCED_PARAMETER( UnicodeTableSize );
UNREFERENCED_PARAMETER( Value );
PAGED_CODE();
ASSERTMSG("Unused collation rule\n", FALSE);
return;
}
//
// The following routines are not general index match functions, but rather
// specific file name match functions used only for automatic Dos Name generation.
//
BOOLEAN
NtfsFileNameIsInExpression (
IN PWCH UnicodeTable,
IN PFILE_NAME ExpressionName,
IN PFILE_NAME FileName,
IN BOOLEAN IgnoreCase
)
/*++
RoutineDescription:
This is a special match routine for matching FILE_NAME attributes only,
which is used only by the special code paths dealing with automatically
generated short names.
This routine is called to compare a file name expression (the value) with
a file name from the index to see if the file name is a match in this expression.
Arguments:
ExpressionName - pointer to the expression for file name.
FileName - Pointer to the FileName to match.
IgnoreCase - whether case should be ignored or not.
ReturnValue:
TRUE - if the file name is in the specified expression.
--*/
{
UNICODE_STRING ExpressionString, FileString;
PAGED_CODE();
//
// Build the unicode strings and call namesup.
//
ExpressionString.Length =
ExpressionString.MaximumLength = (USHORT)ExpressionName->FileNameLength << 1;
ExpressionString.Buffer = &ExpressionName->FileName[0];
FileString.Length =
FileString.MaximumLength = (USHORT)FileName->FileNameLength << 1;
FileString.Buffer = &FileName->FileName[0];
return NtfsIsNameInExpression( UnicodeTable,
&ExpressionString,
&FileString,
IgnoreCase );
}
BOOLEAN
NtfsFileNameIsEqual (
IN PWCH UnicodeTable,
IN PFILE_NAME ExpressionName,
IN PFILE_NAME FileName,
IN BOOLEAN IgnoreCase
)
/*++
RoutineDescription:
This is a special match routine for matching FILE_NAME attributes only,
which is used only by the special code paths dealing with automatically
generated short names.
This routine is called to compare a constant file name (the value) with
a file name from the index to see if the file name is an exact match.
Arguments:
ExpressionName - pointer to the expression for file name.
FileName - Pointer to the FileName to match.
IgnoreCase - whether case should be ignored or not.
ReturnValue:
TRUE - if the file name is a constant match.
--*/
{
UNICODE_STRING ExpressionString, FileString;
PAGED_CODE();
//
// Build the unicode strings and call namesup.
//
ExpressionString.Length =
ExpressionString.MaximumLength = (USHORT)ExpressionName->FileNameLength << 1;
ExpressionString.Buffer = &ExpressionName->FileName[0];
FileString.Length =
FileString.MaximumLength = (USHORT)FileName->FileNameLength << 1;
FileString.Buffer = &FileName->FileName[0];
return NtfsAreNamesEqual( UnicodeTable,
&ExpressionString,
&FileString,
IgnoreCase );
}