diff --git a/src/Winfile.vcxproj b/src/Winfile.vcxproj
index 8765768e..03b7abee 100644
--- a/src/Winfile.vcxproj
+++ b/src/Winfile.vcxproj
@@ -400,6 +400,7 @@
+
diff --git a/src/lfn.c b/src/lfn.c
index 988e2cb3..b8fee4b9 100644
--- a/src/lfn.c
+++ b/src/lfn.c
@@ -42,18 +42,15 @@ WFFindFirst(
// and ORDINARY files too.
//
- PVOID oldValue;
- Wow64DisableWow64FsRedirection(&oldValue);
-
if ((dwAttrFilter & ~(ATTR_DIR | ATTR_HS)) == 0)
{
// directories only (hidden or not)
- lpFind->hFindFile = FindFirstFileEx(lpName, FindExInfoStandard, &lpFind->fd, FindExSearchLimitToDirectories, NULL, 0);
+ lpFind->hFindFile = WFWowFindFirstFileEx(lpName, FindExInfoStandard, &lpFind->fd, FindExSearchLimitToDirectories, NULL, 0);
}
else
{
// normal case: directories and files
- lpFind->hFindFile = FindFirstFile(lpName, &lpFind->fd);
+ lpFind->hFindFile = WFWowFindFirstFile(lpName, &lpFind->fd);
}
if (lpFind->hFindFile == INVALID_HANDLE_VALUE) {
@@ -68,8 +65,6 @@ WFFindFirst(
lpFind->fd.dwFileAttributes &= ATTR_USED;
- Wow64RevertWow64FsRedirection(oldValue);
-
//
// Keep track of length
//
@@ -116,10 +111,7 @@ WFFindFirst(
BOOL
WFFindNext(LPLFNDTA lpFind)
{
- PVOID oldValue;
- Wow64DisableWow64FsRedirection(&oldValue);
-
- while (FindNextFile(lpFind->hFindFile, &lpFind->fd)) {
+ while (WFWowFindNextFile(lpFind->hFindFile, &lpFind->fd)) {
lpFind->fd.dwFileAttributes &= ATTR_USED;
@@ -154,15 +146,12 @@ WFFindNext(LPLFNDTA lpFind)
}
}
- Wow64RevertWow64FsRedirection(oldValue);
-
lpFind->err = 0;
return TRUE;
}
lpFind->err = GetLastError();
- Wow64RevertWow64FsRedirection(oldValue);
return(FALSE);
}
@@ -210,7 +199,7 @@ WFFindClose(LPLFNDTA lpFind)
BOOL
WFIsDir(LPTSTR lpDir)
{
- DWORD attr = GetFileAttributes(lpDir);
+ DWORD attr = WFWowGetFileAttributes(lpDir);
if (attr == INVALID_FILE_ATTRIBUTES)
return FALSE;
@@ -493,7 +482,7 @@ WFCopyIfSymlink(LPTSTR pszFrom, LPTSTR pszTo, DWORD dwFlags, DWORD dwNotificatio
WCHAR szReparseDest[2 * MAXPATHLEN];
DWORD dwReparseTag = DecodeReparsePoint(pszFrom, szReparseDest, 2 * MAXPATHLEN);
if (IO_REPARSE_TAG_SYMLINK == dwReparseTag) {
- CreateSymbolicLink(pszTo, szReparseDest, dwFlags);
+ WFWowCreateSymbolicLink(pszTo, szReparseDest, dwFlags);
dwRet = GetLastError();
if (ERROR_SUCCESS == dwRet)
ChangeFileSystem(dwNotification, pszTo, NULL);
@@ -517,7 +506,7 @@ WFCopy(LPTSTR pszFrom, LPTSTR pszTo)
Notify(hdlgProgress, IDS_COPYINGMSG, pszFrom, pszTo);
BOOL bCancel = FALSE;
- if (CopyFileEx(pszFrom, pszTo, NULL, NULL, &bCancel, COPY_FILE_COPY_SYMLINK)) {
+ if (WFWowCopyFileEx(pszFrom, pszTo, NULL, NULL, &bCancel, COPY_FILE_COPY_SYMLINK)) {
ChangeFileSystem(FSC_CREATE, pszTo, NULL);
dwRet = 0;
}
@@ -535,7 +524,7 @@ WFCopy(LPTSTR pszFrom, LPTSTR pszTo)
//
lstrcpy(szTemp, pszTo);
RemoveLast(szTemp);
- if (CopyFile(pszFrom, szTemp, FALSE)) {
+ if (WFWowCopyFile(pszFrom, szTemp, FALSE)) {
ChangeFileSystem(FSC_CREATE, szTemp, NULL);
dwRet = 0;
}
diff --git a/src/treectl.c b/src/treectl.c
index d3fe2de5..c883a5ea 100644
--- a/src/treectl.c
+++ b/src/treectl.c
@@ -160,7 +160,7 @@ GetTreePath(PDNODE pNode, register LPTSTR szDest)
VOID
SetNodeAttribs(PDNODE pNode, LPTSTR szPath)
{
- pNode->dwAttribs = GetFileAttributes(szPath);
+ pNode->dwAttribs = WFWowGetFileAttributes(szPath);
if (INVALID_FILE_ATTRIBUTES == pNode->dwAttribs) {
pNode->dwAttribs = 0;
}
diff --git a/src/wfcomman.c b/src/wfcomman.c
index 25704652..fe896be1 100644
--- a/src/wfcomman.c
+++ b/src/wfcomman.c
@@ -308,7 +308,7 @@ ChangeFileSystem(
// Are we renaming a directory?
lstrcpy(szTemp, szTo);
- if (GetFileAttributes(szTemp) & ATTR_DIR)
+ if (WFWowGetFileAttributes(szTemp) & ATTR_DIR)
{
for (hwnd = GetWindow(hwndMDIClient, GW_CHILD);
hwnd;
@@ -1375,7 +1375,7 @@ AppCommandProc(register DWORD id)
sei.lpDirectory = szPath;
}
- ShellExecuteEx(&sei);
+ WFWowShellExecuteEx(&sei);
}
else if (count > 1)
DialogBox(hAppInstance, (LPTSTR) MAKEINTRESOURCE(MULTIPLEATTRIBSDLG), hwndFrame, AttribsDlgProc);
diff --git a/src/wfcopy.c b/src/wfcopy.c
index cdc289d4..988dab77 100644
--- a/src/wfcopy.c
+++ b/src/wfcopy.c
@@ -2452,7 +2452,7 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
lstrcat(szDestAlt, szExtension);
// We only do a one level '- Copy' postfixing, and do intentionally not go for a '- Copy (n)' postfix
- if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(szDestAlt)) {
+ if (INVALID_FILE_ATTRIBUTES == WFWowGetFileAttributes(szDestAlt)) {
lstrcpy(szDest, szDestAlt);
bSameFile = FALSE;
} else {
@@ -2512,7 +2512,7 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
//
// Save the attributes, since ConfirmDialog may change them.
//
- dwAttr = GetFileAttributes(szDest);
+ dwAttr = WFWowGetFileAttributes(szDest);
// we need to check if we are trying to copy a file
// over a directory and give a reasonable error message
@@ -2600,7 +2600,7 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
//
if (ret)
{
- SetFileAttributes(szDest, dwAttr);
+ WFWowSetFileAttributes(szDest, dwAttr);
}
}
@@ -2809,7 +2809,7 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
//
// Tuck away the attribs in case we fail.
//
- dwAttr = GetFileAttributes(szSource);
+ dwAttr = WFWowGetFileAttributes(szSource);
WFSetAttr(szSource, FILE_ATTRIBUTE_NORMAL);
@@ -2880,8 +2880,8 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
// NOTE: Must first make sure the attributes are clear so that
// the delete will always succeed.
//
- SetFileAttributes(szDest, FILE_ATTRIBUTE_NORMAL);
- DeleteFile(szDest);
+ WFWowSetFileAttributes(szDest, FILE_ATTRIBUTE_NORMAL);
+ WFWowDeleteFile(szDest);
//
// Show retry popup.
@@ -2955,7 +2955,7 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
//
// Save the attributes, since ConfirmDialog may change them.
//
- dwAttr = GetFileAttributes(szSource);
+ dwAttr = WFWowGetFileAttributes(szSource);
// Confirm the rename
@@ -3066,7 +3066,7 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
// Reset the attributes on the source file, since they
// may have been changed by ConfirmDialog.
//
- SetFileAttributes(szSource, dwAttr);
+ WFWowSetFileAttributes(szSource, dwAttr);
}
if (pCopyInfo->bUserAbort)
@@ -3088,7 +3088,7 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
//
// Save the attributes, since ConfirmDialog may change them.
//
- dwAttr = GetFileAttributes(szSource);
+ dwAttr = WFWowGetFileAttributes(szSource);
// Confirm the delete first
@@ -3131,7 +3131,7 @@ WFMoveCopyDriverThread(LPVOID lpParameter)
//
if (ret)
{
- SetFileAttributes(szSource, dwAttr);
+ WFWowSetFileAttributes(szSource, dwAttr);
}
break;
@@ -3387,7 +3387,7 @@ DMMoveCopyHelper(
DWORD
FileRemove(LPTSTR pSpec)
{
- if (DeleteFile(pSpec))
+ if (WFWowDeleteFile(pSpec))
return (DWORD)0;
else
return GetLastError();
@@ -3404,7 +3404,7 @@ FileMove(LPTSTR pFrom, LPTSTR pTo, PBOOL pbErrorOnDest, BOOL bSilent)
*pbErrorOnDest = FALSE;
TryAgain:
- if (MoveFile((LPTSTR)pFrom, (LPTSTR)pTo))
+ if (WFWowMoveFile((LPTSTR)pFrom, (LPTSTR)pTo))
result = 0;
else
result = GetLastError();
diff --git a/src/wfdirrd.c b/src/wfdirrd.c
index c4274c1a..da74adc1 100644
--- a/src/wfdirrd.c
+++ b/src/wfdirrd.c
@@ -754,7 +754,7 @@ CreateDTABlockWorker(
// Check if it is a Reparse Point
lpTemp[0] = '\0';
- DWORD attr = GetFileAttributes(szPath);
+ DWORD attr = WFWowGetFileAttributes(szPath);
lpTemp[0] = CHAR_BACKSLASH;
if (attr & ATTR_REPARSE_POINT) {
// For dead Reparse Points just tell that the directory could not be read
@@ -1168,7 +1168,7 @@ DWORD DecodeReparsePoint(LPCWSTR szFullPath, LPWSTR szDest, DWORD cwcDest)
DWORD reparseTag;
BOOL bRP;
- hFile = CreateFile(szFullPath, FILE_READ_EA, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
+ hFile = WFWowCreateFile(szFullPath, FILE_READ_EA, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return IO_REPARSE_TAG_RESERVED_ZERO;
diff --git a/src/wfdlgs2.c b/src/wfdlgs2.c
index d32676cf..3f065b12 100644
--- a/src/wfdlgs2.c
+++ b/src/wfdlgs2.c
@@ -589,7 +589,7 @@ JAPANEND
QualifyPath(szTemp);
// Is this a file or directory
- if (GetFileAttributes(szTemp) & FILE_ATTRIBUTE_DIRECTORY) {
+ if (WFWowGetFileAttributes(szTemp) & FILE_ATTRIBUTE_DIRECTORY) {
if (szTo[ich2 - 1] == '\"')
ich2--;
}
@@ -1402,7 +1402,7 @@ InitPropertiesDialog(
{
if ((bFileCompression) && (dwAttribsOn & ATTR_COMPRESSED))
{
- qCSize.LowPart = GetCompressedFileSize(szName, &(qCSize.HighPart));
+ qCSize.LowPart = WFWowGetCompressedFileSize(szName, &(qCSize.HighPart));
PutSize(&qCSize, szNum);
wsprintf(szTemp, szSBytes, szNum);
SetDlgItemText(hDlg, IDD_CSIZE, szTemp);
@@ -1778,7 +1778,7 @@ AttribsDlgProc(register HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam)
QualifyPath(szName);
- dwAttribs = GetFileAttributes(szName);
+ dwAttribs = WFWowGetFileAttributes(szName);
if (dwAttribs == INVALID_FILE_ATTRIBUTES)
goto AttributeError;
diff --git a/src/wfdrop.c b/src/wfdrop.c
index 0d0829ee..1dfdc393 100644
--- a/src/wfdrop.c
+++ b/src/wfdrop.c
@@ -187,7 +187,7 @@ static HRESULT StreamToFile(IStream *stream, TCHAR *szFile)
HRESULT hr;
HANDLE hFile;
- hFile = CreateFile( szFile,
+ hFile = WFWowCreateFile( szFile,
FILE_READ_DATA | FILE_WRITE_DATA,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
@@ -210,7 +210,7 @@ static HRESULT StreamToFile(IStream *stream, TCHAR *szFile)
} while (S_OK == hr && bytes_written != 0);
CloseHandle(hFile);
if (FAILED(hr))
- DeleteFile(szFile);
+ WFWowDeleteFile(szFile);
else
hr = S_OK;
}
diff --git a/src/wffile.c b/src/wffile.c
index 5ca4e70f..d8e9374f 100644
--- a/src/wffile.c
+++ b/src/wffile.c
@@ -121,8 +121,8 @@ DWORD MKDir(
DWORD dwErr = ERROR_SUCCESS;
if ((pSrc && *pSrc) ?
- CreateDirectoryEx(pSrc, pName, NULL) :
- CreateDirectory(pName, NULL)) {
+ WFWowCreateDirectoryEx(pSrc, pName, NULL) :
+ WFWowCreateDirectory(pName, NULL)) {
ChangeFileSystem(FSC_MKDIR, pName, NULL);
} else {
dwErr = GetLastError();
@@ -149,7 +149,7 @@ DWORD RMDir(
{
DWORD dwErr = 0;
- if (RemoveDirectory(pName))
+ if (WFWowRemoveDirectory(pName))
{
ChangeFileSystem(FSC_RMDIR, pName, NULL);
}
@@ -182,7 +182,7 @@ BOOL WFSetAttr(
//
dwAttr = dwAttr & ~(ATTR_COMPRESSED | ATTR_ENCRYPTED);
- bRet = SetFileAttributes(lpFile, dwAttr);
+ bRet = WFWowSetFileAttributes(lpFile, dwAttr);
if (bRet)
{
@@ -744,7 +744,7 @@ BOOL WFCheckCompress(
//
// Get the file attributes.
//
- dwAttribs = GetFileAttributes(szNameSpec);
+ dwAttribs = WFWowGetFileAttributes(szNameSpec);
//
// Determine if ATTR_COMPRESSED is changing state.
@@ -1054,8 +1054,8 @@ BOOL CompressFile(
//
FileSize.LowPart = FindData->nFileSizeLow;
FileSize.HighPart = FindData->nFileSizeHigh;
- CompressedSize.LowPart = GetCompressedFileSize( FileSpec,
- &(CompressedSize.HighPart) );
+ CompressedSize.LowPart = WFWowGetCompressedFileSize( FileSpec,
+ &(CompressedSize.HighPart) );
//
// Increment the running total.
@@ -1187,7 +1187,7 @@ BOOL WFDoCompress(
//
lstrcpy(DirectorySpecEnd, FileSpec);
- if ((FindHandle = FindFirstFile(DirectorySpec, &FindData)) != INVALID_HANDLE_VALUE)
+ if ((FindHandle = WFWowFindFirstFile(DirectorySpec, &FindData)) != INVALID_HANDLE_VALUE)
{
do
{
@@ -1232,7 +1232,7 @@ BOOL WFDoCompress(
//
lstrcpy(DirectorySpecEnd, FindData.cFileName);
- if (GetFileAttributes(DirectorySpec) & ATTR_COMPRESSED)
+ if (WFWowGetFileAttributes(DirectorySpec) & ATTR_COMPRESSED)
{
//
// Already compressed, so just get the next file.
@@ -1294,7 +1294,7 @@ BOOL WFDoCompress(
}
}
- } while (FindNextFile(FindHandle, &FindData));
+ } while (WFWowFindNextFile(FindHandle, &FindData));
FindClose(FindHandle);
@@ -1312,7 +1312,7 @@ BOOL WFDoCompress(
//
lstrcpy(DirectorySpecEnd, SZ_STAR);
- if ((FindHandle = FindFirstFile(DirectorySpec, &FindData)) != INVALID_HANDLE_VALUE)
+ if ((FindHandle = WFWowFindFirstFile(DirectorySpec, &FindData)) != INVALID_HANDLE_VALUE)
{
do
{
@@ -1344,7 +1344,7 @@ BOOL WFDoCompress(
}
}
- } while (FindNextFile(FindHandle, &FindData));
+ } while (WFWowFindNextFile(FindHandle, &FindData));
FindClose(FindHandle);
}
@@ -1513,7 +1513,7 @@ BOOL WFDoUncompress(
//
lstrcpy(DirectorySpecEnd, FileSpec);
- if ((FindHandle = FindFirstFile(DirectorySpec, &FindData)) != INVALID_HANDLE_VALUE)
+ if ((FindHandle = WFWowFindFirstFile(DirectorySpec, &FindData)) != INVALID_HANDLE_VALUE)
{
do
{
@@ -1541,7 +1541,7 @@ BOOL WFDoUncompress(
//
lstrcpy(DirectorySpecEnd, FindData.cFileName);
- if (!(GetFileAttributes(DirectorySpec) & ATTR_COMPRESSED))
+ if (!(WFWowGetFileAttributes(DirectorySpec) & ATTR_COMPRESSED))
{
//
// Already uncompressed, so get the next file.
@@ -1603,7 +1603,7 @@ BOOL WFDoUncompress(
}
}
- } while (FindNextFile(FindHandle, &FindData));
+ } while (WFWowFindNextFile(FindHandle, &FindData));
FindClose(FindHandle);
@@ -1621,7 +1621,7 @@ BOOL WFDoUncompress(
//
lstrcpy(DirectorySpecEnd, SZ_STAR);
- if ((FindHandle = FindFirstFile(DirectorySpec, &FindData)) != INVALID_HANDLE_VALUE)
+ if ((FindHandle = WFWowFindFirstFile(DirectorySpec, &FindData)) != INVALID_HANDLE_VALUE)
{
do
{
@@ -1653,7 +1653,7 @@ BOOL WFDoUncompress(
}
}
- } while (FindNextFile(FindHandle, &FindData));
+ } while (WFWowFindNextFile(FindHandle, &FindData));
FindClose(FindHandle);
}
@@ -1900,13 +1900,13 @@ BOOL OpenFileForCompress(
//
// Try to open the file - READ_DATA | WRITE_DATA.
//
- if ((*phFile = CreateFile( szFile,
- FILE_READ_DATA | FILE_WRITE_DATA,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_SEQUENTIAL_SCAN,
- NULL )) != INVALID_HANDLE_VALUE)
+ if ((*phFile = WFWowCreateFile( szFile,
+ FILE_READ_DATA | FILE_WRITE_DATA,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_SEQUENTIAL_SCAN,
+ NULL )) != INVALID_HANDLE_VALUE)
{
//
// Successfully opened the file.
@@ -1922,13 +1922,13 @@ BOOL OpenFileForCompress(
//
// Try to open the file - READ_ATTRIBUTES | WRITE_ATTRIBUTES.
//
- if ((hAttr = CreateFile( szFile,
- FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_SEQUENTIAL_SCAN,
- NULL )) == INVALID_HANDLE_VALUE)
+ if ((hAttr = WFWowCreateFile( szFile,
+ FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_SEQUENTIAL_SCAN,
+ NULL )) == INVALID_HANDLE_VALUE)
{
return (FALSE);
}
@@ -1951,7 +1951,7 @@ BOOL OpenFileForCompress(
// Turn OFF the READONLY attribute.
//
fi.dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
- if (!SetFileAttributes(szFile, fi.dwFileAttributes))
+ if (!WFWowSetFileAttributes(szFile, fi.dwFileAttributes))
{
CloseHandle(hAttr);
return (FALSE);
@@ -1960,13 +1960,13 @@ BOOL OpenFileForCompress(
//
// Try again to open the file - READ_DATA | WRITE_DATA.
//
- *phFile = CreateFile( szFile,
- FILE_READ_DATA | FILE_WRITE_DATA,
- FILE_SHARE_READ | FILE_SHARE_WRITE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_SEQUENTIAL_SCAN,
- NULL );
+ *phFile = WFWowCreateFile( szFile,
+ FILE_READ_DATA | FILE_WRITE_DATA,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_SEQUENTIAL_SCAN,
+ NULL );
//
// Close the file handle opened for READ_ATTRIBUTE | WRITE_ATTRIBUTE.
@@ -1986,7 +1986,7 @@ BOOL OpenFileForCompress(
// Turn the READONLY attribute back ON.
//
fi.dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
- if (!SetFileAttributes(szFile, fi.dwFileAttributes))
+ if (!WFWowSetFileAttributes(szFile, fi.dwFileAttributes))
{
CloseHandle(*phFile);
*phFile = INVALID_HANDLE_VALUE;
diff --git a/src/wfinit.c b/src/wfinit.c
index 5ea830cf..99318954 100644
--- a/src/wfinit.c
+++ b/src/wfinit.c
@@ -987,6 +987,8 @@ InitFileManager(
SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);
+ WFWowInitialize();
+
InitializeCriticalSection(&CriticalSectionPath);
// ProfStart();
@@ -1004,7 +1006,7 @@ InitFileManager(
dwRetval = GetEnvironmentVariable(TEXT("APPDATA"), szBuffer, MAXPATHLEN);
if (dwRetval > 0 && dwRetval <= (DWORD)(MAXPATHLEN - lstrlen(szRoamINIPath) - 1 - lstrlen(szBaseINIFile) - 1)) {
wsprintf(szTheINIFile, TEXT("%s%s"), szBuffer, szRoamINIPath);
- if (CreateDirectory(szTheINIFile, NULL) || GetLastError() == ERROR_ALREADY_EXISTS) {
+ if (WFWowCreateDirectory(szTheINIFile, NULL) || GetLastError() == ERROR_ALREADY_EXISTS) {
wsprintf(szTheINIFile, TEXT("%s%s\\%s"), szBuffer, szRoamINIPath, szBaseINIFile);
}
else {
diff --git a/src/wfprint.c b/src/wfprint.c
index 59222198..6e89f4b9 100644
--- a/src/wfprint.c
+++ b/src/wfprint.c
@@ -40,7 +40,7 @@ PrintFile(HWND hwnd, LPTSTR szFile)
// open the object
//
SetErrorMode(0);
- ret = (DWORD_PTR)ShellExecute(hwnd, L"print", szFile, szNULL, szDir, SW_SHOWNORMAL);
+ ret = (DWORD_PTR)WFWowShellExecute(hwnd, L"print", szFile, szNULL, szDir, SW_SHOWNORMAL);
SetErrorMode(1);
switch (ret) {
diff --git a/src/wfutil.c b/src/wfutil.c
index 0f7439f8..dbb03db3 100644
--- a/src/wfutil.c
+++ b/src/wfutil.c
@@ -242,7 +242,7 @@ BOOL GetDriveDirectory(INT iDrive, LPTSTR pszDir)
drvstr[1] = ('\0');
}
- if (GetFileAttributes(drvstr) == INVALID_FILE_ATTRIBUTES)
+ if (WFWowGetFileAttributes(drvstr) == INVALID_FILE_ATTRIBUTES)
return FALSE;
// if (!CheckDirExists(drvstr))
@@ -1447,7 +1447,7 @@ ExecProgram(LPTSTR lpPath, LPTSTR lpParms, LPTSTR lpDir, BOOL bLoadIt, BOOL bRun
lpszTitle++;
SetErrorMode(0);
- ret = (DWORD_PTR) ShellExecute(hwndFrame, bRunAs ? L"runas" : NULL, lpPath, lpParms, lpDir, bLoadIt ? SW_SHOWMINNOACTIVE : SW_SHOWNORMAL);
+ ret = (DWORD_PTR) WFWowShellExecute(hwndFrame, bRunAs ? L"runas" : NULL, lpPath, lpParms, lpDir, bLoadIt ? SW_SHOWMINNOACTIVE : SW_SHOWNORMAL);
SetErrorMode(1);
diff --git a/src/wfwow.c b/src/wfwow.c
new file mode 100644
index 00000000..dd11d5d1
--- /dev/null
+++ b/src/wfwow.c
@@ -0,0 +1,338 @@
+/********************************************************************
+
+ wfwow.c
+
+ Windows File Manager Wow64 wrapper routines
+
+ Since the file manager needs to display files as they exist on
+ disk, Win32 functions querying or manipulating files need to
+ suppress Wow64 redirection. Any Win32 API that consumes a file
+ path should be wrapped within this file.
+
+ Copyright (c) Microsoft Corporation. All rights reserved.
+ Licensed under the MIT License.
+
+********************************************************************/
+
+#include "winfile.h"
+#include "lfn.h"
+
+#define KERNEL32_DLL TEXT("kernel32.dll")
+BOOL (CALLBACK *lpfnWow64DisableWow64FsRedirection)(PVOID *);
+BOOL (CALLBACK *lpfnWow64RevertWow64FsRedirection)(PVOID);
+
+#define KERNEL32_Wow64DisableWow64FsRedirection "Wow64DisableWow64FsRedirection"
+#define KERNEL32_Wow64RevertWow64FsRedirection "Wow64RevertWow64FsRedirection"
+
+#define Wow64DisableWow64FsRedirection (*lpfnWow64DisableWow64FsRedirection)
+#define Wow64RevertWow64FsRedirection (*lpfnWow64RevertWow64FsRedirection)
+
+
+VOID
+WFWowInitialize()
+{
+ HANDLE hKernel32;
+ hKernel32 = GetModuleHandle(KERNEL32_DLL);
+
+ lpfnWow64DisableWow64FsRedirection = (PVOID)GetProcAddress(hKernel32, KERNEL32_Wow64DisableWow64FsRedirection);
+ lpfnWow64RevertWow64FsRedirection = (PVOID)GetProcAddress(hKernel32, KERNEL32_Wow64RevertWow64FsRedirection);
+}
+
+typedef struct _WF_WOW_STATE {
+ PVOID OldValue;
+ BOOLEAN RevertRequired;
+} WF_WOW_STATE, *PWF_WOW_STATE;
+
+VOID
+WFWowDisableRedirection(PWF_WOW_STATE State)
+{
+ State->RevertRequired = FALSE;
+ if (lpfnWow64DisableWow64FsRedirection != NULL) {
+ if (Wow64DisableWow64FsRedirection(&State->OldValue)) {
+ State->RevertRequired = TRUE;
+ }
+ }
+}
+
+VOID
+WFWowRevertRedirection(PWF_WOW_STATE State)
+{
+ if (State->RevertRequired &&
+ lpfnWow64RevertWow64FsRedirection != NULL) {
+
+ Wow64RevertWow64FsRedirection(State->OldValue);
+ }
+}
+
+BOOL
+WFWowCopyFile(
+ LPCWSTR lpExistingFileName,
+ LPCWSTR lpNewFileName,
+ BOOL bFailIfExists
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = CopyFile(lpExistingFileName, lpNewFileName, bFailIfExists);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowCopyFileEx(
+ LPCWSTR lpExistingFileName,
+ LPCWSTR lpNewFileName,
+ LPPROGRESS_ROUTINE lpProgressRoutine,
+ LPVOID lpData,
+ LPBOOL pbCancel,
+ DWORD dwCopyFlags
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = CopyFileEx(lpExistingFileName, lpNewFileName, lpProgressRoutine, lpData, pbCancel, dwCopyFlags);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowCreateDirectory(
+ LPCWSTR lpPathName,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = CreateDirectory(lpPathName, lpSecurityAttributes);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowCreateDirectoryEx(
+ LPCWSTR lpTemplateDirectory,
+ LPCWSTR lpNewDirectory,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = CreateDirectoryEx(lpTemplateDirectory, lpNewDirectory, lpSecurityAttributes);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+HANDLE
+WFWowCreateFile(
+ LPCWSTR lpFileName,
+ DWORD dwDesiredAccess,
+ DWORD dwShareMode,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
+ DWORD dwCreationDisposition,
+ DWORD dwFlagsAndAttributes,
+ HANDLE hTemplateFile
+ )
+{
+ WF_WOW_STATE WowState;
+ HANDLE Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOLEAN
+WFWowCreateSymbolicLink (
+ LPCWSTR lpSymlinkFileName,
+ LPCWSTR lpTargetFileName,
+ DWORD dwFlags
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOLEAN Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = CreateSymbolicLink(lpSymlinkFileName, lpTargetFileName, dwFlags);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowDeleteFile(
+ LPCWSTR lpFileName
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = DeleteFile(lpFileName);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+HANDLE
+WFWowFindFirstFile(
+ LPCWSTR lpFileName,
+ LPWIN32_FIND_DATAW lpFindFileData
+ )
+{
+ WF_WOW_STATE WowState;
+ HANDLE Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = FindFirstFile(lpFileName, lpFindFileData);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+HANDLE
+WFWowFindFirstFileEx(
+ LPCWSTR lpFileName,
+ FINDEX_INFO_LEVELS fInfoLevelId,
+ LPVOID lpFindFileData,
+ FINDEX_SEARCH_OPS fSearchOp,
+ LPVOID lpSearchFilter,
+ DWORD dwAdditionalFlags
+ )
+{
+ WF_WOW_STATE WowState;
+ HANDLE Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = FindFirstFileEx(lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowFindNextFile(
+ HANDLE hFindFile,
+ LPWIN32_FIND_DATAW lpFindFileData
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = FindNextFile(hFindFile, lpFindFileData);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+DWORD
+WFWowGetCompressedFileSize(
+ LPCWSTR lpFileName,
+ LPDWORD lpFileSizeHigh
+ )
+{
+ WF_WOW_STATE WowState;
+ DWORD Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = GetCompressedFileSize(lpFileName, lpFileSizeHigh);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+DWORD
+WFWowGetFileAttributes(
+ LPCWSTR lpFileName
+ )
+{
+ WF_WOW_STATE WowState;
+ DWORD Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = GetFileAttributes(lpFileName);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowMoveFile(
+ LPCWSTR lpExistingFileName,
+ LPCWSTR lpNewFileName
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = MoveFile(lpExistingFileName, lpNewFileName);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowRemoveDirectory(
+ LPCWSTR lpPathName
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = RemoveDirectory(lpPathName);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowSetFileAttributes(
+ LPCWSTR lpFileName,
+ DWORD dwFileAttributes
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = SetFileAttributes(lpFileName, dwFileAttributes);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+HINSTANCE
+WFWowShellExecute(
+ HWND hwnd,
+ LPCWSTR lpOperation,
+ LPCWSTR lpFile,
+ LPCWSTR lpParameters,
+ LPCWSTR lpDirectory,
+ INT nShowCmd
+ )
+{
+ WF_WOW_STATE WowState;
+ HINSTANCE Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = ShellExecute(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+BOOL
+WFWowShellExecuteEx(
+ SHELLEXECUTEINFOW *pExecInfo
+ )
+{
+ WF_WOW_STATE WowState;
+ BOOL Result;
+
+ WFWowDisableRedirection(&WowState);
+ Result = ShellExecuteEx(pExecInfo);
+ WFWowRevertRedirection(&WowState);
+ return Result;
+}
+
+
diff --git a/src/winfile.h b/src/winfile.h
index 0641d442..93a4ff05 100644
--- a/src/winfile.h
+++ b/src/winfile.h
@@ -657,6 +657,26 @@ VOID InvalidateAllNetTypes(VOID);
VOID GetTreeUNCName(HWND hwndTree, LPTSTR szBuf, INT nBuf);
BOOL RectTreeItem(HWND hwndLB, register INT iItem, BOOL bFocusOn);
+VOID WFWowInitialize();
+
+BOOL WFWowCopyFile(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, BOOL bFailIfExists);
+BOOL WFWowCopyFileEx(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, LPPROGRESS_ROUTINE lpProgressRoutine, LPVOID lpData, LPBOOL pbCancel, DWORD dwCopyFlags);
+BOOL WFWowCreateDirectory(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
+BOOL WFWowCreateDirectoryEx(LPCWSTR lpTemplateDirectory, LPCWSTR lpNewDirectory, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
+HANDLE WFWowCreateFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
+BOOLEAN WFWowCreateSymbolicLink(LPCWSTR lpSymlinkFileName, LPCWSTR lpTargetFileName, DWORD dwFlags);
+BOOL WFWowDeleteFile(LPCWSTR lpFileName);
+HANDLE WFWowFindFirstFile(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);
+HANDLE WFWowFindFirstFileEx(LPCWSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags);
+BOOL WFWowFindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData);
+DWORD WFWowGetCompressedFileSize(LPCWSTR lpFileName, LPDWORD lpFileSizeHigh);
+DWORD WFWowGetFileAttributes(LPCWSTR lpFileName);
+BOOL WFWowMoveFile(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName);
+BOOL WFWowRemoveDirectory(LPCWSTR lpPathName);
+BOOL WFWowSetFileAttributes(LPCWSTR lpFileName, DWORD dwFileAttributes);
+HINSTANCE WFWowShellExecute(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
+BOOL WFWowShellExecuteEx(SHELLEXECUTEINFOW *pExecInfo);
+
//--------------------------------------------------------------------------
//