644 lines
14 KiB
C++
644 lines
14 KiB
C++
/*++
|
|
|
|
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"
|
|
|