From 68d8ade667915867e1712807480e8c56a06c0c39 Mon Sep 17 00:00:00 2001 From: Fritz Elfert Date: Fri, 29 Dec 2017 18:56:11 +0100 Subject: [PATCH 1/2] Speed up mount operation by putting winfsp network provider at the head of network providers --- src/dll/np.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dll/np.c b/src/dll/np.c index dfa38f7b..bc6d1a03 100644 --- a/src/dll/np.c +++ b/src/dll/np.c @@ -1016,7 +1016,7 @@ NTSTATUS FspNpRegister(VOID) WCHAR ProviderPath[MAX_PATH]; WCHAR RegBuffer[1024]; PWSTR P, Part; - DWORD RegResult, RegType, RegBufferSize; + DWORD RegResult, RegType, RegBufferSize, RegBufferOffset; HKEY RegKey; BOOLEAN FoundProvider; @@ -1082,15 +1082,16 @@ NTSTATUS FspNpRegister(VOID) return FspNtStatusFromWin32(RegResult); RegBufferSize = sizeof RegBuffer - sizeof L"," FSP_NP_NAME; + RegBufferOffset = lstrlenW(L"," FSP_NP_NAME); RegResult = RegQueryValueExW(RegKey, - L"ProviderOrder", 0, &RegType, (PVOID)RegBuffer, &RegBufferSize); + L"ProviderOrder", 0, &RegType, (PVOID)&RegBuffer[RegBufferOffset], &RegBufferSize); if (ERROR_SUCCESS != RegResult) goto close_and_exit; RegBufferSize /= sizeof(WCHAR); FoundProvider = FALSE; - RegBuffer[RegBufferSize] = L'\0'; - P = RegBuffer, Part = P; + RegBuffer[RegBufferSize + RegBufferOffset] = L'\0'; + P = &RegBuffer[RegBufferOffset], Part = P; do { if (L',' == *P || '\0' == *P) @@ -1107,8 +1108,7 @@ NTSTATUS FspNpRegister(VOID) if (!FoundProvider) { - P--; - memcpy(P, L"," FSP_NP_NAME, sizeof L"," FSP_NP_NAME); + memcpy((PWSTR)RegBuffer, L"" FSP_NP_NAME ",", sizeof L"" FSP_NP_NAME); RegBufferSize = lstrlenW(RegBuffer); RegBufferSize++; From 0c38f92082f99e1bf6be18ed2dc9892a2019130c Mon Sep 17 00:00:00 2001 From: Fritz Elfert Date: Thu, 4 Jan 2018 01:12:34 +0100 Subject: [PATCH 2/2] Use FSP_NP_ORDER_FIRST to specify provider order --- src/dll/np.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/dll/np.c b/src/dll/np.c index bc6d1a03..c8e3b3dd 100644 --- a/src/dll/np.c +++ b/src/dll/np.c @@ -35,6 +35,12 @@ */ #define FSP_NP_CREDENTIAL_MANAGER +/* + * Define the following macro to register ourselves as the first network provider. + * Otherwise we will be registered as the last network provider. + */ +#define FSP_NP_ORDER_FIRST + enum { FSP_NP_CREDENTIALS_NONE = 0, @@ -1082,7 +1088,11 @@ NTSTATUS FspNpRegister(VOID) return FspNtStatusFromWin32(RegResult); RegBufferSize = sizeof RegBuffer - sizeof L"," FSP_NP_NAME; - RegBufferOffset = lstrlenW(L"," FSP_NP_NAME); +#ifdef FSP_NP_ORDER_FIRST + RegBufferOffset = sizeof "" FSP_NP_NAME; +#else + RegBufferOffset = 0; +#endif RegResult = RegQueryValueExW(RegKey, L"ProviderOrder", 0, &RegType, (PVOID)&RegBuffer[RegBufferOffset], &RegBufferSize); if (ERROR_SUCCESS != RegResult) @@ -1108,7 +1118,11 @@ NTSTATUS FspNpRegister(VOID) if (!FoundProvider) { +#ifdef FSP_NP_ORDER_FIRST memcpy((PWSTR)RegBuffer, L"" FSP_NP_NAME ",", sizeof L"" FSP_NP_NAME); +#else + memcpy(--P, L"," FSP_NP_NAME, sizeof L"," FSP_NP_NAME); +#endif RegBufferSize = lstrlenW(RegBuffer); RegBufferSize++;