mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
680 lines
15 KiB
680 lines
15 KiB
/*++
|
|
|
|
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 );
|
|
}
|
|
|