windows-nt/Source/XPSP1/NT/base/ntsetup/textmode/cmdcons/resource.c
2020-09-26 16:20:57 +08:00

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);
}