|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
SuperBike.cpp
Abstract:
The application attempts to convert the path to the executable into the directory containing the executable by replacing the last \ in the path with NULL. Unfortunately, they start not at the end of the string, but at the max length of the string. On Win9x the extra memory doesn't (coincidentally) have a \, so the proper string is passed as the CWD to CreateProcessA. On Whistler, the extra memory contains a \ so they end up changing nothing.
History:
10/26/2000 robkenny Created 03/13/2001 robkenny Converted to CString
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(SuperBike) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(CreateProcessA) APIHOOK_ENUM_END
/*++
Make sure lpCurrentDirectory points to a directory, not an executable
--*/
BOOL APIHOOK(CreateProcessA)( LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ) { CSTRING_TRY { CString csDir(lpCurrentDirectory); char * duplicate = NULL;
if (!csDir.IsEmpty()) { DWORD dwFileAttr = GetFileAttributesW(csDir); if (dwFileAttr != -1 && // Doesn't exist
( ! (FILE_ATTRIBUTE_DIRECTORY & dwFileAttr))) // Is not a directory
{ csDir.StripPath(); } BOOL bStat = ORIGINAL_API(CreateProcessA)( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, csDir.GetAnsiNIE(), // our corrected value
lpStartupInfo, lpProcessInformation);
return bStat; } } CSTRING_CATCH { // Do nothing
}
BOOL bStat = ORIGINAL_API(CreateProcessA)( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation); return bStat; }
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(KERNEL32.DLL, CreateProcessA)
HOOK_END
IMPLEMENT_SHIM_END
|