Skip to content

Commit

Permalink
Support File Path longer than 260 (tweak needed: https://www.tenforum…
Browse files Browse the repository at this point in the history
  • Loading branch information
xupefei committed Aug 15, 2020
1 parent a41a7bd commit 7fc6e03
Show file tree
Hide file tree
Showing 11 changed files with 27 additions and 19 deletions.
2 changes: 1 addition & 1 deletion QuickLook.Native/QuickLook.Native32/DOpus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ void DOpus::ParseXmlBuffer(PWCHAR buffer)
auto b = new WCHAR[size];
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, b, size);

wcscpy_s(buffer, MAX_PATH, b);
wcscpy_s(buffer, MAX_PATH_EX, b); // DOpus supports Long Path

delete[] b;
return; // we now cares only the first result
Expand Down
7 changes: 4 additions & 3 deletions QuickLook.Native/QuickLook.Native32/DialogHook.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ void DialogHook::GetSelected(PWCHAR buffer)
if (!IsWow64Process(GetCurrentProcess(), &isSelfWoW64))
return;

// if QuickLook is 64bit and target is 32bit, obtain result from the helper
if (isTargetWoW64 && !isSelfWoW64)
{
// if self is 64bit and target is 32bit, do this
GetSelectedFromWoW64HookHelper(buffer);
}
else
Expand All @@ -72,7 +72,8 @@ void DialogHook::GetSelected(PWCHAR buffer)
return;

SendMessage(hwndfg, WM_HOOK_NOTIFY, 0, 0);
wcscpy_s(buffer, MAX_PATH, filePathBuffer);

GetLongPathName(filePathBuffer, buffer, MAX_PATH_EX);
}
}

Expand Down Expand Up @@ -114,7 +115,7 @@ void DialogHook::GetSelectedFromWoW64HookHelper(PWCHAR buffer)
SendMessage(hHelperWnd, WM_HOOK_NOTIFY, 0, 0);

// the sharedBuffer should now ready
wcscpy_s(buffer, MAX_PATH, sharedBuffer);
GetLongPathName(sharedBuffer, buffer, MAX_PATH_EX);

UnmapViewOfFile(sharedBuffer);
CloseHandle(hMapFile);
Expand Down
2 changes: 1 addition & 1 deletion QuickLook.Native/QuickLook.Native32/Everything.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ void Everything::GetSelected(PWCHAR buffer)

auto p = wcsstr(pText, L"\r\n");
auto l = p == nullptr ? wcslen(pText) : p - pText;
wcsncpy_s(buffer, MAX_PATH, pText, l);
wcsncpy_s(buffer, MAX_PATH_EX, pText, l); // Everything supports Long Path

GlobalUnlock(hData);

Expand Down
5 changes: 4 additions & 1 deletion QuickLook.Native/QuickLook.Native32/HelperMethods.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@ void HelperMethods::ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer)
if (n < 1)
return;

DragQueryFile(HDROP(medium.hGlobal), 0, buffer, MAX_PATH - 1);
WCHAR localBuffer[MAX_PATH] = { '\0' };
DragQueryFile(HDROP(medium.hGlobal), 0, localBuffer, MAX_PATH);

GetLongPathName(localBuffer, buffer, MAX_PATH_EX);
}

bool HelperMethods::IsListaryToolbarVisible()
Expand Down
2 changes: 2 additions & 0 deletions QuickLook.Native/QuickLook.Native32/stdafx.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,5 @@
#include<Shellapi.h>
#include<Psapi.h>
#include<AppModel.h>

#define MAX_PATH_EX 32767
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

void GetCurrentSelection()
{
WCHAR dllBuffer[MAX_PATH] = {'\0'};
// This function runs inside the target process. Some of them may already support Long Path.
// Therefore, we must assume all of them support Long Path to avoid buffer overflow.
WCHAR dllBuffer[MAX_PATH_EX] = {'\0'};
pGCS(dllBuffer);

auto hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, SHARED_MEM_NAME);
Expand All @@ -95,7 +97,7 @@ void GetCurrentSelection()
return;
}

wcscpy_s(buffer, MAX_PATH, dllBuffer);
wcscpy_s(buffer, MAX_PATH_EX, dllBuffer);

UnmapViewOfFile(buffer);
CloseHandle(hMapFile);
Expand Down
1 change: 1 addition & 0 deletions QuickLook.Native/QuickLook.WoW64HookHelper/stdafx.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,4 @@


// TODO: reference additional headers your program requires here
#define MAX_PATH_EX 32767
3 changes: 2 additions & 1 deletion QuickLook/App.config
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<runtime>
<AppContextSwitchOverrides value = " Switch.System.Windows.DoNotScaleForDpiChanges=false"/>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
<AppContextSwitchOverrides value="Switch.System.Windows.DoNotScaleForDpiChanges=false" />
<legacyCorruptedStateExceptionsPolicy enabled="true" />
<legacyUnhandledExceptionPolicy enabled="1" />
</runtime>
Expand Down
2 changes: 1 addition & 1 deletion QuickLook/NativeMethods/QuickLook.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace QuickLook.NativeMethods
{
internal static class QuickLook
{
private const int MaxPath = 8192;
private const int MaxPath = 32767;

[DllImport("QuickLook.Native32.dll", EntryPoint = "Init",
CallingConvention = CallingConvention.Cdecl)]
Expand Down
2 changes: 1 addition & 1 deletion QuickLook/Plugin/InfoPanel/WindowsThumbnailProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ private static IntPtr GetHBitmap(string fileName, int width, int height, Thumbna
SHCreateItemFromParsingName(fileName, IntPtr.Zero, ref shellItem2Guid, out var nativeShellItem);

if (retCode != 0)
throw Marshal.GetExceptionForHR(retCode);
return IntPtr.Zero;

var nativeSize = new NativeSize
{
Expand Down
14 changes: 6 additions & 8 deletions QuickLook/app.manifest
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>

<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
Expand Down Expand Up @@ -53,12 +54,9 @@
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- The combination of below two tags have the following effect : 1) Per-Monitor for >= Windows 10 Anniversary Update 2) System < Windows 10 Anniversary Update -->
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
PerMonitor
</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
true
</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitor</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>

Expand All @@ -79,4 +77,4 @@
</dependency>
-->

</assembly>
</assembly>

0 comments on commit 7fc6e03

Please sign in to comment.