290 lines
5.9 KiB
C++
290 lines
5.9 KiB
C++
/*++
|
|
|
|
Copyright (c) 1993-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
util.cpp
|
|
|
|
Abstract:
|
|
This file implements common utilitarian functions.
|
|
|
|
Author:
|
|
|
|
Wesley Witt (wesw) 1-May-1993
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
--*/
|
|
|
|
#include "pch.cpp"
|
|
|
|
|
|
void
|
|
GetWinHelpFileName(
|
|
_TCHAR *pszHelpFileName,
|
|
DWORD len
|
|
)
|
|
{
|
|
_TCHAR szDrive[_MAX_DRIVE];
|
|
_TCHAR szDir[_MAX_DIR];
|
|
|
|
//
|
|
// find out the path where DrWatson was run from
|
|
//
|
|
GetModuleFileName( GetModuleHandle(NULL), pszHelpFileName, len );
|
|
|
|
//
|
|
// take the path and append the help file name
|
|
//
|
|
_tsplitpath( pszHelpFileName, szDrive, szDir, NULL, NULL );
|
|
_stprintf( pszHelpFileName, _T("%s%sdrwtsn32.hlp"), szDrive, szDir );
|
|
|
|
return;
|
|
}
|
|
|
|
void
|
|
GetHtmlHelpFileName(
|
|
_TCHAR *pszHelpFileName,
|
|
DWORD len
|
|
)
|
|
{
|
|
_TCHAR szDrive[_MAX_DRIVE];
|
|
_TCHAR szDir[_MAX_DIR];
|
|
|
|
//
|
|
// Make sure the array is at least initialized to zero.
|
|
//
|
|
|
|
*pszHelpFileName = 0;
|
|
|
|
//
|
|
// find out the path where DrWatson was run from
|
|
//
|
|
GetModuleFileName( GetModuleHandle(NULL), pszHelpFileName, len );
|
|
|
|
//
|
|
// take the path and append the help file name
|
|
//
|
|
_tsplitpath( pszHelpFileName, szDrive, szDir, NULL, NULL );
|
|
_stprintf( pszHelpFileName, _T("%s%sdrwtsn32.chm"), szDrive, szDir );
|
|
|
|
return;
|
|
}
|
|
|
|
/***************************************************************************\
|
|
* LoadStringOrError
|
|
*
|
|
* NOTE: Passing a NULL value for lpch returns the string length. (WRONG!)
|
|
*
|
|
* Warning: The return count does not include the terminating NULL WCHAR;
|
|
*
|
|
* History:
|
|
* 05-Apr-1991 ScottLu Fixed - code is now shared between client and server
|
|
* 24-Sep-1990 MikeKe From Win30
|
|
\***************************************************************************/
|
|
|
|
int
|
|
MyLoadStringOrError(
|
|
HMODULE hModule,
|
|
UINT wID,
|
|
LPWSTR lpBuffer, // Unicode buffer
|
|
int nLenInChars, // cch in Unicode buffer
|
|
WORD wLangId
|
|
)
|
|
{
|
|
HRSRC hResInfo;
|
|
HANDLE hStringSeg;
|
|
LPWSTR lpsz;
|
|
int cch;
|
|
|
|
/*
|
|
* Make sure the parms are valid.
|
|
*/
|
|
if (lpBuffer == NULL) {
|
|
//RIPMSG0(RIP_WARNING, _T("MyLoadStringOrError: lpBuffer == NULL"));
|
|
return 0;
|
|
}
|
|
|
|
|
|
cch = 0;
|
|
|
|
/*
|
|
* String Tables are broken up into 16 string segments. Find the segment
|
|
* containing the string we are interested in.
|
|
*/
|
|
hResInfo = FindResourceExW(hModule,
|
|
MAKEINTRESOURCEW(6), /* RT_STRING */
|
|
(LPWSTR)((LONG_PTR)(((USHORT)wID >> 4) + 1)),
|
|
wLangId
|
|
);
|
|
if (hResInfo) {
|
|
|
|
/*
|
|
* Load that segment.
|
|
*/
|
|
hStringSeg = LoadResource(hModule, hResInfo);
|
|
if (hStringSeg == NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
lpsz = (LPWSTR) (hStringSeg);
|
|
|
|
/*
|
|
* Move past the other strings in this segment.
|
|
* (16 strings in a segment -> & 0x0F)
|
|
*/
|
|
wID &= 0x0F;
|
|
while (TRUE) {
|
|
cch = *((WCHAR *)lpsz++); // PASCAL like string count
|
|
// first UTCHAR is count if TCHARs
|
|
if (wID-- == 0) break;
|
|
lpsz += cch; // Step to start if next string
|
|
}
|
|
|
|
/*
|
|
* chhBufferMax == 0 means return a pointer to the read-only resource buffer.
|
|
*/
|
|
if (nLenInChars == 0) {
|
|
*(LPWSTR *)lpBuffer = lpsz;
|
|
} else {
|
|
|
|
/*
|
|
* Account for the NULL
|
|
*/
|
|
nLenInChars--;
|
|
|
|
/*
|
|
* Don't copy more than the max allowed.
|
|
*/
|
|
if (cch > nLenInChars) {
|
|
cch = nLenInChars;
|
|
}
|
|
|
|
/*
|
|
* Copy the string into the buffer.
|
|
*/
|
|
CopyMemory(lpBuffer, lpsz, cch*sizeof(WCHAR));
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Append a NULL.
|
|
*/
|
|
if (nLenInChars != 0) {
|
|
lpBuffer[cch] = 0;
|
|
}
|
|
|
|
return cch;
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
* LoadStringA (API)
|
|
* LoadStringW (API)
|
|
*
|
|
*
|
|
* 05-Apr-1991 ScottLu Fixed to work with client/server.
|
|
\***************************************************************************/
|
|
|
|
int
|
|
WINAPI
|
|
MyLoadString(
|
|
HINSTANCE hmod,
|
|
UINT wID,
|
|
LPWSTR lpBuffer,
|
|
int nLenInChars
|
|
)
|
|
{
|
|
return MyLoadStringOrError((HMODULE)hmod,
|
|
wID,
|
|
lpBuffer,
|
|
nLenInChars,
|
|
0);
|
|
}
|
|
|
|
|
|
_TCHAR *
|
|
LoadRcString(
|
|
UINT wId
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Loads a resource string from DRWTSN32 and returns a pointer
|
|
to the string.
|
|
|
|
Arguments:
|
|
|
|
wId - resource string id
|
|
|
|
Return Value:
|
|
|
|
pointer to the string
|
|
|
|
--*/
|
|
|
|
{
|
|
static _TCHAR buf[1024];
|
|
|
|
MyLoadString( GetModuleHandle(NULL), wId, buf, sizeof(buf) / sizeof(_TCHAR) );
|
|
|
|
return buf;
|
|
}
|
|
|
|
void
|
|
GetAppName(
|
|
_TCHAR *pszAppName,
|
|
DWORD len
|
|
)
|
|
{
|
|
MyLoadString( GetModuleHandle(NULL), IDS_APPLICATION_NAME, pszAppName, len );
|
|
}
|
|
|
|
PTSTR
|
|
ExpandPath(
|
|
PTSTR lpPath
|
|
)
|
|
/*++
|
|
Description
|
|
Expands the path passed. Returns the expanded path in an dynamically
|
|
allocated string. The dynamically allocated string is always at least
|
|
_MAX_PATH is size. Note: size is calculated in characters.
|
|
|
|
Arguments
|
|
lpPath - Path to be expanded.
|
|
|
|
Returns
|
|
Dynamically allocated buffer at least _MAX_PATH in length.
|
|
--*/
|
|
{
|
|
DWORD len;
|
|
PTSTR p;
|
|
|
|
|
|
len = ExpandEnvironmentStrings( lpPath, NULL, 0 );
|
|
if (!len) {
|
|
return NULL;
|
|
}
|
|
|
|
len++; // Null terminator
|
|
len = max(len, _MAX_PATH);
|
|
p = (PTSTR) calloc( len, sizeof(_TCHAR) );
|
|
if (!p) {
|
|
return NULL;
|
|
}
|
|
|
|
len = ExpandEnvironmentStrings( lpPath, p, len );
|
|
if (!len) {
|
|
free( p );
|
|
return NULL;
|
|
}
|
|
|
|
return p;
|
|
}
|