78 lines
1.5 KiB
C++
78 lines
1.5 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
|