diff --git a/build/VStudio/winfsp_dll.vcxproj b/build/VStudio/winfsp_dll.vcxproj
index 66962919..85852f6e 100644
--- a/build/VStudio/winfsp_dll.vcxproj
+++ b/build/VStudio/winfsp_dll.vcxproj
@@ -100,7 +100,7 @@
Level3
Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)
+ WINFSP_DLL_INTERNAL;WIN32;_DEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)
true
..\..\inc;..\..\src
@@ -115,7 +115,7 @@
Level3
Disabled
- _DEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)
+ WINFSP_DLL_INTERNAL;_DEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)
true
..\..\inc;..\..\src
@@ -132,7 +132,7 @@
MaxSpeed
true
true
- WIN32;NDEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)
+ WINFSP_DLL_INTERNAL;WIN32;NDEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)
true
..\..\inc;..\..\src
@@ -151,7 +151,7 @@
MaxSpeed
true
true
- NDEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)
+ WINFSP_DLL_INTERNAL;NDEBUG;_WINDOWS;_USRDLL;WINFSPDLL_EXPORTS;%(PreprocessorDefinitions)
true
..\..\inc;..\..\src
diff --git a/build/VStudio/winfsp_sys.vcxproj b/build/VStudio/winfsp_sys.vcxproj
index a1c9f1bf..a5c3ae88 100644
--- a/build/VStudio/winfsp_sys.vcxproj
+++ b/build/VStudio/winfsp_sys.vcxproj
@@ -97,6 +97,7 @@
..\..\inc;..\..\src;%(AdditionalIncludeDirectories)
+ WINFSP_SYS_INTERNAL; _X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)
wdmsec.lib;%(AdditionalDependencies)
@@ -105,6 +106,7 @@
..\..\inc;..\..\src;%(AdditionalIncludeDirectories)
+ WINFSP_SYS_INTERNAL; _X86_=1;i386=1;STD_CALL;%(PreprocessorDefinitions)
wdmsec.lib;%(AdditionalDependencies)
@@ -113,6 +115,7 @@
..\..\inc;..\..\src;%(AdditionalIncludeDirectories)
+ WINFSP_SYS_INTERNAL; _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)
wdmsec.lib;%(AdditionalDependencies)
@@ -121,6 +124,7 @@
..\..\inc;..\..\src;%(AdditionalIncludeDirectories)
+ WINFSP_SYS_INTERNAL; _WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions)
wdmsec.lib;%(AdditionalDependencies)
diff --git a/inc/winfsp/fsctl.h b/inc/winfsp/fsctl.h
index 0fbdb986..facd8b46 100644
--- a/inc/winfsp/fsctl.h
+++ b/inc/winfsp/fsctl.h
@@ -92,13 +92,13 @@ static inline const FSP_TRANSACT_RSP *FspFsctlTransactConsumeResponse(
return NextResponse <= ResponseBufEnd ? NextResponse : 0;
}
-#if !defined(WINFSP_SYS_DRIVER_H_INTERNAL)
-NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor,
+#if !defined(WINFSP_SYS_INTERNAL)
+FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor,
PHANDLE *PVolumeHandle);
-NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
+FSP_API NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
PHANDLE *PVolumeHandle);
-NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle);
-NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
+FSP_API NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle);
+FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
FSP_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
FSP_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize);
#endif
diff --git a/inc/winfsp/winfsp.h b/inc/winfsp/winfsp.h
index dff14250..e37a3bba 100644
--- a/inc/winfsp/winfsp.h
+++ b/inc/winfsp/winfsp.h
@@ -13,6 +13,12 @@
#include
#include
+#if defined(WINFSP_DLL_INTERNAL)
+#define FSP_API __declspec(dllexport)
+#else
+#define FSP_API __declspec(dllimport)
+#endif
+
NTSTATUS FspNtStatusFromWin32(DWORD Error);
#endif
diff --git a/src/dll/fsctl.c b/src/dll/fsctl.c
index 0509155d..38297231 100644
--- a/src/dll/fsctl.c
+++ b/src/dll/fsctl.c
@@ -16,7 +16,7 @@ static inline VOID GlobalDevicePath(PWCHAR DevicePathBuf, SIZE_T DevicePathSize,
L'\\' == DevicePath[0] ? GLOBALROOT "%S" : GLOBALROOT "\\Device\\%S", DevicePath);
}
-NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor,
+FSP_API NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDescriptor,
PHANDLE *PVolumeHandle)
{
NTSTATUS Result = STATUS_SUCCESS;
@@ -46,7 +46,7 @@ NTSTATUS FspFsctlCreateVolume(PWSTR DevicePath, PSECURITY_DESCRIPTOR SecurityDes
}
DeviceHandle = CreateFileW(DevicePathBuf,
- 0, FILE_SHARE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
+ 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
if (INVALID_HANDLE_VALUE == DeviceHandle)
{
Result = FspNtStatusFromWin32(GetLastError());
@@ -70,7 +70,7 @@ exit:
return Result;
}
-NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
+FSP_API NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
PHANDLE *PVolumeHandle)
{
NTSTATUS Result = STATUS_SUCCESS;
@@ -82,7 +82,7 @@ NTSTATUS FspFsctlOpenVolume(PWSTR VolumePath,
GlobalDevicePath(DevicePathBuf, sizeof DevicePathBuf, VolumePath);
VolumeHandle = CreateFileW(DevicePathBuf,
- 0, FILE_SHARE_WRITE | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
+ 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);
if (INVALID_HANDLE_VALUE == VolumeHandle)
{
Result = FspNtStatusFromWin32(GetLastError());
@@ -95,7 +95,7 @@ exit:
return Result;
}
-NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle)
+FSP_API NTSTATUS FspFsctlDeleteVolume(HANDLE VolumeHandle)
{
NTSTATUS Result = STATUS_SUCCESS;
DWORD Bytes;
@@ -112,7 +112,7 @@ exit:
return Result;
}
-NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
+FSP_API NTSTATUS FspFsctlTransact(HANDLE VolumeHandle,
FSP_TRANSACT_RSP *ResponseBuf, SIZE_T ResponseBufSize,
FSP_TRANSACT_REQ *RequestBuf, SIZE_T *PRequestBufSize)
{
diff --git a/src/sys/driver.h b/src/sys/driver.h
index afe3c669..91d50c66 100644
--- a/src/sys/driver.h
+++ b/src/sys/driver.h
@@ -10,8 +10,6 @@
#include
#include
#include
-
-#define WINFSP_SYS_DRIVER_H_INTERNAL
#include
#define DRIVER_NAME "WinFsp"
diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c
index ca42ce68..6f67d892 100644
--- a/src/sys/fsctl.c
+++ b/src/sys/fsctl.c
@@ -140,7 +140,7 @@ static NTSTATUS FspFsvrtTransact(
if (0 == NextResponse)
break;
- ProcessIrp = FspIoqEndProcessingIrp(&FsvrtDeviceExtension->Ioq, Response->Hint);
+ ProcessIrp = FspIoqEndProcessingIrp(&FsvrtDeviceExtension->Ioq, (UINT_PTR)Response->Hint);
if (0 == ProcessIrp)
/* either IRP was canceled or a bogus Hint was provided */
continue;