681 lines
16 KiB
C
681 lines
16 KiB
C
/*++
|
||
|
||
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 );
|
||
}
|
||
|