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); + //-------------------------------------------------------------------------- //