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

78 lines
1.4 KiB
C++

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
RCenter.cpp
Abstract:
RCenter attempts to compare file extensions from a CD's root against known media
types. When they get the file's extension, they get ".txt" and then add one to the
pointer to leave "txt".
The trouble is that if a file has no extension they end up with a null pointer for
the extension string, add one to it, and then pass it into lstrcmpiA. lstrcmpiA
can handle null pointers, but not "1" pointers.
This shim treats bad pointers as the shortest possible string:
lstrcmpi(BAD_PTR, "Hello World") == LESS_THAN
lstrcmpi("Hello World", BAD_PTR) == GREATER_THAN
lstrcmpi(BAD_PTR, BAD_PTR) == EQUAL
Notes:
This is an app specific shim.
History:
11/13/2001 astritz Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(RCenter)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(lstrcmpiA)
APIHOOK_ENUM_END
/*++
Hook lstrcmpiA to handle NULL pointers as above.
--*/
BOOL
APIHOOK(lstrcmpiA)(
LPCSTR lpString1,
LPCSTR lpString2
)
{
if (IsBadReadPtr(lpString1, 1)) {
if (IsBadReadPtr(lpString2, 1)) {
return 0;
} else {
return -1;
}
} else if (IsBadReadPtr(lpString2, 1)) {
return 1;
}
return ORIGINAL_API(lstrcmpiA)(lpString1, lpString2);
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(KERNEL32.DLL, lstrcmpiA)
HOOK_END
IMPLEMENT_SHIM_END