2020-09-30 17:17:25 +02:00

217 lines
4.3 KiB
C

/*++
Copyright (c) 2000-2001 Microsoft Corporation
Module Name:
fatsup.c
Abstract:
This module implements FAT file system utility routines.
--*/
#include "fatx.h"
//
// A condensed table of legal fat character values
//
const ULONG FatxFatIllegalTable[] = {
0xffffffff,
0xfc009c04,
0x10000000,
0x10000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
};
BOOLEAN
FatxIsValidFatFileName(
IN POBJECT_STRING FileName
)
/*++
Routine Description:
This routine checks if the supplied file name is a legal FAT file name
Arguments:
FileName - Specifies the buffer to check for validity.
Return Value:
Returns TRUE if the string is valid, else FALSE.
--*/
{
POSTR Buffer;
POSTR EndingBuffer;
OCHAR Char;
//
// If the file name is zero or too long, then the name is not valid.
//
if ((FileName->Length == 0) || (FileName->Length > FAT_FILE_NAME_LENGTH)) {
return FALSE;
}
//
// Perform some preliminary checks if the name begins with a period.
//
Buffer = FileName->Buffer;
EndingBuffer = Buffer + FileName->Length / sizeof(OCHAR);
if (*Buffer == '.') {
//
// If the name is "." or "..", then the name is not valid.
//
if ((FileName->Length == sizeof(OCHAR)) ||
(FileName->Length == sizeof(OCHAR) * 2) && (*(Buffer + 1) == '.')) {
return FALSE;
}
}
//
// Process the rest of the file name.
//
while (Buffer < EndingBuffer) {
Char = *Buffer++;
//
// Check for illegal FAT characters.
//
if (FatxFatIllegalTable[Char >> 5] & (1 << (Char & 31))) {
return FALSE;
}
}
return TRUE;
}
LARGE_INTEGER
FatxFatTimestampToTime(
IN PFAT_TIME_STAMP FatTimestamp
)
/*++
Routine Description:
This routine converts a FAT timestamp to a NT system time.
Arguments:
FatTimestamp - Specifies the timestamp to convert to NT system time.
Return Value:
Conversion to NT system time.
--*/
{
LARGE_INTEGER SystemTime;
TIME_FIELDS TimeField;
TimeField.Year = (USHORT)(FatTimestamp->Year + 2000);
TimeField.Month = FatTimestamp->Month;
TimeField.Day = FatTimestamp->Day;
TimeField.Hour = FatTimestamp->Hour;
TimeField.Minute = FatTimestamp->Minute;
TimeField.Second = (USHORT)(FatTimestamp->DoubleSeconds * 2);
TimeField.Milliseconds = 0;
if (!RtlTimeFieldsToTime(&TimeField, &SystemTime)) {
SystemTime.QuadPart = 0;
}
return SystemTime;
}
LOGICAL
FatxTimeToFatTimestamp(
IN PLARGE_INTEGER Time,
OUT PFAT_TIME_STAMP FatTimestamp
)
/*++
Routine Description:
This routine converts a NT system time to a FAT timestamp.
Arguments:
Time - Specifies the NT system time.
FatTimestamp - Specifies the buffer to receive the FAT timestamp.
Return Value:
Returns TRUE if the time could be converted to a valid FAT time, else FALSE.
--*/
{
LARGE_INTEGER LocalTime;
TIME_FIELDS TimeField;
//
// Round the time up to the nearest double second.
//
LocalTime.QuadPart = Time->QuadPart + (2 * 1000 * 1000 * 10 - 1);
RtlTimeToTimeFields(&LocalTime, &TimeField);
FatTimestamp->Year = (USHORT)(TimeField.Year - 2000);
FatTimestamp->Month = TimeField.Month;
FatTimestamp->Day = TimeField.Day;
FatTimestamp->Hour = TimeField.Hour;
FatTimestamp->Minute = TimeField.Minute;
FatTimestamp->DoubleSeconds = (USHORT)(TimeField.Second >> 1);
return (TimeField.Year >= 2000) && (TimeField.Year <= 2000 + 127);
}
LARGE_INTEGER
FatxRoundToFatTime(
IN PLARGE_INTEGER Time
)
/*++
Routine Description:
This routine rounds a NT system time to FAT granularity (two seconds).
Arguments:
Time - Specifies the NT system time.
Return Value:
Rounded NT system time.
--*/
{
FAT_TIME_STAMP FatTimestamp;
//
// Convert the time to a FAT timestamp and back.
//
if ((Time->QuadPart != 0) && FatxTimeToFatTimestamp(Time, &FatTimestamp)) {
return FatxFatTimestampToTime(&FatTimestamp);
} else {
return *Time;
}
}