214 lines
4.5 KiB
C++
214 lines
4.5 KiB
C++
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
util.cpp
|
|
|
|
Abstract:
|
|
|
|
This file implements utility functions.
|
|
|
|
Environment:
|
|
|
|
WIN32 User Mode
|
|
|
|
Author:
|
|
|
|
Wesley Witt (wesw) 3-Dec-1997
|
|
|
|
--*/
|
|
|
|
#include "ntoc.h"
|
|
#pragma hdrstop
|
|
|
|
WCHAR gpszError[] = L"Unknown Error";
|
|
|
|
void
|
|
dprintf(
|
|
LPTSTR Format,
|
|
...
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Prints a debug string
|
|
|
|
Arguments:
|
|
|
|
format - printf() format string
|
|
... - Variable data
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
WCHAR buf[1024];
|
|
DWORD len;
|
|
va_list arg_ptr;
|
|
|
|
|
|
va_start(arg_ptr, Format);
|
|
|
|
_vsnwprintf(buf, sizeof(buf)/sizeof(buf[0]), Format, arg_ptr);
|
|
// make sure we have room to write past the length of the string
|
|
buf[sizeof(buf)/sizeof(buf[0])-3] = L'\0';
|
|
|
|
len = wcslen( buf );
|
|
if (len > 0) {
|
|
if (buf[len-1] != L'\n') {
|
|
buf[len] = L'\r';
|
|
buf[len+1] = L'\n';
|
|
buf[len+2] = 0;
|
|
}
|
|
|
|
OutputDebugString( buf );
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
AssertError(
|
|
LPTSTR Expression,
|
|
LPTSTR File,
|
|
ULONG LineNumber
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Thie function is use together with the Assert MACRO.
|
|
It checks to see if an expression is FALSE. if the
|
|
expression is FALSE, then you end up here.
|
|
|
|
Arguments:
|
|
|
|
Expression - The text of the 'C' expression
|
|
File - The file that caused the assertion
|
|
LineNumber - The line number in the file.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
dprintf(
|
|
L"Assertion error: [%s] %s @ %d\n",
|
|
Expression,
|
|
File,
|
|
LineNumber
|
|
);
|
|
|
|
__try {
|
|
DebugBreak();
|
|
} __except (UnhandledExceptionFilter(GetExceptionInformation())) {
|
|
// Nothing to do in here.
|
|
}
|
|
}
|
|
|
|
/***************************************************************************\
|
|
*
|
|
* FUNCTION: FmtMessageBox(HWND hwnd, int dwTitleID, UINT fuStyle,
|
|
* BOOL fSound, DWORD dwTextID, ...);
|
|
*
|
|
* PURPOSE: Formats messages with FormatMessage and then displays them
|
|
* in a message box
|
|
*
|
|
* PARAMETERS:
|
|
* hwnd - parent window for message box
|
|
* fuStyle - MessageBox style
|
|
* fSound - if TRUE, MessageBeep will be called with fuStyle
|
|
* dwTitleID - Message ID for optional title, "Error" will
|
|
* be displayed if dwTitleID == -1
|
|
* dwTextID - Message ID for the message box text
|
|
* ... - optional args to be embedded in dwTextID
|
|
* see FormatMessage for more details
|
|
* History:
|
|
* 22-Apr-1993 JonPa Created it.
|
|
\***************************************************************************/
|
|
int
|
|
FmtMessageBox(
|
|
HWND hwnd,
|
|
UINT fuStyle,
|
|
BOOL fSound,
|
|
DWORD dwTitleID,
|
|
DWORD dwTextID,
|
|
...
|
|
)
|
|
{
|
|
|
|
LPTSTR pszMsg;
|
|
LPTSTR pszTitle;
|
|
int idRet;
|
|
|
|
va_list marker;
|
|
|
|
va_start(marker, dwTextID);
|
|
|
|
if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
FORMAT_MESSAGE_FROM_HMODULE |
|
|
FORMAT_MESSAGE_MAX_WIDTH_MASK,
|
|
hInstance,
|
|
dwTextID,
|
|
0,
|
|
(LPTSTR)&pszMsg,
|
|
1,
|
|
&marker)) {
|
|
|
|
pszMsg = gpszError;
|
|
|
|
}
|
|
|
|
va_end(marker);
|
|
|
|
GetLastError();
|
|
|
|
pszTitle = NULL;
|
|
|
|
if (dwTitleID != -1) {
|
|
|
|
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
FORMAT_MESSAGE_FROM_HMODULE |
|
|
FORMAT_MESSAGE_MAX_WIDTH_MASK |
|
|
FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
|
hInstance,
|
|
dwTitleID,
|
|
0,
|
|
(LPTSTR)&pszTitle,
|
|
1,
|
|
NULL);
|
|
//(va_list *)&pszTitleStr);
|
|
|
|
}
|
|
|
|
//
|
|
// Turn on the beep if requested
|
|
//
|
|
|
|
if (fSound) {
|
|
MessageBeep(fuStyle & (MB_ICONASTERISK | MB_ICONEXCLAMATION |
|
|
MB_ICONHAND | MB_ICONQUESTION | MB_OK));
|
|
}
|
|
|
|
idRet = MessageBox(hwnd, pszMsg, pszTitle, fuStyle);
|
|
|
|
if (pszTitle != NULL)
|
|
LocalFree(pszTitle);
|
|
|
|
if (pszMsg != gpszError)
|
|
LocalFree(pszMsg);
|
|
|
|
return idRet;
|
|
}
|
|
|
|
|