mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-15 00:02:46 -05:00
Merge branch 'master' into symlink
This commit is contained in:
@ -132,7 +132,9 @@ exit:
|
||||
|
||||
FSP_API NTSTATUS FspFsctlStop(HANDLE VolumeHandle)
|
||||
{
|
||||
if (!DeviceIoControl(VolumeHandle, FSP_FSCTL_STOP, 0, 0, 0, 0, 0, 0))
|
||||
DWORD Bytes;
|
||||
|
||||
if (!DeviceIoControl(VolumeHandle, FSP_FSCTL_STOP, 0, 0, 0, 0, &Bytes, 0))
|
||||
return FspNtStatusFromWin32(GetLastError());
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
|
@ -161,7 +161,7 @@ static inline BOOLEAN FspNpParseUserName(PWSTR RemoteName,
|
||||
&ClassName, &ClassNameLen, &InstanceName, &InstanceNameLen))
|
||||
{
|
||||
for (P = InstanceName; *P; P++)
|
||||
if ('@' == *P && P - InstanceName < UserNameSize)
|
||||
if ('@' == *P && (ULONG)(P - InstanceName) < UserNameSize)
|
||||
{
|
||||
memcpy(UserName, InstanceName, (P - InstanceName) * sizeof(WCHAR));
|
||||
UserName[P - InstanceName] = L'\0';
|
||||
|
@ -686,6 +686,7 @@ NTSTATUS SvcInstanceStart(HANDLE ClientToken,
|
||||
UINT8 RspBuf[2];
|
||||
DWORD BytesTransferred;
|
||||
OVERLAPPED Overlapped;
|
||||
DWORD WaitResult;
|
||||
|
||||
if (0 == (BytesTransferred =
|
||||
WideCharToMultiByte(CP_UTF8, 0, Secret, lstrlenW(Secret), ReqBuf, sizeof ReqBuf, 0, 0)))
|
||||
@ -711,13 +712,22 @@ NTSTATUS SvcInstanceStart(HANDLE ClientToken,
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (!GetOverlappedResultEx(SvcInstance->StdioHandles[1], &Overlapped, &BytesTransferred,
|
||||
LAUNCHER_START_WITH_SECRET_TIMEOUT, FALSE))
|
||||
/*
|
||||
* We need to perform a GetOverlappedResult with a timeout. GetOverlappedResultEx would
|
||||
* be perfect except that it is a Windows 8 and above API. We will therefore replace with
|
||||
* WaitForSingleObject followed by GetOverlappedResult on success.
|
||||
*/
|
||||
WaitResult = WaitForSingleObject(SvcInstance->StdioHandles[1],
|
||||
LAUNCHER_START_WITH_SECRET_TIMEOUT);
|
||||
if (WAIT_OBJECT_0 == WaitResult)
|
||||
Result = GetOverlappedResult(SvcInstance->StdioHandles[1], &Overlapped, &BytesTransferred, TRUE) ?
|
||||
STATUS_SUCCESS : FspNtStatusFromWin32(GetLastError());
|
||||
else if (WAIT_TIMEOUT == WaitResult)
|
||||
Result = STATUS_TIMEOUT;
|
||||
else
|
||||
Result = FspNtStatusFromWin32(GetLastError());
|
||||
if (!NT_SUCCESS(Result) || STATUS_TIMEOUT == Result)
|
||||
{
|
||||
if (WAIT_TIMEOUT == GetLastError())
|
||||
Result = STATUS_TIMEOUT;
|
||||
else
|
||||
Result = FspNtStatusFromWin32(GetLastError());
|
||||
CancelIoEx(SvcInstance->StdioHandles[1], &Overlapped);
|
||||
goto exit;
|
||||
}
|
||||
|
@ -655,13 +655,14 @@ enum
|
||||
#define FspIopPostWorkRequestBestEffort(D, R)\
|
||||
FspIopPostWorkRequestFunnel(D, R, TRUE)
|
||||
#define FspIopCompleteIrp(I, R) FspIopCompleteIrpEx(I, R, TRUE)
|
||||
#define REQ_ALIGN_SIZE 16
|
||||
typedef VOID FSP_IOP_REQUEST_FINI(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4]);
|
||||
typedef struct
|
||||
{
|
||||
FSP_IOP_REQUEST_FINI *RequestFini;
|
||||
PVOID Context[4];
|
||||
FSP_FSCTL_TRANSACT_RSP *Response;
|
||||
__declspec(align(MEMORY_ALLOCATION_ALIGNMENT)) UINT8 RequestBuf[];
|
||||
__declspec(align(REQ_ALIGN_SIZE)) UINT8 RequestBuf[];
|
||||
} FSP_FSCTL_TRANSACT_REQ_HEADER;
|
||||
static inline
|
||||
PVOID *FspIopRequestContextAddress(FSP_FSCTL_TRANSACT_REQ *Request, ULONG I)
|
||||
@ -1034,4 +1035,26 @@ extern WCHAR FspFileDescDirectoryPatternMatchAll[];
|
||||
extern FSP_MV_CcCoherencyFlushAndPurgeCache *FspMvCcCoherencyFlushAndPurgeCache;
|
||||
extern ULONG FspMvMdlMappingNoWrite;
|
||||
|
||||
/*
|
||||
* Fixes
|
||||
*/
|
||||
|
||||
/* ObCloseHandle: add missing prototype */
|
||||
#if (NTDDI_VERSION < NTDDI_WIN7)
|
||||
NTKERNELAPI
|
||||
NTSTATUS
|
||||
ObCloseHandle(
|
||||
_In_ HANDLE Handle,
|
||||
_In_ KPROCESSOR_MODE PreviousMode
|
||||
);
|
||||
#endif
|
||||
|
||||
/* RtlEqualMemory: this is defined as memcmp, which does not exist on Win7 x86! */
|
||||
#undef RtlEqualMemory
|
||||
static inline
|
||||
LOGICAL RtlEqualMemory(const VOID *Source1, const VOID *Source2, SIZE_T Length)
|
||||
{
|
||||
return Length == RtlCompareMemory(Source1, Source2, Length);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
150
src/sys/ioctl.i
150
src/sys/ioctl.i
@ -89,82 +89,82 @@ SYM(FSCTL_DFSR_SET_GHOST_HANDLE_STATE)
|
||||
SYM(FSCTL_TXFS_LIST_TRANSACTIONS)
|
||||
SYM(FSCTL_QUERY_PAGEFILE_ENCRYPTION)
|
||||
SYM(FSCTL_RESET_VOLUME_ALLOCATION_HINTS)
|
||||
SYM(FSCTL_QUERY_DEPENDENT_VOLUME)
|
||||
SYM(FSCTL_SD_GLOBAL_CHANGE)
|
||||
//SYM(FSCTL_QUERY_DEPENDENT_VOLUME)
|
||||
//SYM(FSCTL_SD_GLOBAL_CHANGE)
|
||||
SYM(FSCTL_TXFS_READ_BACKUP_INFORMATION2)
|
||||
SYM(FSCTL_LOOKUP_STREAM_FROM_CLUSTER)
|
||||
SYM(FSCTL_TXFS_WRITE_BACKUP_INFORMATION2)
|
||||
SYM(FSCTL_FILE_TYPE_NOTIFICATION)
|
||||
SYM(FSCTL_FILE_LEVEL_TRIM)
|
||||
SYM(FSCTL_GET_BOOT_AREA_INFO)
|
||||
SYM(FSCTL_GET_RETRIEVAL_POINTER_BASE)
|
||||
SYM(FSCTL_SET_PERSISTENT_VOLUME_STATE)
|
||||
SYM(FSCTL_QUERY_PERSISTENT_VOLUME_STATE)
|
||||
SYM(FSCTL_REQUEST_OPLOCK)
|
||||
SYM(FSCTL_CSV_TUNNEL_REQUEST)
|
||||
SYM(FSCTL_IS_CSV_FILE)
|
||||
SYM(FSCTL_QUERY_FILE_SYSTEM_RECOGNITION)
|
||||
SYM(FSCTL_CSV_GET_VOLUME_PATH_NAME)
|
||||
SYM(FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT)
|
||||
SYM(FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME)
|
||||
SYM(FSCTL_IS_FILE_ON_CSV_VOLUME)
|
||||
SYM(FSCTL_CORRUPTION_HANDLING)
|
||||
SYM(FSCTL_OFFLOAD_READ)
|
||||
SYM(FSCTL_OFFLOAD_WRITE)
|
||||
SYM(FSCTL_CSV_INTERNAL)
|
||||
SYM(FSCTL_SET_PURGE_FAILURE_MODE)
|
||||
SYM(FSCTL_QUERY_FILE_LAYOUT)
|
||||
SYM(FSCTL_IS_VOLUME_OWNED_BYCSVFS)
|
||||
SYM(FSCTL_GET_INTEGRITY_INFORMATION)
|
||||
SYM(FSCTL_SET_INTEGRITY_INFORMATION)
|
||||
SYM(FSCTL_QUERY_FILE_REGIONS)
|
||||
SYM(FSCTL_DEDUP_FILE)
|
||||
SYM(FSCTL_DEDUP_QUERY_FILE_HASHES)
|
||||
SYM(FSCTL_DEDUP_QUERY_RANGE_STATE)
|
||||
SYM(FSCTL_DEDUP_QUERY_REPARSE_INFO)
|
||||
SYM(FSCTL_RKF_INTERNAL)
|
||||
SYM(FSCTL_SCRUB_DATA)
|
||||
SYM(FSCTL_REPAIR_COPIES)
|
||||
SYM(FSCTL_DISABLE_LOCAL_BUFFERING)
|
||||
SYM(FSCTL_CSV_MGMT_LOCK)
|
||||
SYM(FSCTL_CSV_QUERY_DOWN_LEVEL_FILE_SYSTEM_CHARACTERISTICS)
|
||||
SYM(FSCTL_ADVANCE_FILE_ID)
|
||||
SYM(FSCTL_CSV_SYNC_TUNNEL_REQUEST)
|
||||
SYM(FSCTL_CSV_QUERY_VETO_FILE_DIRECT_IO)
|
||||
SYM(FSCTL_WRITE_USN_REASON)
|
||||
SYM(FSCTL_CSV_CONTROL)
|
||||
SYM(FSCTL_GET_REFS_VOLUME_DATA)
|
||||
SYM(FSCTL_CSV_H_BREAKING_SYNC_TUNNEL_REQUEST)
|
||||
SYM(FSCTL_QUERY_STORAGE_CLASSES)
|
||||
SYM(FSCTL_QUERY_REGION_INFO)
|
||||
SYM(FSCTL_USN_TRACK_MODIFIED_RANGES)
|
||||
SYM(FSCTL_QUERY_SHARED_VIRTUAL_DISK_SUPPORT)
|
||||
SYM(FSCTL_SVHDX_SYNC_TUNNEL_REQUEST)
|
||||
SYM(FSCTL_SVHDX_SET_INITIATOR_INFORMATION)
|
||||
SYM(FSCTL_SET_EXTERNAL_BACKING)
|
||||
SYM(FSCTL_GET_EXTERNAL_BACKING)
|
||||
SYM(FSCTL_DELETE_EXTERNAL_BACKING)
|
||||
SYM(FSCTL_ENUM_EXTERNAL_BACKING)
|
||||
SYM(FSCTL_ENUM_OVERLAY)
|
||||
SYM(FSCTL_ADD_OVERLAY)
|
||||
SYM(FSCTL_REMOVE_OVERLAY)
|
||||
SYM(FSCTL_UPDATE_OVERLAY)
|
||||
SYM(FSCTL_DUPLICATE_EXTENTS_TO_FILE)
|
||||
SYM(FSCTL_SPARSE_OVERALLOCATE)
|
||||
SYM(FSCTL_STORAGE_QOS_CONTROL)
|
||||
SYM(FSCTL_INITIATE_FILE_METADATA_OPTIMIZATION)
|
||||
SYM(FSCTL_QUERY_FILE_METADATA_OPTIMIZATION)
|
||||
SYM(FSCTL_SVHDX_ASYNC_TUNNEL_REQUEST)
|
||||
SYM(FSCTL_GET_WOF_VERSION)
|
||||
SYM(FSCTL_HCS_SYNC_TUNNEL_REQUEST)
|
||||
SYM(FSCTL_HCS_ASYNC_TUNNEL_REQUEST)
|
||||
SYM(FSCTL_QUERY_EXTENT_READ_CACHE_INFO)
|
||||
SYM(FSCTL_QUERY_REFS_VOLUME_COUNTER_INFO)
|
||||
SYM(FSCTL_CLEAN_VOLUME_METADATA)
|
||||
SYM(FSCTL_SET_INTEGRITY_INFORMATION_EX)
|
||||
SYM(FSCTL_SUSPEND_OVERLAY)
|
||||
SYM(FSCTL_VIRTUAL_STORAGE_QUERY_PROPERTY)
|
||||
SYM(FSCTL_FILESYSTEM_GET_STATISTICS_EX)
|
||||
//SYM(FSCTL_LOOKUP_STREAM_FROM_CLUSTER)
|
||||
//SYM(FSCTL_TXFS_WRITE_BACKUP_INFORMATION2)
|
||||
//SYM(FSCTL_FILE_TYPE_NOTIFICATION)
|
||||
//SYM(FSCTL_FILE_LEVEL_TRIM)
|
||||
//SYM(FSCTL_GET_BOOT_AREA_INFO)
|
||||
//SYM(FSCTL_GET_RETRIEVAL_POINTER_BASE)
|
||||
//SYM(FSCTL_SET_PERSISTENT_VOLUME_STATE)
|
||||
//SYM(FSCTL_QUERY_PERSISTENT_VOLUME_STATE)
|
||||
//SYM(FSCTL_REQUEST_OPLOCK)
|
||||
//SYM(FSCTL_CSV_TUNNEL_REQUEST)
|
||||
//SYM(FSCTL_IS_CSV_FILE)
|
||||
//SYM(FSCTL_QUERY_FILE_SYSTEM_RECOGNITION)
|
||||
//SYM(FSCTL_CSV_GET_VOLUME_PATH_NAME)
|
||||
//SYM(FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT)
|
||||
//SYM(FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME)
|
||||
//SYM(FSCTL_IS_FILE_ON_CSV_VOLUME)
|
||||
//SYM(FSCTL_CORRUPTION_HANDLING)
|
||||
//SYM(FSCTL_OFFLOAD_READ)
|
||||
//SYM(FSCTL_OFFLOAD_WRITE)
|
||||
//SYM(FSCTL_CSV_INTERNAL)
|
||||
//SYM(FSCTL_SET_PURGE_FAILURE_MODE)
|
||||
//SYM(FSCTL_QUERY_FILE_LAYOUT)
|
||||
//SYM(FSCTL_IS_VOLUME_OWNED_BYCSVFS)
|
||||
//SYM(FSCTL_GET_INTEGRITY_INFORMATION)
|
||||
//SYM(FSCTL_SET_INTEGRITY_INFORMATION)
|
||||
//SYM(FSCTL_QUERY_FILE_REGIONS)
|
||||
//SYM(FSCTL_DEDUP_FILE)
|
||||
//SYM(FSCTL_DEDUP_QUERY_FILE_HASHES)
|
||||
//SYM(FSCTL_DEDUP_QUERY_RANGE_STATE)
|
||||
//SYM(FSCTL_DEDUP_QUERY_REPARSE_INFO)
|
||||
//SYM(FSCTL_RKF_INTERNAL)
|
||||
//SYM(FSCTL_SCRUB_DATA)
|
||||
//SYM(FSCTL_REPAIR_COPIES)
|
||||
//SYM(FSCTL_DISABLE_LOCAL_BUFFERING)
|
||||
//SYM(FSCTL_CSV_MGMT_LOCK)
|
||||
//SYM(FSCTL_CSV_QUERY_DOWN_LEVEL_FILE_SYSTEM_CHARACTERISTICS)
|
||||
//SYM(FSCTL_ADVANCE_FILE_ID)
|
||||
//SYM(FSCTL_CSV_SYNC_TUNNEL_REQUEST)
|
||||
//SYM(FSCTL_CSV_QUERY_VETO_FILE_DIRECT_IO)
|
||||
//SYM(FSCTL_WRITE_USN_REASON)
|
||||
//SYM(FSCTL_CSV_CONTROL)
|
||||
//SYM(FSCTL_GET_REFS_VOLUME_DATA)
|
||||
//SYM(FSCTL_CSV_H_BREAKING_SYNC_TUNNEL_REQUEST)
|
||||
//SYM(FSCTL_QUERY_STORAGE_CLASSES)
|
||||
//SYM(FSCTL_QUERY_REGION_INFO)
|
||||
//SYM(FSCTL_USN_TRACK_MODIFIED_RANGES)
|
||||
//SYM(FSCTL_QUERY_SHARED_VIRTUAL_DISK_SUPPORT)
|
||||
//SYM(FSCTL_SVHDX_SYNC_TUNNEL_REQUEST)
|
||||
//SYM(FSCTL_SVHDX_SET_INITIATOR_INFORMATION)
|
||||
//SYM(FSCTL_SET_EXTERNAL_BACKING)
|
||||
//SYM(FSCTL_GET_EXTERNAL_BACKING)
|
||||
//SYM(FSCTL_DELETE_EXTERNAL_BACKING)
|
||||
//SYM(FSCTL_ENUM_EXTERNAL_BACKING)
|
||||
//SYM(FSCTL_ENUM_OVERLAY)
|
||||
//SYM(FSCTL_ADD_OVERLAY)
|
||||
//SYM(FSCTL_REMOVE_OVERLAY)
|
||||
//SYM(FSCTL_UPDATE_OVERLAY)
|
||||
//SYM(FSCTL_DUPLICATE_EXTENTS_TO_FILE)
|
||||
//SYM(FSCTL_SPARSE_OVERALLOCATE)
|
||||
//SYM(FSCTL_STORAGE_QOS_CONTROL)
|
||||
//SYM(FSCTL_INITIATE_FILE_METADATA_OPTIMIZATION)
|
||||
//SYM(FSCTL_QUERY_FILE_METADATA_OPTIMIZATION)
|
||||
//SYM(FSCTL_SVHDX_ASYNC_TUNNEL_REQUEST)
|
||||
//SYM(FSCTL_GET_WOF_VERSION)
|
||||
//SYM(FSCTL_HCS_SYNC_TUNNEL_REQUEST)
|
||||
//SYM(FSCTL_HCS_ASYNC_TUNNEL_REQUEST)
|
||||
//SYM(FSCTL_QUERY_EXTENT_READ_CACHE_INFO)
|
||||
//SYM(FSCTL_QUERY_REFS_VOLUME_COUNTER_INFO)
|
||||
//SYM(FSCTL_CLEAN_VOLUME_METADATA)
|
||||
//SYM(FSCTL_SET_INTEGRITY_INFORMATION_EX)
|
||||
//SYM(FSCTL_SUSPEND_OVERLAY)
|
||||
//SYM(FSCTL_VIRTUAL_STORAGE_QUERY_PROPERTY)
|
||||
//SYM(FSCTL_FILESYSTEM_GET_STATISTICS_EX)
|
||||
SYM(FSCTL_LMR_GET_LINK_TRACKING_INFORMATION)
|
||||
SYM(FSCTL_LMR_SET_LINK_TRACKING_INFORMATION)
|
||||
SYM(IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER)
|
||||
|
@ -48,10 +48,12 @@ NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response
|
||||
#endif
|
||||
|
||||
/* Requests (and RequestHeaders) must be 16-byte aligned, because we use the low 4 bits for flags */
|
||||
#if 16 != MEMORY_ALLOCATION_ALIGNMENT
|
||||
#define REQ_HEADER_ALIGNMASK 15
|
||||
#if REQ_ALIGN_SIZE <= MEMORY_ALLOCATION_ALIGNMENT
|
||||
#define REQ_HEADER_ALIGN_MASK 0
|
||||
#define REQ_HEADER_ALIGN_OVERHEAD 0
|
||||
#else
|
||||
#define REQ_HEADER_ALIGNMASK 0
|
||||
#define REQ_HEADER_ALIGN_MASK (REQ_ALIGN_SIZE - 1)
|
||||
#define REQ_HEADER_ALIGN_OVERHEAD (sizeof(PVOID) + REQ_HEADER_ALIGN_MASK)
|
||||
#endif
|
||||
|
||||
NTSTATUS FspIopCreateRequestFunnel(
|
||||
@ -74,20 +76,23 @@ NTSTATUS FspIopCreateRequestFunnel(
|
||||
if (FlagOn(Flags, FspIopRequestMustSucceed))
|
||||
RequestHeader = FspAllocatePoolMustSucceed(
|
||||
FlagOn(Flags, FspIopRequestNonPaged) ? NonPagedPool : PagedPool,
|
||||
sizeof *RequestHeader + sizeof *Request + ExtraSize + REQ_HEADER_ALIGNMASK,
|
||||
sizeof *RequestHeader + sizeof *Request + ExtraSize + REQ_HEADER_ALIGN_OVERHEAD,
|
||||
FSP_ALLOC_INTERNAL_TAG);
|
||||
else
|
||||
{
|
||||
RequestHeader = ExAllocatePoolWithTag(
|
||||
FlagOn(Flags, FspIopRequestNonPaged) ? NonPagedPool : PagedPool,
|
||||
sizeof *RequestHeader + sizeof *Request + ExtraSize + REQ_HEADER_ALIGNMASK,
|
||||
sizeof *RequestHeader + sizeof *Request + ExtraSize + REQ_HEADER_ALIGN_OVERHEAD,
|
||||
FSP_ALLOC_INTERNAL_TAG);
|
||||
if (0 == RequestHeader)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
#if 0 != REQ_HEADER_ALIGNMASK
|
||||
RequestHeader = (PVOID)(((UINT_PTR)RequestHeader + REQ_HEADER_ALIGNMASK) & REQ_HEADER_ALIGNMASK);
|
||||
#if 0 != REQ_HEADER_ALIGN_MASK
|
||||
PVOID Allocation = RequestHeader;
|
||||
RequestHeader = (PVOID)(((UINT_PTR)RequestHeader + REQ_HEADER_ALIGN_OVERHEAD) &
|
||||
~REQ_HEADER_ALIGN_MASK);
|
||||
((PVOID *)RequestHeader)[-1] = Allocation;
|
||||
#endif
|
||||
|
||||
RtlZeroMemory(RequestHeader, sizeof *RequestHeader + sizeof *Request + ExtraSize);
|
||||
@ -127,6 +132,10 @@ VOID FspIopDeleteRequest(FSP_FSCTL_TRANSACT_REQ *Request)
|
||||
if (0 != RequestHeader->Response)
|
||||
FspFree(RequestHeader->Response);
|
||||
|
||||
#if 0 != REQ_HEADER_ALIGN_MASK
|
||||
RequestHeader = ((PVOID *)RequestHeader)[-1];
|
||||
#endif
|
||||
|
||||
FspFree(RequestHeader);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user