/*++ Copyright (c) 2000 Microsoft Corporation Module Name: spprintf.c Abstract: safer sprintf variants Author: Jay Krell (a-JayK) November 2000 Revision History: --*/ #include "spprecmp.h" #pragma hdrstop #include #include #include "spprintf.h" #include "spcab.h" // // _snprintf and co. do not write a terminal nul when the string just fits. // These function do. // void SpFormatStringVaA( PSTR Buffer, SIZE_T Size, PCSTR Format, va_list Args ) { if (Buffer != NULL && Size != 0) { Buffer[0] = 0; Size -= 1; if (Size != 0) _vsnprintf(Buffer, Size, Format, Args); Buffer[Size] = 0; } } void __cdecl SpFormatStringA( PSTR Buffer, SIZE_T Size, PCSTR Format, ... ) { va_list Args; va_start(Args, Format); SpFormatStringVaA(Buffer, Size, Format, Args); va_end(Args); } void SpFormatStringVaW( PWSTR Buffer, SIZE_T Size, PCWSTR Format, va_list Args ) { if (Buffer != NULL && Size != 0) { Buffer[0] = 0; Size -= 1; if (Size != 0) _vsnwprintf(Buffer, Size, Format, Args); Buffer[Size] = 0; } } void __cdecl SpFormatStringW( PWSTR Buffer, SIZE_T Size, PCWSTR Format, ... ) { va_list Args; va_start(Args, Format); SpFormatStringVaW(Buffer, Size, Format, Args); va_end(Args); } NTSTATUS __cdecl SpFormatStringWToA( PSTR Buffer, SIZE_T Size, PCWSTR Format, ... ) { va_list Args; UNICODE_STRING UnicodeBuffer = { 0 }; ANSI_STRING AnsiBuffer = { 0 }; NTSTATUS Status = STATUS_SUCCESS; va_start(Args, Format); UnicodeBuffer.Buffer = (PWSTR)SpMemAlloc(Size * sizeof(UnicodeBuffer.Buffer[0])); if (UnicodeBuffer.Buffer == NULL) { Status = STATUS_NO_MEMORY; goto Exit; } if (Size != 0) { UnicodeBuffer.Buffer[0] = 0; } SpFormatStringVaW(UnicodeBuffer.Buffer, Size, Format, Args); UnicodeBuffer.Length = (USHORT)(wcslen(UnicodeBuffer.Buffer) + 1) * sizeof(UnicodeBuffer.Buffer[0]); AnsiBuffer.MaximumLength = (USHORT)Size * sizeof(AnsiBuffer.Buffer[0]); Status = SpUnicodeStringToAnsiString(&AnsiBuffer, &UnicodeBuffer, FALSE); Exit: va_end(Args); return Status; }