179 lines
2.9 KiB
C
179 lines
2.9 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
resources.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements all access to
|
||
|
the resources.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Wesley Witt (wesw) 21-Oct-1998
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "cmdcons.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
LPCWSTR _DateTimeFormat;
|
||
|
|
||
|
|
||
|
VOID
|
||
|
vRcMessageOut(
|
||
|
IN ULONG MessageId,
|
||
|
IN va_list *arglist
|
||
|
)
|
||
|
{
|
||
|
WCHAR *p;
|
||
|
NTSTATUS Status;
|
||
|
|
||
|
//
|
||
|
// Load the message
|
||
|
//
|
||
|
p = SpRetreiveMessageText(ImageBase,MessageId,NULL,0);
|
||
|
if(!p) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Status = SpRtlFormatMessage(
|
||
|
p,
|
||
|
0,
|
||
|
FALSE,
|
||
|
FALSE,
|
||
|
FALSE,
|
||
|
arglist,
|
||
|
_CmdConsBlock->TemporaryBuffer,
|
||
|
_CmdConsBlock->TemporaryBufferSize,
|
||
|
NULL
|
||
|
);
|
||
|
|
||
|
SpMemFree(p);
|
||
|
|
||
|
if(NT_SUCCESS(Status)) {
|
||
|
RcTextOut(_CmdConsBlock->TemporaryBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
RcMessageOut(
|
||
|
IN ULONG MessageId,
|
||
|
...
|
||
|
)
|
||
|
{
|
||
|
va_list arglist;
|
||
|
|
||
|
va_start(arglist,MessageId);
|
||
|
vRcMessageOut(MessageId,&arglist);
|
||
|
va_end(arglist);
|
||
|
}
|
||
|
|
||
|
|
||
|
ULONG
|
||
|
RcFormatDateTime(
|
||
|
IN PLARGE_INTEGER Time,
|
||
|
OUT LPWSTR Output
|
||
|
)
|
||
|
{
|
||
|
TIME_FIELDS TimeFields;
|
||
|
WCHAR *p,*AmPmSpec;
|
||
|
LPCWSTR q;
|
||
|
int i;
|
||
|
|
||
|
//
|
||
|
// Load the system date and time format string if not loaded already.
|
||
|
//
|
||
|
if(!_DateTimeFormat) {
|
||
|
_DateTimeFormat = SpRetreiveMessageText(ImageBase,MSG_DATE_TIME_FORMAT,NULL,0);
|
||
|
if(!_DateTimeFormat) {
|
||
|
_DateTimeFormat = L"m/d/y h:na*";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Translate the last write time to time fields.
|
||
|
//
|
||
|
RtlTimeToTimeFields(Time,&TimeFields);
|
||
|
|
||
|
//
|
||
|
// Format the date and time.
|
||
|
//
|
||
|
p = Output;
|
||
|
q = _DateTimeFormat;
|
||
|
AmPmSpec = NULL;
|
||
|
|
||
|
while(*q != L'*') {
|
||
|
|
||
|
switch(*q) {
|
||
|
|
||
|
case L'm':
|
||
|
i = TimeFields.Month;
|
||
|
break;
|
||
|
|
||
|
case L'd':
|
||
|
i = TimeFields.Day;
|
||
|
break;
|
||
|
|
||
|
case L'y':
|
||
|
i = TimeFields.Year;
|
||
|
break;
|
||
|
|
||
|
case L'h':
|
||
|
i = TimeFields.Hour % 12;
|
||
|
if(i == 0) {
|
||
|
i = 12;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case L'H':
|
||
|
i = TimeFields.Hour;
|
||
|
break;
|
||
|
|
||
|
case L'n':
|
||
|
i = TimeFields.Minute;
|
||
|
break;
|
||
|
|
||
|
case L'a':
|
||
|
i = -1;
|
||
|
AmPmSpec = p++;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
i = -1;
|
||
|
*p++ = *q;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if(i != -1) {
|
||
|
|
||
|
i = i % 100;
|
||
|
|
||
|
*p++ = (i / 10) + L'0';
|
||
|
*p++ = (i % 10) + L'0';
|
||
|
}
|
||
|
|
||
|
q++;
|
||
|
}
|
||
|
|
||
|
if(AmPmSpec) {
|
||
|
q++; // q points at am specifier
|
||
|
if(TimeFields.Hour >= 12) {
|
||
|
q++; // q points at pm specifier
|
||
|
}
|
||
|
|
||
|
*AmPmSpec = *q;
|
||
|
}
|
||
|
|
||
|
*p = 0;
|
||
|
|
||
|
return (ULONG)(p - Output);
|
||
|
}
|