windows-nt/Source/XPSP1/NT/windows/appcompat/shims/general/handledbcsusername2.cpp
2020-09-26 16:20:57 +08:00

98 lines
1.8 KiB
C++

/*++
Copyright (c) 2000-2001 Microsoft Corporation
Module Name:
HandleDBCSUserName2.cpp
Abstract:
Disable DBCS handling for CharNextA if the string is DBCS user profile
for non-DBCS enabled application support.
More info:
Return next byte address instead of next character address.
History:
05/01/2001 geoffguo Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(HandleDBCSUserName2)
#include "ShimHookMacro.h"
#define MAX_USERNAME 256
//
// Add APIs that you wish to hook to this macro construction.
//
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(CharNextA)
APIHOOK_ENUM_END
//
// Checking if the string is user profile path
//
BOOL IsUserProfilePath(
LPCSTR lpCurrentChar)
{
LPSTR lpChar = (LPSTR)lpCurrentChar;
BOOL bRet = FALSE;
char szBuf[10];
while (lpChar != NULL && *lpChar != (char)NULL
&& (lpCurrentChar - lpChar) < MAX_USERNAME+25) {
//to find ":\Documents and Settings" (short name is :\DOCUME~1) in path
if (*lpChar == (char) ':') {
lstrcpynA (szBuf, lpChar, 9);
szBuf[8] = (char) NULL;
if (lstrcmpiA (szBuf, ":\\DOCUME") == 0) {
bRet = TRUE;
break;
}
}
lpChar--;
}
return bRet;
}
//
// Disable DBCS handling for CharNextA
//
LPSTR
APIHOOK(CharNextA)(
LPCSTR lpCurrentChar)
{
if (lpCurrentChar != NULL && *lpCurrentChar != (char)NULL) {
// Disable DBCS support for DBCS username in user profile path
if (IsDBCSLeadByte(*lpCurrentChar) && !IsUserProfilePath(lpCurrentChar))
lpCurrentChar++;
lpCurrentChar++;
}
return (LPSTR)lpCurrentChar;
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(USER32.DLL, CharNextA)
HOOK_END
IMPLEMENT_SHIM_END