windows-nt/Source/XPSP1/NT/windows/appcompat/shims/general/removespacesafterslashfromfilenames.cpp

644 lines
14 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
RemoveSpacesAfterSlashFromFilenames.cpp
Abstract:
This shims all of the listed apis and simply searches a filename var for
"\ " and replaces it with "\"
Notes:
This is a general purpose shim.
History:
12/15/1999 markder Created
05/16/2000 robkenny Check for memory alloc failure.
Moved MassagePath routines to here.
--*/
#include "ShimHook.h"
enum
{
APIHOOK_CreateFileA = USERAPIHOOKSTART,
APIHOOK_CreateFileW,
APIHOOK_GetFileAttributesA,
APIHOOK_GetFileAttributesW,
APIHOOK_GetFileAttributesExA,
APIHOOK_GetFileAttributesExW,
APIHOOK_DeleteFileA,
APIHOOK_DeleteFileW,
APIHOOK_RemoveDirectoryA,
APIHOOK_RemoveDirectoryW,
APIHOOK_MoveFileA,
APIHOOK_MoveFileW,
APIHOOK_MoveFileExA,
APIHOOK_MoveFileExW,
APIHOOK_Count
};
/*++
Function Description:
Removes all "\ " and replaces with "\".
Arguments:
IN pszOldPath - String to scan
OUT pszNewPath - Resultant string
Return Value:
None
History:
01/10/2000 linstev Updated
--*/
VOID
MassagePathA(
LPCSTR pszOldPath,
LPSTR pszNewPath
)
{
PCHAR pszTempBuffer;
PCHAR pszPointer;
LONG nOldPos, nNewPos, nOldStringLen;
BOOL bAtSeparator = TRUE;
nOldStringLen = strlen(pszOldPath);
pszTempBuffer = (PCHAR) LocalAlloc(LPTR, nOldStringLen + 1);
if (pszTempBuffer == NULL)
{
// Alloc failed, do nothing.
strcpy(pszNewPath, pszOldPath);
return;
}
pszPointer = pszTempBuffer;
nNewPos = nOldStringLen;
for (nOldPos = nOldStringLen - 1; nOldPos >= 0; nOldPos--)
{
if (pszOldPath[ nOldPos ] == '\\')
{
bAtSeparator = TRUE;
}
else
{
if (pszOldPath[nOldPos] == ' ' && bAtSeparator)
{
DPF(eDbgLevelError, "[MassagePathA] Found \"\\ \" in filename. Removing space.\n");
continue;
}
else
{
bAtSeparator = FALSE;
}
}
pszPointer[--nNewPos] = pszOldPath[nOldPos];
}
pszPointer += nNewPos;
strcpy(pszNewPath, pszPointer);
LocalFree(pszTempBuffer);
}
/*++
Function Description:
Removes all L"\ " and replaces with L"\".
Arguments:
IN pwszOldPath - String to scan
OUT pwszNewPath - Resultant string
Return Value:
None
History:
01/10/2000 linstev Updated
--*/
VOID
MassagePathW(
LPCWSTR pwszOldPath,
LPWSTR pwszNewPath
)
{
PWCHAR pwszTempBuffer;
PWCHAR pwszPointer;
LONG nOldPos, nNewPos, nOldStringLen;
BOOL bAtSeparator = TRUE;
nOldStringLen = wcslen(pwszOldPath);
pwszTempBuffer = (PWCHAR) LocalAlloc(LPTR, (nOldStringLen + 1) * sizeof(WCHAR));
if (pwszTempBuffer == NULL)
{
// Alloc failed, do nothing.
wcscpy(pwszNewPath, pwszOldPath);
return;
}
pwszPointer = pwszTempBuffer;
nNewPos = nOldStringLen;
for (nOldPos = nOldStringLen - 1; nOldPos >= 0; nOldPos--)
{
if (pwszOldPath[ nOldPos ] == L'\\')
{
bAtSeparator = TRUE;
}
else
{
if (pwszOldPath[nOldPos] == L' ' && bAtSeparator)
{
DPF(eDbgLevelError, "[MassagePathW] Found \"\\ \" in filename. Removing space.\n");
continue;
}
else
{
bAtSeparator = FALSE;
}
}
pwszPointer[--nNewPos] = pwszOldPath[nOldPos];
}
pwszPointer += nNewPos;
wcscpy(pwszNewPath, pwszPointer);
LocalFree(pwszTempBuffer);
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
HANDLE
APIHook_CreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
)
{
LPSTR lpNewFileName = NULL;
HANDLE hResult = NULL;
lpNewFileName = (LPSTR) malloc(strlen(lpFileName) + 1);
if (lpNewFileName != NULL)
{
MassagePathA(lpFileName, lpNewFileName);
hResult = LOOKUP_APIHOOK(CreateFileA)(
lpNewFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
}
free(lpNewFileName);
return hResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
HANDLE
APIHook_CreateFileW(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
)
{
LPWSTR lpNewFileName = NULL;
HANDLE hResult = NULL;
lpNewFileName = (LPWSTR) malloc( (wcslen(lpFileName) + 1) * sizeof(WCHAR));
if (lpNewFileName != NULL)
{
MassagePathW(lpFileName, lpNewFileName);
hResult = LOOKUP_APIHOOK(CreateFileW)(
lpNewFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile);
}
free(lpNewFileName);
return hResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
DWORD
APIHook_GetFileAttributesA(LPCSTR lpFileName)
{
LPSTR lpNewFileName = NULL;
DWORD dwResult = -1;
lpNewFileName = (LPSTR) malloc(strlen(lpFileName) + 1);
if (lpNewFileName != NULL)
{
MassagePathA(lpFileName, lpNewFileName);
dwResult = LOOKUP_APIHOOK(GetFileAttributesA)(lpNewFileName);
}
free(lpNewFileName);
return dwResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
DWORD
APIHook_GetFileAttributesW(LPCWSTR lpFileName)
{
LPWSTR lpNewFileName = NULL;
DWORD dwResult = -1;
lpNewFileName = (LPWSTR) malloc( (wcslen(lpFileName) + 1) * sizeof(WCHAR));
if (lpNewFileName != NULL)
{
MassagePathW(lpFileName, lpNewFileName);
dwResult = LOOKUP_APIHOOK(GetFileAttributesW)(lpNewFileName);
}
free(lpNewFileName);
return dwResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_GetFileAttributesExA(
LPCSTR lpFileName,
GET_FILEEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFileInformation
)
{
LPSTR lpNewFileName = NULL;
BOOL bResult = FALSE;
lpNewFileName = (LPSTR)malloc(strlen(lpFileName) + 1);
if (lpNewFileName != NULL)
{
MassagePathA(lpFileName, lpNewFileName);
bResult = LOOKUP_APIHOOK(GetFileAttributesExA)(
lpNewFileName,
fInfoLevelId,
lpFileInformation);
}
free( lpNewFileName );
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_GetFileAttributesExW(
LPCWSTR lpFileName,
GET_FILEEX_INFO_LEVELS fInfoLevelId,
LPVOID lpFileInformation
)
{
LPWSTR lpNewFileName = NULL;
BOOL bResult = FALSE;
lpNewFileName = (LPWSTR) malloc( (wcslen(lpFileName) + 1) * sizeof(WCHAR));
if (lpNewFileName != NULL)
{
MassagePathW(lpFileName, lpNewFileName);
bResult = LOOKUP_APIHOOK(GetFileAttributesExW)(
lpNewFileName,
fInfoLevelId,
lpFileInformation);
}
free(lpNewFileName);
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_DeleteFileA(LPCSTR lpFileName)
{
LPSTR lpNewFileName = NULL;
BOOL bResult = FALSE;
lpNewFileName = (LPSTR) malloc(strlen(lpFileName) + 1);
if (lpNewFileName != NULL)
{
MassagePathA(lpFileName, lpNewFileName);
bResult = LOOKUP_APIHOOK(DeleteFileA)(lpNewFileName);
}
free(lpNewFileName);
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_DeleteFileW(LPCWSTR lpFileName)
{
LPWSTR lpNewFileName = NULL;
BOOL bResult = FALSE;
lpNewFileName = (LPWSTR) malloc((wcslen(lpFileName) + 1) * sizeof(WCHAR));
if (lpNewFileName != NULL)
{
MassagePathW(lpFileName, lpNewFileName);
bResult = LOOKUP_APIHOOK(DeleteFileW)(lpNewFileName);
}
free(lpNewFileName);
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_RemoveDirectoryA(LPCSTR lpFileName)
{
LPSTR lpNewFileName = NULL;
BOOL bResult = FALSE;
lpNewFileName = (LPSTR)malloc( strlen( lpFileName ) + 1);
if (lpNewFileName != NULL)
{
MassagePathA(lpFileName, lpNewFileName);
bResult = LOOKUP_APIHOOK(RemoveDirectoryA)(lpNewFileName);
}
free(lpNewFileName);
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_RemoveDirectoryW(LPCWSTR lpFileName)
{
LPWSTR lpNewFileName = NULL;
BOOL bResult = FALSE;
lpNewFileName = (LPWSTR)malloc( (wcslen(lpFileName) + 1) * sizeof(WCHAR));
if (lpNewFileName != NULL)
{
MassagePathW(lpFileName, lpNewFileName);
bResult = LOOKUP_APIHOOK(RemoveDirectoryW)(lpNewFileName);
}
free(lpNewFileName);
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_MoveFileA(
LPCSTR lpExistingFileName,
LPCSTR lpNewFileName
)
{
LPSTR lpNewNewFileName = NULL;
LPSTR lpNewExistingFileName = NULL;
BOOL bResult = FALSE;
lpNewNewFileName = (LPSTR) malloc( strlen(lpNewFileName) + 1);
if (lpNewNewFileName != NULL)
{
lpNewExistingFileName = (LPSTR) malloc( strlen(lpExistingFileName) + 1);
if (lpNewNewFileName != NULL)
{
MassagePathA(lpNewFileName, lpNewNewFileName);
MassagePathA(lpExistingFileName, lpNewExistingFileName);
bResult = LOOKUP_APIHOOK(MoveFileA)(
lpNewNewFileName,
lpNewExistingFileName);
}
}
free(lpNewNewFileName);
free(lpNewExistingFileName);
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_MoveFileW(
LPCWSTR lpExistingFileName,
LPCWSTR lpNewFileName
)
{
LPWSTR lpNewNewFileName = NULL;
LPWSTR lpNewExistingFileName = NULL;
BOOL bResult = FALSE;
lpNewNewFileName = (LPWSTR) malloc((wcslen(lpNewFileName) + 1) * sizeof(WCHAR));
if (lpNewNewFileName != NULL)
{
lpNewExistingFileName = (LPWSTR) malloc((wcslen(lpExistingFileName) + 1) * sizeof(WCHAR));
if (lpNewExistingFileName != NULL)
{
MassagePathW(lpNewFileName, lpNewNewFileName);
MassagePathW(lpExistingFileName, lpNewExistingFileName);
bResult = LOOKUP_APIHOOK(MoveFileW)(
lpNewNewFileName,
lpNewExistingFileName);
}
}
free(lpNewNewFileName);
free(lpNewExistingFileName);
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_MoveFileExA(
LPCSTR lpExistingFileName,
LPCSTR lpNewFileName,
DWORD dwFlags
)
{
LPSTR lpNewNewFileName = NULL;
LPSTR lpNewExistingFileName = NULL;
BOOL bResult = FALSE;
lpNewNewFileName = (LPSTR)malloc( strlen(lpNewFileName) + 1);
if (lpNewNewFileName != NULL)
{
lpNewExistingFileName = (LPSTR)malloc( strlen(lpExistingFileName) + 1);
if (lpNewExistingFileName != NULL)
{
MassagePathA(lpNewFileName, lpNewNewFileName);
MassagePathA(lpExistingFileName, lpNewExistingFileName);
bResult = LOOKUP_APIHOOK(MoveFileExA)(
lpNewNewFileName,
lpNewExistingFileName,
dwFlags);
}
}
free(lpNewNewFileName);
free(lpNewExistingFileName);
return bResult;
}
/*++
This stub searches pathnames and changes "\ " to "\" prior to OEM call
--*/
BOOL
APIHook_MoveFileExW(
LPCWSTR lpExistingFileName,
LPCWSTR lpNewFileName,
DWORD dwFlags
)
{
LPWSTR lpNewNewFileName = NULL;
LPWSTR lpNewExistingFileName = NULL;
BOOL bResult = FALSE;
lpNewNewFileName = (LPWSTR) malloc( (wcslen(lpNewFileName) + 1) * sizeof(WCHAR));
if (lpNewNewFileName != NULL)
{
lpNewExistingFileName = (LPWSTR) malloc((wcslen(lpExistingFileName) + 1) * sizeof(WCHAR));
if (lpNewExistingFileName != NULL)
{
MassagePathW(lpNewFileName, lpNewNewFileName);
MassagePathW(lpExistingFileName, lpNewExistingFileName);
bResult = LOOKUP_APIHOOK(MoveFileExW)(
lpNewNewFileName,
lpNewExistingFileName,
dwFlags);
}
}
free(lpNewNewFileName);
free(lpNewExistingFileName);
return bResult;
}
/*++
Register hooked functions
--*/
VOID
InitializeHooks(DWORD fdwReason)
{
if (fdwReason != DLL_PROCESS_ATTACH) return;
INIT_HOOKS(APIHOOK_Count);
DECLARE_APIHOOK(KERNEL32.DLL, CreateFileA);
DECLARE_APIHOOK(KERNEL32.DLL, CreateFileW);
DECLARE_APIHOOK(KERNEL32.DLL, GetFileAttributesA);
DECLARE_APIHOOK(KERNEL32.DLL, GetFileAttributesW);
DECLARE_APIHOOK(KERNEL32.DLL, GetFileAttributesExA);
DECLARE_APIHOOK(KERNEL32.DLL, GetFileAttributesExW);
DECLARE_APIHOOK(KERNEL32.DLL, DeleteFileA);
DECLARE_APIHOOK(KERNEL32.DLL, DeleteFileW);
DECLARE_APIHOOK(KERNEL32.DLL, RemoveDirectoryA);
DECLARE_APIHOOK(KERNEL32.DLL, RemoveDirectoryW);
DECLARE_APIHOOK(KERNEL32.DLL, MoveFileA);
DECLARE_APIHOOK(KERNEL32.DLL, MoveFileW);
DECLARE_APIHOOK(KERNEL32.DLL, MoveFileExA);
DECLARE_APIHOOK(KERNEL32.DLL, MoveFileExW);
}
IMPLEMENT_SHIM_END
#include "ShimHookMacro.h"