#include "brian.h" VOID FullEnterTime( PUSHORT BufferPointer, CSHORT Year, CSHORT Month, CSHORT Day, CSHORT Hour, CSHORT Minute, CSHORT Second, CSHORT MSecond ); VOID FullDisplayTime ( USHORT BufferIndex ); VOID PrintTime ( IN PTIME Time ) { TIME_FIELDS TimeFields; RtlTimeToTimeFields( Time, &TimeFields ); printf( "%02u-%02u-%02u %02u:%02u:%02u", TimeFields.Month, TimeFields.Day, TimeFields.Year % 100, TimeFields.Hour, TimeFields.Minute, TimeFields.Second ); return; } VOID BPrintTime ( IN PTIME Time ) { TIME_FIELDS TimeFields; RtlTimeToTimeFields( Time, &TimeFields ); bprint "%02u-%02u-%02u %02u:%02u:%02u", TimeFields.Month, TimeFields.Day, ((USHORT) (TimeFields.Year - 1900)) > 100 ? 0 : TimeFields.Year - 1900, TimeFields.Hour, TimeFields.Minute, TimeFields.Second ); return; } VOID InputEnterTime ( IN PCHAR ParamBuffer ) { USHORT ActualIndex; PUSHORT BufferPointer; CSHORT Year; CSHORT Month; CSHORT Day; CSHORT Hour; CSHORT Minute; CSHORT Second; CSHORT MSecond; BOOLEAN LastInput; BOOLEAN ParmSpecified; ActualIndex = 0; BufferPointer = NULL; Year = 1601; Month = 1; Day = 1; Hour = 0; Minute = 0; Second = 0; MSecond = 0; ParmSpecified = FALSE; LastInput = TRUE; // // While there is more input, analyze the parameter and update the // query flags. // while (TRUE) { ULONG DummyCount; // // Swallow leading white spaces. // ParamBuffer = SwallowWhite( ParamBuffer, &DummyCount ); if (*ParamBuffer) { // // If the next parameter is legal then check the paramter value. // Update the parameter value. // if ((*ParamBuffer == '-' || *ParamBuffer == '/') && (ParamBuffer++, *ParamBuffer != '\0')) { // // Switch on the next character. // switch( *ParamBuffer ) { // // Check buffer index. // case 'b' : case 'B' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; ActualIndex = (USHORT) AsciiToInteger( ParamBuffer ); BufferPointer = &ActualIndex; ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParmSpecified = TRUE; break; // // Enter the year value. // case 'y' : case 'Y' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; Year = (CSHORT) AsciiToInteger( ParamBuffer ); ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParmSpecified = TRUE; break; // // Check the month value. // case 'm' : case 'M' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; Month = (CSHORT) AsciiToInteger( ParamBuffer ); ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParmSpecified = TRUE; break; // // Enter the day value. // case 'd' : case 'D' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; Day = (CSHORT) AsciiToInteger( ParamBuffer ); ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParmSpecified = TRUE; break; // // Enter the hour value. // case 'h' : case 'H' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; Hour = (CSHORT) AsciiToInteger( ParamBuffer ); ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParmSpecified = TRUE; break; // // Enter the minute value. // case 'i' : case 'I' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; Minute = (CSHORT) AsciiToInteger( ParamBuffer ); ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParmSpecified = TRUE; break; // // Enter the second value. // case 's' : case 'S' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; Second = (CSHORT) AsciiToInteger( ParamBuffer ); ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParmSpecified = TRUE; break; // // Check the millesecond value. // case 'c' : case 'C' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; MSecond = (CSHORT) AsciiToInteger( ParamBuffer ); ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParmSpecified = TRUE; break; default : // // Swallow to the next white space and continue the // loop. // ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); } } // // Else the text is invalid, skip the entire block. // // // // Else if there is no input then exit. // } else if ( LastInput ) { break; // // Else try to read another line for open parameters. // } else { } } // // If no parameters were received then display the syntax message. // if (!ParmSpecified) { printf( "\n Usage: et [options]*\n" ); printf( "\n Options:" ); printf( "\n -b Buffer index" ); printf( "\n -y Year (1601...)" ); printf( "\n -m Month (1..12)" ); printf( "\n -d Day (1..31)" ); printf( "\n -h Hour (0..23)" ); printf( "\n -i Minute (0..59)" ); printf( "\n -s Second (0..59)" ); printf( "\n -c Milleseconds (0..999)" ); printf( "\n\n" ); // // Else call the routine to enter the time. // } else { FullEnterTime( BufferPointer, Year, Month, Day, Hour, Minute, Second, MSecond ); } return; } VOID FullEnterTime( IN PUSHORT BufferPointer, IN CSHORT Year, IN CSHORT Month, IN CSHORT Day, IN CSHORT Hour, IN CSHORT Minute, IN CSHORT Second, IN CSHORT MSecond ) { NTSTATUS Status; TIME_FIELDS TimeFields; USHORT BufferIndex; // // If we need a buffer, allocate it now. // try { if (BufferPointer == NULL) { SIZE_T ThisLength; ULONG TempIndex; ThisLength = sizeof( TIME ); Status = AllocateBuffer( 0L, &ThisLength, &TempIndex ); BufferIndex = (USHORT) TempIndex; BufferPointer = &BufferIndex; if (!NT_SUCCESS( Status )) { printf( "\n\tFullEnterTime: Unable to allocate a buffer -> %08lx", Status ); try_return( NOTHING ); } printf( "\n\tFullEnterTime: Using buffer -> %04x", *BufferPointer ); printf( "\n" ); } // // Check that the buffer index is valid. // if (*BufferPointer >= MAX_BUFFERS) { printf( "\n\tFullEnterTime: The buffer index is invalid" ); try_return( NOTHING ); } // // Enter the values in the time field structure. // TimeFields.Year = Year; TimeFields.Month = Month; TimeFields.Day = Day; TimeFields.Hour = Hour; TimeFields.Minute = Minute; TimeFields.Second = Second; TimeFields.Milliseconds = MSecond; // // Convert the time field to TIME format for our buffer. // if (!RtlTimeFieldsToTime( &TimeFields, (PTIME) Buffers[*BufferPointer].Buffer )) { printf( "\n\tFullEnterTime: Invalid time format" ); try_return( NOTHING ); } try_exit: NOTHING; } finally { } return; } VOID InputDisplayTime ( IN PCHAR ParamBuffer ) { USHORT BufferIndex; BOOLEAN ParamReceived; BOOLEAN LastInput; // // Set the defaults. // BufferIndex = 0; ParamReceived = FALSE; LastInput = TRUE; // // While there is more input, analyze the parameter and update the // query flags. // while (TRUE) { ULONG DummyCount; // // Swallow leading white spaces. // ParamBuffer = SwallowWhite( ParamBuffer, &DummyCount ); if (*ParamBuffer) { // // If the next parameter is legal then check the paramter value. // Update the parameter value. // if ((*ParamBuffer == '-' || *ParamBuffer == '/') && (ParamBuffer++, *ParamBuffer != '\0')) { // // Switch on the next character. // switch( *ParamBuffer ) { // // Check the buffer index. // case 'b' : case 'B' : // // Move to the next character, as long as there // are no white spaces continue analyzing letters. // On the first bad letter, skip to the next // parameter. // ParamBuffer++; BufferIndex = (USHORT) AsciiToInteger( ParamBuffer ); ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); ParamReceived = TRUE; break; default : // // Swallow to the next white space and continue the // loop. // ParamBuffer = SwallowNonWhite( ParamBuffer, &DummyCount ); } } // // Else the text is invalid, skip the entire block. // // // // Else if there is no input then exit. // } else if ( LastInput ) { break; // // Else try to read another line for open parameters. // } else { } } // // If no parameters were received then display the syntax message. // if (!ParamReceived) { printf( "\n Usage: dqf [options]* -b [options]*\n" ); printf( "\n Options:" ); printf( "\n -b Buffer index" ); printf( "\n -c Key to buffer format" ); printf( "\n\n" ); // // Else call our display buffer routine. // } else { FullDisplayTime( BufferIndex ); } return; } VOID FullDisplayTime ( USHORT BufferIndex ) { // // Check that the buffer index is valid and the buffer is used. // if (BufferIndex >= MAX_BUFFERS || Buffers[BufferIndex].Used == FALSE) { bprint "\n\tFullDisplayTime: Invalid buffer index" ); } else { printf( "\n\tFullDisplayTime: Index %d ", BufferIndex ); PrintTime( (PTIME) Buffers[BufferIndex].Buffer ); } printf( "\n" ); return; }