mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
dll: originating process id
This commit is contained in:
parent
637f461a65
commit
fc1586eb82
@ -78,6 +78,9 @@ FSP_FSCTL_STATIC_ASSERT(FSP_FSCTL_VOLUME_NAME_SIZEMAX <= 260 * sizeof(WCHAR),
|
|||||||
#define FSP_FSCTL_TRANSACT_BATCH_BUFFER_SIZEMIN (64 * 1024)
|
#define FSP_FSCTL_TRANSACT_BATCH_BUFFER_SIZEMIN (64 * 1024)
|
||||||
#define FSP_FSCTL_TRANSACT_BUFFER_SIZEMIN FSP_FSCTL_TRANSACT_REQ_SIZEMAX
|
#define FSP_FSCTL_TRANSACT_BUFFER_SIZEMIN FSP_FSCTL_TRANSACT_REQ_SIZEMAX
|
||||||
|
|
||||||
|
#define FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(T) ((HANDLE)((T) & 0xffffffff))
|
||||||
|
#define FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(T) ((UINT32)(((T) >> 32) & 0xffffffff))
|
||||||
|
|
||||||
/* marshalling */
|
/* marshalling */
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
#pragma warning(disable:4200) /* zero-sized array in struct/union */
|
#pragma warning(disable:4200) /* zero-sized array in struct/union */
|
||||||
@ -222,7 +225,7 @@ typedef struct
|
|||||||
UINT32 FileAttributes; /* file attributes for new files */
|
UINT32 FileAttributes; /* file attributes for new files */
|
||||||
FSP_FSCTL_TRANSACT_BUF SecurityDescriptor; /* security descriptor for new files */
|
FSP_FSCTL_TRANSACT_BUF SecurityDescriptor; /* security descriptor for new files */
|
||||||
UINT64 AllocationSize; /* initial allocation size */
|
UINT64 AllocationSize; /* initial allocation size */
|
||||||
UINT64 AccessToken; /* request access token (HANDLE) */
|
UINT64 AccessToken; /* request access token (PID,HANDLE) */
|
||||||
UINT32 DesiredAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
UINT32 DesiredAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
||||||
UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
UINT32 GrantedAccess; /* FILE_{READ_DATA,WRITE_DATA,etc.} */
|
||||||
UINT32 ShareAccess; /* FILE_SHARE_{READ,WRITE,DELETE} */
|
UINT32 ShareAccess; /* FILE_SHARE_{READ,WRITE,DELETE} */
|
||||||
@ -315,7 +318,7 @@ typedef struct
|
|||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
FSP_FSCTL_TRANSACT_BUF NewFileName;
|
FSP_FSCTL_TRANSACT_BUF NewFileName;
|
||||||
UINT64 AccessToken; /* request access token (HANDLE) */
|
UINT64 AccessToken; /* request access token (PID,HANDLE) */
|
||||||
} Rename;
|
} Rename;
|
||||||
} Info;
|
} Info;
|
||||||
} SetInformation;
|
} SetInformation;
|
||||||
|
@ -1065,6 +1065,23 @@ BOOLEAN FspFileSystemIsOperationCaseSensitive(VOID)
|
|||||||
FspFsctlTransactCreateKind == Request->Kind && Request->Req.Create.CaseSensitive ||
|
FspFsctlTransactCreateKind == Request->Kind && Request->Req.Create.CaseSensitive ||
|
||||||
FspFsctlTransactQueryDirectoryKind == Request->Kind && Request->Req.QueryDirectory.CaseSensitive;
|
FspFsctlTransactQueryDirectoryKind == Request->Kind && Request->Req.QueryDirectory.CaseSensitive;
|
||||||
}
|
}
|
||||||
|
FSP_API UINT32 FspFileSystemOperationProcessIdF(VOID);
|
||||||
|
static inline
|
||||||
|
UINT32 FspFileSystemOperationProcessId(VOID)
|
||||||
|
{
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request = FspFileSystemGetOperationContext()->Request;
|
||||||
|
switch (Request->Kind)
|
||||||
|
{
|
||||||
|
case FspFsctlTransactCreateKind:
|
||||||
|
return FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(Request->Req.Create.AccessToken);
|
||||||
|
case FspFsctlTransactSetInformationKind:
|
||||||
|
if (10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass)
|
||||||
|
return FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(Request->Req.SetInformation.Info.Rename.AccessToken);
|
||||||
|
/* fall through! */
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Operations
|
* Operations
|
||||||
|
@ -302,7 +302,7 @@ FSP_API VOID FspDebugLogRequest(FSP_FSCTL_TRANSACT_REQ *Request)
|
|||||||
FspDebugLog("%S[TID=%04lx]: %p: >>Create [%c%c%c%c%c%c] \"%S\", "
|
FspDebugLog("%S[TID=%04lx]: %p: >>Create [%c%c%c%c%c%c] \"%S\", "
|
||||||
"%s, CreateOptions=%lx, FileAttributes=%lx, Security=%s%s%s, "
|
"%s, CreateOptions=%lx, FileAttributes=%lx, Security=%s%s%s, "
|
||||||
"AllocationSize=%lx:%lx, "
|
"AllocationSize=%lx:%lx, "
|
||||||
"AccessToken=%p, DesiredAccess=%lx, GrantedAccess=%lx, "
|
"AccessToken=%p[PID=%lx], DesiredAccess=%lx, GrantedAccess=%lx, "
|
||||||
"ShareAccess=%lx\n",
|
"ShareAccess=%lx\n",
|
||||||
FspDiagIdent(), GetCurrentThreadId(), (PVOID)Request->Hint,
|
FspDiagIdent(), GetCurrentThreadId(), (PVOID)Request->Hint,
|
||||||
Request->Req.Create.UserMode ? 'U' : 'K',
|
Request->Req.Create.UserMode ? 'U' : 'K',
|
||||||
@ -319,7 +319,8 @@ FSP_API VOID FspDebugLogRequest(FSP_FSCTL_TRANSACT_REQ *Request)
|
|||||||
Sddl ? Sddl : "NULL",
|
Sddl ? Sddl : "NULL",
|
||||||
Sddl ? "\"" : "",
|
Sddl ? "\"" : "",
|
||||||
MAKE_UINT32_PAIR(Request->Req.Create.AllocationSize),
|
MAKE_UINT32_PAIR(Request->Req.Create.AllocationSize),
|
||||||
(PVOID)Request->Req.Create.AccessToken,
|
FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(Request->Req.Create.AccessToken),
|
||||||
|
FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(Request->Req.Create.AccessToken),
|
||||||
Request->Req.Create.DesiredAccess,
|
Request->Req.Create.DesiredAccess,
|
||||||
Request->Req.Create.GrantedAccess,
|
Request->Req.Create.GrantedAccess,
|
||||||
Request->Req.Create.ShareAccess);
|
Request->Req.Create.ShareAccess);
|
||||||
@ -459,7 +460,7 @@ FSP_API VOID FspDebugLogRequest(FSP_FSCTL_TRANSACT_REQ *Request)
|
|||||||
break;
|
break;
|
||||||
case 10/*FileRenameInformation*/:
|
case 10/*FileRenameInformation*/:
|
||||||
FspDebugLog("%S[TID=%04lx]: %p: >>SetInformation [Rename] %s%S%s%s, "
|
FspDebugLog("%S[TID=%04lx]: %p: >>SetInformation [Rename] %s%S%s%s, "
|
||||||
"NewFileName=\"%S\", AccessToken=%p\n",
|
"NewFileName=\"%S\", AccessToken=%p[PID=%lx]\n",
|
||||||
FspDiagIdent(), GetCurrentThreadId(), (PVOID)Request->Hint,
|
FspDiagIdent(), GetCurrentThreadId(), (PVOID)Request->Hint,
|
||||||
Request->FileName.Size ? "\"" : "",
|
Request->FileName.Size ? "\"" : "",
|
||||||
Request->FileName.Size ? (PWSTR)Request->Buffer : L"",
|
Request->FileName.Size ? (PWSTR)Request->Buffer : L"",
|
||||||
@ -468,7 +469,8 @@ FSP_API VOID FspDebugLogRequest(FSP_FSCTL_TRANSACT_REQ *Request)
|
|||||||
Request->Req.SetInformation.UserContext, Request->Req.SetInformation.UserContext2,
|
Request->Req.SetInformation.UserContext, Request->Req.SetInformation.UserContext2,
|
||||||
UserContextBuf),
|
UserContextBuf),
|
||||||
(PWSTR)(Request->Buffer + Request->Req.SetInformation.Info.Rename.NewFileName.Offset),
|
(PWSTR)(Request->Buffer + Request->Req.SetInformation.Info.Rename.NewFileName.Offset),
|
||||||
(PVOID)Request->Req.SetInformation.Info.Rename.AccessToken);
|
FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(Request->Req.SetInformation.Info.Rename.AccessToken),
|
||||||
|
FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(Request->Req.SetInformation.Info.Rename.AccessToken));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
FspDebugLog("%S[TID=%04lx]: %p: >>SetInformation [INVALID] %s%S%s%s\n",
|
FspDebugLog("%S[TID=%04lx]: %p: >>SetInformation [INVALID] %s%S%s%s\n",
|
||||||
|
@ -683,3 +683,8 @@ FSP_API BOOLEAN FspFileSystemIsOperationCaseSensitiveF(VOID)
|
|||||||
{
|
{
|
||||||
return FspFileSystemIsOperationCaseSensitive();
|
return FspFileSystemIsOperationCaseSensitive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FSP_API UINT32 FspFileSystemOperationProcessIdF(VOID)
|
||||||
|
{
|
||||||
|
return FspFileSystemOperationProcessId();
|
||||||
|
}
|
||||||
|
@ -283,6 +283,7 @@ static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv)
|
|||||||
context->private_data = f->data;
|
context->private_data = f->data;
|
||||||
context->uid = -1;
|
context->uid = -1;
|
||||||
context->gid = -1;
|
context->gid = -1;
|
||||||
|
context->pid = -1;
|
||||||
|
|
||||||
memset(&conn, 0, sizeof conn);
|
memset(&conn, 0, sizeof conn);
|
||||||
conn.proto_major = 7; /* pretend that we are FUSE kernel protocol 7.12 */
|
conn.proto_major = 7; /* pretend that we are FUSE kernel protocol 7.12 */
|
||||||
@ -737,7 +738,6 @@ FSP_FUSE_API struct fuse_context *fsp_fuse_get_context(struct fsp_fuse_env *env)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
context = FSP_FUSE_CONTEXT_FROM_HDR(contexthdr);
|
context = FSP_FUSE_CONTEXT_FROM_HDR(contexthdr);
|
||||||
context->pid = -1;
|
|
||||||
|
|
||||||
TlsSetValue(fsp_fuse_tlskey, context);
|
TlsSetValue(fsp_fuse_tlskey, context);
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
struct fuse_context *context;
|
struct fuse_context *context;
|
||||||
struct fsp_fuse_context_header *contexthdr;
|
struct fsp_fuse_context_header *contexthdr;
|
||||||
char *PosixPath = 0;
|
char *PosixPath = 0;
|
||||||
UINT32 Uid = -1, Gid = -1;
|
UINT32 Uid = -1, Gid = -1, Pid = -1;
|
||||||
PWSTR FileName = 0, Suffix;
|
PWSTR FileName = 0, Suffix;
|
||||||
WCHAR Root[2] = L"\\";
|
WCHAR Root[2] = L"\\";
|
||||||
HANDLE Token = 0;
|
HANDLE Token = 0;
|
||||||
@ -124,13 +124,15 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
FspPathSuffix((PWSTR)Request->Buffer, &FileName, &Suffix, Root);
|
FspPathSuffix((PWSTR)Request->Buffer, &FileName, &Suffix, Root);
|
||||||
else
|
else
|
||||||
FileName = (PWSTR)Request->Buffer;
|
FileName = (PWSTR)Request->Buffer;
|
||||||
Token = (HANDLE)Request->Req.Create.AccessToken;
|
Token = FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(Request->Req.Create.AccessToken);
|
||||||
|
Pid = FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(Request->Req.Create.AccessToken);
|
||||||
}
|
}
|
||||||
else if (FspFsctlTransactSetInformationKind == Request->Kind &&
|
else if (FspFsctlTransactSetInformationKind == Request->Kind &&
|
||||||
10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass)
|
10/*FileRenameInformation*/ == Request->Req.SetInformation.FileInformationClass)
|
||||||
{
|
{
|
||||||
FileName = (PWSTR)(Request->Buffer + Request->Req.SetInformation.Info.Rename.NewFileName.Offset);
|
FileName = (PWSTR)(Request->Buffer + Request->Req.SetInformation.Info.Rename.NewFileName.Offset);
|
||||||
Token = (HANDLE)Request->Req.SetInformation.Info.Rename.AccessToken;
|
Token = FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(Request->Req.SetInformation.Info.Rename.AccessToken);
|
||||||
|
Pid = FSP_FSCTL_TRANSACT_REQ_TOKEN_PID(Request->Req.SetInformation.Info.Rename.AccessToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != FileName)
|
if (0 != FileName)
|
||||||
@ -162,6 +164,7 @@ NTSTATUS fsp_fuse_op_enter(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
context->private_data = f->data;
|
context->private_data = f->data;
|
||||||
context->uid = Uid;
|
context->uid = Uid;
|
||||||
context->gid = Gid;
|
context->gid = Gid;
|
||||||
|
context->pid = Pid;
|
||||||
|
|
||||||
contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context);
|
contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context);
|
||||||
contexthdr->PosixPath = PosixPath;
|
contexthdr->PosixPath = PosixPath;
|
||||||
@ -189,6 +192,7 @@ NTSTATUS fsp_fuse_op_leave(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
context->private_data = 0;
|
context->private_data = 0;
|
||||||
context->uid = -1;
|
context->uid = -1;
|
||||||
context->gid = -1;
|
context->gid = -1;
|
||||||
|
context->pid = -1;
|
||||||
|
|
||||||
contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context);
|
contexthdr = FSP_FUSE_HDR_FROM_CONTEXT(context);
|
||||||
if (0 != contexthdr->PosixPath)
|
if (0 != contexthdr->PosixPath)
|
||||||
|
@ -172,8 +172,12 @@ FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
|
|
||||||
if (0 < SecurityDescriptorSize)
|
if (0 < SecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
if (AccessCheck(SecurityDescriptor, (HANDLE)Request->Req.Create.AccessToken, FILE_TRAVERSE,
|
if (AccessCheck(SecurityDescriptor,
|
||||||
&FspFileGenericMapping, PrivilegeSet, &PrivilegeSetLength, &TraverseAccess, &AccessStatus))
|
FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(Request->Req.Create.AccessToken),
|
||||||
|
FILE_TRAVERSE,
|
||||||
|
&FspFileGenericMapping,
|
||||||
|
PrivilegeSet, &PrivilegeSetLength,
|
||||||
|
&TraverseAccess, &AccessStatus))
|
||||||
Result = AccessStatus ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
|
Result = AccessStatus ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
|
||||||
else
|
else
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
@ -202,8 +206,12 @@ FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
if (0 == DesiredAccess)
|
if (0 == DesiredAccess)
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
else if (AccessCheck(SecurityDescriptor, (HANDLE)Request->Req.Create.AccessToken, DesiredAccess,
|
else if (AccessCheck(SecurityDescriptor,
|
||||||
&FspFileGenericMapping, PrivilegeSet, &PrivilegeSetLength, PGrantedAccess, &AccessStatus))
|
FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(Request->Req.Create.AccessToken),
|
||||||
|
DesiredAccess,
|
||||||
|
&FspFileGenericMapping,
|
||||||
|
PrivilegeSet, &PrivilegeSetLength,
|
||||||
|
PGrantedAccess, &AccessStatus))
|
||||||
Result = AccessStatus ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
|
Result = AccessStatus ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
|
||||||
else
|
else
|
||||||
Result = FspNtStatusFromWin32(GetLastError());
|
Result = FspNtStatusFromWin32(GetLastError());
|
||||||
@ -244,8 +252,12 @@ FSP_API NTSTATUS FspAccessCheckEx(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
((FILE_LIST_DIRECTORY & ParentAccess) ? FILE_READ_ATTRIBUTES : 0));
|
((FILE_LIST_DIRECTORY & ParentAccess) ? FILE_READ_ATTRIBUTES : 0));
|
||||||
if (0 != DesiredAccess2)
|
if (0 != DesiredAccess2)
|
||||||
{
|
{
|
||||||
if (AccessCheck(SecurityDescriptor, (HANDLE)Request->Req.Create.AccessToken, DesiredAccess2,
|
if (AccessCheck(SecurityDescriptor,
|
||||||
&FspFileGenericMapping, PrivilegeSet, &PrivilegeSetLength, PGrantedAccess, &AccessStatus))
|
FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(Request->Req.Create.AccessToken),
|
||||||
|
DesiredAccess2,
|
||||||
|
&FspFileGenericMapping,
|
||||||
|
PrivilegeSet, &PrivilegeSetLength,
|
||||||
|
PGrantedAccess, &AccessStatus))
|
||||||
Result = AccessStatus ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
|
Result = AccessStatus ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
|
||||||
else
|
else
|
||||||
/* any failure just becomes ACCESS DENIED at this point */
|
/* any failure just becomes ACCESS DENIED at this point */
|
||||||
@ -396,7 +408,7 @@ FSP_API NTSTATUS FspCreateSecurityDescriptor(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
(PSECURITY_DESCRIPTOR)(Request->Buffer + Request->Req.Create.SecurityDescriptor.Offset) : 0,
|
(PSECURITY_DESCRIPTOR)(Request->Buffer + Request->Req.Create.SecurityDescriptor.Offset) : 0,
|
||||||
PSecurityDescriptor,
|
PSecurityDescriptor,
|
||||||
0 != (Request->Req.Create.CreateOptions & FILE_DIRECTORY_FILE),
|
0 != (Request->Req.Create.CreateOptions & FILE_DIRECTORY_FILE),
|
||||||
(HANDLE)Request->Req.Create.AccessToken,
|
FSP_FSCTL_TRANSACT_REQ_TOKEN_HANDLE(Request->Req.Create.AccessToken),
|
||||||
&FspFileGenericMapping))
|
&FspFileGenericMapping))
|
||||||
return FspNtStatusFromWin32(GetLastError());
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user