mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 08:23:05 -05:00
sys: IRP_MJ_QUERY_SECURITY
This commit is contained in:
parent
3cfdfba64c
commit
e7cef94507
@ -203,6 +203,9 @@ extern __declspec(selectany) int fsp_bp = 1;
|
|||||||
goto fsp_leave_label; \
|
goto fsp_leave_label; \
|
||||||
} while (0,0)
|
} while (0,0)
|
||||||
|
|
||||||
|
/* missing typedef */
|
||||||
|
typedef const void *PCVOID;
|
||||||
|
|
||||||
/* driver major functions */
|
/* driver major functions */
|
||||||
_Function_class_(DRIVER_DISPATCH)
|
_Function_class_(DRIVER_DISPATCH)
|
||||||
_IRQL_requires_max_(APC_LEVEL)
|
_IRQL_requires_max_(APC_LEVEL)
|
||||||
@ -318,6 +321,9 @@ BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams);
|
|||||||
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix);
|
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix);
|
||||||
NTSTATUS FspCreateGuid(GUID *Guid);
|
NTSTATUS FspCreateGuid(GUID *Guid);
|
||||||
NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes);
|
NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes);
|
||||||
|
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
||||||
|
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor);
|
||||||
|
|
||||||
/* utility: synchronous work queue */
|
/* utility: synchronous work queue */
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -401,9 +407,10 @@ NTSTATUS FspMetaCacheCreate(
|
|||||||
FSP_META_CACHE **PMetaCache);
|
FSP_META_CACHE **PMetaCache);
|
||||||
VOID FspMetaCacheDelete(FSP_META_CACHE *MetaCache);
|
VOID FspMetaCacheDelete(FSP_META_CACHE *MetaCache);
|
||||||
VOID FspMetaCacheInvalidateExpired(FSP_META_CACHE *MetaCache, UINT64 ExpirationTime);
|
VOID FspMetaCacheInvalidateExpired(FSP_META_CACHE *MetaCache, UINT64 ExpirationTime);
|
||||||
PVOID FspMetaCacheReferenceItemBuffer(FSP_META_CACHE *MetaCache, UINT64 ItemIndex, PULONG PSize);
|
BOOLEAN FspMetaCacheReferenceItemBuffer(FSP_META_CACHE *MetaCache, UINT64 ItemIndex,
|
||||||
VOID FspMetaCacheDereferenceItemBuffer(PVOID Buffer);
|
PCVOID *PBuffer, PULONG PSize);
|
||||||
UINT64 FspMetaCacheAddItem(FSP_META_CACHE *MetaCache, PVOID Buffer, ULONG Size);
|
VOID FspMetaCacheDereferenceItemBuffer(PCVOID Buffer);
|
||||||
|
UINT64 FspMetaCacheAddItem(FSP_META_CACHE *MetaCache, PCVOID Buffer, ULONG Size);
|
||||||
VOID FspMetaCacheInvalidateItem(FSP_META_CACHE *MetaCache, UINT64 ItemIndex);
|
VOID FspMetaCacheInvalidateItem(FSP_META_CACHE *MetaCache, UINT64 ItemIndex);
|
||||||
|
|
||||||
/* I/O processing */
|
/* I/O processing */
|
||||||
@ -624,6 +631,8 @@ typedef struct
|
|||||||
UINT64 ChangeTime;
|
UINT64 ChangeTime;
|
||||||
ULONG InfoChangeNumber;
|
ULONG InfoChangeNumber;
|
||||||
NTSTATUS CcStatus;
|
NTSTATUS CcStatus;
|
||||||
|
UINT64 Security;
|
||||||
|
ULONG SecurityChangeNumber;
|
||||||
/* read-only after creation (and insertion in the ContextTable) */
|
/* read-only after creation (and insertion in the ContextTable) */
|
||||||
PDEVICE_OBJECT FsvolDeviceObject;
|
PDEVICE_OBJECT FsvolDeviceObject;
|
||||||
UINT64 UserContext;
|
UINT64 UserContext;
|
||||||
@ -671,6 +680,10 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
|||||||
const FSP_FSCTL_FILE_INFO *FileInfo);
|
const FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
|
const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
|
||||||
|
BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize);
|
||||||
|
VOID FspFileNodeSetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size);
|
||||||
|
BOOLEAN FspFileNodeTrySetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size,
|
||||||
|
ULONG SecurityChangeNumber);
|
||||||
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc);
|
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc);
|
||||||
VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
|
VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
|
||||||
#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireSharedF(N, FspFileNodeAcquire ## F)
|
#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireSharedF(N, FspFileNodeAcquire ## F)
|
||||||
@ -680,6 +693,7 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
|
|||||||
#define FspFileNodeSetOwner(N,F,P) FspFileNodeSetOwnerF(N, FspFileNodeAcquire ## F, P)
|
#define FspFileNodeSetOwner(N,F,P) FspFileNodeSetOwnerF(N, FspFileNodeAcquire ## F, P)
|
||||||
#define FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F)
|
#define FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F)
|
||||||
#define FspFileNodeReleaseOwner(N,F,P) FspFileNodeReleaseOwnerF(N, FspFileNodeAcquire ## F, P)
|
#define FspFileNodeReleaseOwner(N,F,P) FspFileNodeReleaseOwnerF(N, FspFileNodeAcquire ## F, P)
|
||||||
|
#define FspFileNodeDereferenceSecurity(P) FspMetaCacheDereferenceItemBuffer(P)
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
#if DBG
|
#if DBG
|
||||||
|
@ -27,6 +27,10 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
|||||||
const FSP_FSCTL_FILE_INFO *FileInfo);
|
const FSP_FSCTL_FILE_INFO *FileInfo);
|
||||||
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
|
||||||
const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
|
const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
|
||||||
|
BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize);
|
||||||
|
VOID FspFileNodeSetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size);
|
||||||
|
BOOLEAN FspFileNodeTrySetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size,
|
||||||
|
ULONG SecurityChangeNumber);
|
||||||
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc);
|
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc);
|
||||||
VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
|
VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
|
||||||
|
|
||||||
@ -47,6 +51,9 @@ VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
|
|||||||
#pragma alloc_text(PAGE, FspFileNodeTryGetFileInfo)
|
#pragma alloc_text(PAGE, FspFileNodeTryGetFileInfo)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeSetFileInfo)
|
#pragma alloc_text(PAGE, FspFileNodeSetFileInfo)
|
||||||
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo)
|
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo)
|
||||||
|
#pragma alloc_text(PAGE, FspFileNodeReferenceSecurity)
|
||||||
|
#pragma alloc_text(PAGE, FspFileNodeSetSecurity)
|
||||||
|
#pragma alloc_text(PAGE, FspFileNodeTrySetSecurity)
|
||||||
#pragma alloc_text(PAGE, FspFileDescCreate)
|
#pragma alloc_text(PAGE, FspFileDescCreate)
|
||||||
#pragma alloc_text(PAGE, FspFileDescDelete)
|
#pragma alloc_text(PAGE, FspFileDescDelete)
|
||||||
#endif
|
#endif
|
||||||
@ -471,6 +478,40 @@ BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileOb
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
|
||||||
|
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject);
|
||||||
|
|
||||||
|
return FspMetaCacheReferenceItemBuffer(FsvolDeviceExtension->SecurityCache,
|
||||||
|
FileNode->Security, PBuffer, PSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID FspFileNodeSetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
|
||||||
|
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject);
|
||||||
|
|
||||||
|
FspMetaCacheInvalidateItem(FsvolDeviceExtension->SecurityCache, FileNode->Security);
|
||||||
|
FileNode->Security = FspMetaCacheAddItem(FsvolDeviceExtension->SecurityCache, Buffer, Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN FspFileNodeTrySetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size,
|
||||||
|
ULONG SecurityChangeNumber)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
if (FileNode->SecurityChangeNumber != SecurityChangeNumber)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
FspFileNodeSetSecurity(FileNode, Buffer, Size);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc)
|
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
@ -501,8 +501,7 @@ NTSTATUS FspFsvolQueryInformationComplete(
|
|||||||
if (!Success)
|
if (!Success)
|
||||||
{
|
{
|
||||||
FspIopRetryCompleteIrp(Irp, Response, &Result);
|
FspIopRetryCompleteIrp(Irp, Response, &Result);
|
||||||
|
FSP_RETURN();
|
||||||
return Result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!FspFileNodeTrySetFileInfo(FileNode, FileObject, &Response->Rsp.QueryInformation.FileInfo,
|
if (!FspFileNodeTrySetFileInfo(FileNode, FileObject, &Response->Rsp.QueryInformation.FileInfo,
|
||||||
|
@ -148,12 +148,14 @@ VOID FspMetaCacheInvalidateExpired(FSP_META_CACHE *MetaCache, UINT64 ExpirationT
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PVOID FspMetaCacheReferenceItemBuffer(FSP_META_CACHE *MetaCache, UINT64 ItemIndex, PULONG PSize)
|
BOOLEAN FspMetaCacheReferenceItemBuffer(FSP_META_CACHE *MetaCache, UINT64 ItemIndex,
|
||||||
|
PCVOID *PBuffer, PULONG PSize)
|
||||||
{
|
{
|
||||||
|
*PBuffer = 0;
|
||||||
if (0 != PSize)
|
if (0 != PSize)
|
||||||
*PSize = 0;
|
*PSize = 0;
|
||||||
if (0 == MetaCache || 0 == ItemIndex)
|
if (0 == MetaCache || 0 == ItemIndex)
|
||||||
return 0;
|
return FALSE;
|
||||||
FSP_META_CACHE_ITEM *Item = 0;
|
FSP_META_CACHE_ITEM *Item = 0;
|
||||||
FSP_META_CACHE_ITEM_BUFFER *ItemBuffer;
|
FSP_META_CACHE_ITEM_BUFFER *ItemBuffer;
|
||||||
KIRQL Irql;
|
KIRQL Irql;
|
||||||
@ -162,23 +164,24 @@ PVOID FspMetaCacheReferenceItemBuffer(FSP_META_CACHE *MetaCache, UINT64 ItemInde
|
|||||||
if (0 == Item)
|
if (0 == Item)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&MetaCache->SpinLock, Irql);
|
KeReleaseSpinLock(&MetaCache->SpinLock, Irql);
|
||||||
return 0;
|
return FALSE;
|
||||||
}
|
}
|
||||||
InterlockedIncrement(&Item->RefCount);
|
InterlockedIncrement(&Item->RefCount);
|
||||||
KeReleaseSpinLock(&MetaCache->SpinLock, Irql);
|
KeReleaseSpinLock(&MetaCache->SpinLock, Irql);
|
||||||
ItemBuffer = Item->ItemBuffer;
|
ItemBuffer = Item->ItemBuffer;
|
||||||
|
*PBuffer = ItemBuffer->Buffer;
|
||||||
if (0 != PSize)
|
if (0 != PSize)
|
||||||
*PSize = ItemBuffer->Size;
|
*PSize = ItemBuffer->Size;
|
||||||
return ItemBuffer->Buffer;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID FspMetaCacheDereferenceItemBuffer(PVOID Buffer)
|
VOID FspMetaCacheDereferenceItemBuffer(PCVOID Buffer)
|
||||||
{
|
{
|
||||||
FSP_META_CACHE_ITEM_BUFFER *ItemBuffer = (PVOID)((PUINT8)Buffer - sizeof *ItemBuffer);
|
FSP_META_CACHE_ITEM_BUFFER *ItemBuffer = (PVOID)((PUINT8)Buffer - sizeof *ItemBuffer);
|
||||||
FspMetaCacheDereferenceItem(ItemBuffer->Item);
|
FspMetaCacheDereferenceItem(ItemBuffer->Item);
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT64 FspMetaCacheAddItem(FSP_META_CACHE *MetaCache, PVOID Buffer, ULONG Size)
|
UINT64 FspMetaCacheAddItem(FSP_META_CACHE *MetaCache, PCVOID Buffer, ULONG Size)
|
||||||
{
|
{
|
||||||
if (0 == MetaCache)
|
if (0 == MetaCache)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -12,6 +12,7 @@ FSP_IOCMPL_DISPATCH FspFsvolQuerySecurityComplete;
|
|||||||
static NTSTATUS FspFsvolSetSecurity(
|
static NTSTATUS FspFsvolSetSecurity(
|
||||||
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||||
FSP_IOCMPL_DISPATCH FspFsvolSetSecurityComplete;
|
FSP_IOCMPL_DISPATCH FspFsvolSetSecurityComplete;
|
||||||
|
static FSP_IOP_REQUEST_FINI FspFsvolSecurityRequestFini;
|
||||||
FSP_DRIVER_DISPATCH FspQuerySecurity;
|
FSP_DRIVER_DISPATCH FspQuerySecurity;
|
||||||
FSP_DRIVER_DISPATCH FspSetSecurity;
|
FSP_DRIVER_DISPATCH FspSetSecurity;
|
||||||
|
|
||||||
@ -20,16 +21,72 @@ FSP_DRIVER_DISPATCH FspSetSecurity;
|
|||||||
#pragma alloc_text(PAGE, FspFsvolQuerySecurityComplete)
|
#pragma alloc_text(PAGE, FspFsvolQuerySecurityComplete)
|
||||||
#pragma alloc_text(PAGE, FspFsvolSetSecurity)
|
#pragma alloc_text(PAGE, FspFsvolSetSecurity)
|
||||||
#pragma alloc_text(PAGE, FspFsvolSetSecurityComplete)
|
#pragma alloc_text(PAGE, FspFsvolSetSecurityComplete)
|
||||||
|
#pragma alloc_text(PAGE, FspFsvolSecurityRequestFini)
|
||||||
#pragma alloc_text(PAGE, FspQuerySecurity)
|
#pragma alloc_text(PAGE, FspQuerySecurity)
|
||||||
#pragma alloc_text(PAGE, FspSetSecurity)
|
#pragma alloc_text(PAGE, FspSetSecurity)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
/* QuerySecurity */
|
||||||
|
RequestFileNode = 0,
|
||||||
|
RequestSecurityChangeNumber = 1,
|
||||||
|
|
||||||
|
/* SetSecurity */
|
||||||
|
//RequestFileNode = 0,
|
||||||
|
};
|
||||||
|
|
||||||
static NTSTATUS FspFsvolQuerySecurity(
|
static NTSTATUS FspFsvolQuerySecurity(
|
||||||
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||||
{
|
{
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
/* is this a valid FileObject? */
|
||||||
|
if (!FspFileNodeIsValid(IrpSp->FileObject->FsContext))
|
||||||
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
||||||
|
NTSTATUS Result;
|
||||||
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
|
FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
|
||||||
|
SECURITY_INFORMATION SecurityInformation = IrpSp->Parameters.QuerySecurity.SecurityInformation;
|
||||||
|
PVOID Buffer = Irp->UserBuffer;
|
||||||
|
ULONG Length = IrpSp->Parameters.QuerySecurity.Length;
|
||||||
|
PVOID SecurityBuffer;
|
||||||
|
|
||||||
|
ASSERT(FileNode == FileDesc->FileNode);
|
||||||
|
|
||||||
|
FspFileNodeAcquireShared(FileNode, Main);
|
||||||
|
if (FspFileNodeReferenceSecurity(FileNode, &SecurityBuffer, 0))
|
||||||
|
{
|
||||||
|
FspFileNodeRelease(FileNode, Main);
|
||||||
|
|
||||||
|
Result = FspQuerySecurityDescriptorInfo(SecurityInformation, Buffer, &Length, SecurityBuffer);
|
||||||
|
FspFileNodeDereferenceSecurity(SecurityBuffer);
|
||||||
|
|
||||||
|
Irp->IoStatus.Information = Length;
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
FspFileNodeAcquireShared(FileNode, Pgio);
|
||||||
|
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request;
|
||||||
|
|
||||||
|
Result = FspIopCreateRequestEx(Irp, 0, 0, FspFsvolSecurityRequestFini, &Request);
|
||||||
|
if (!NT_SUCCESS(Result))
|
||||||
|
{
|
||||||
|
FspFileNodeRelease(FileNode, Full);
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Request->Kind = FspFsctlTransactQuerySecurityKind;
|
||||||
|
Request->Req.QuerySecurity.UserContext = FileNode->UserContext;
|
||||||
|
Request->Req.QuerySecurity.UserContext2 = FileDesc->UserContext2;
|
||||||
|
|
||||||
|
FspFileNodeSetOwner(FileNode, Full, Request);
|
||||||
|
FspIopRequestContext(Request, RequestFileNode) = FileNode;
|
||||||
|
|
||||||
|
return FSP_STATUS_IOQ_POST;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS FspFsvolQuerySecurityComplete(
|
NTSTATUS FspFsvolQuerySecurityComplete(
|
||||||
@ -37,6 +94,55 @@ NTSTATUS FspFsvolQuerySecurityComplete(
|
|||||||
{
|
{
|
||||||
FSP_ENTER_IOC(PAGED_CODE());
|
FSP_ENTER_IOC(PAGED_CODE());
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Response->IoStatus.Status))
|
||||||
|
{
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
Result = Response->IoStatus.Status;
|
||||||
|
FSP_RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
|
SECURITY_INFORMATION SecurityInformation = IrpSp->Parameters.QuerySecurity.SecurityInformation;
|
||||||
|
PVOID Buffer = Irp->UserBuffer;
|
||||||
|
ULONG Length = IrpSp->Parameters.QuerySecurity.Length;
|
||||||
|
PVOID SecurityBuffer = 0;
|
||||||
|
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
|
||||||
|
BOOLEAN Success;
|
||||||
|
|
||||||
|
if (0 != FspIopRequestContext(Request, RequestFileNode))
|
||||||
|
{
|
||||||
|
FspIopRequestContext(Request, RequestSecurityChangeNumber) = (PVOID)FileNode->SecurityChangeNumber;
|
||||||
|
FspIopRequestContext(Request, RequestFileNode) = 0;
|
||||||
|
|
||||||
|
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
||||||
|
}
|
||||||
|
|
||||||
|
Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Main);
|
||||||
|
if (!Success)
|
||||||
|
{
|
||||||
|
FspIopRetryCompleteIrp(Irp, Response, &Result);
|
||||||
|
FSP_RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
|
Success = !FspFileNodeTrySetSecurity(FileNode,
|
||||||
|
Response->Buffer, Response->Rsp.QuerySecurity.SecurityDescriptor.Size,
|
||||||
|
(ULONG)(UINT_PTR)FspIopRequestContext(Request, RequestSecurityChangeNumber));
|
||||||
|
Success = Success && FspFileNodeReferenceSecurity(FileNode, &SecurityBuffer, 0);
|
||||||
|
FspFileNodeRelease(FileNode, Main);
|
||||||
|
if (Success)
|
||||||
|
{
|
||||||
|
Result = FspQuerySecurityDescriptorInfo(SecurityInformation, Buffer, &Length, SecurityBuffer);
|
||||||
|
FspFileNodeDereferenceSecurity(SecurityBuffer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SecurityBuffer = (PVOID)Response->Buffer;
|
||||||
|
Result = FspQuerySecurityDescriptorInfo(SecurityInformation, Buffer, &Length, SecurityBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
Irp->IoStatus.Information = Length;
|
||||||
|
|
||||||
FSP_LEAVE_IOC("FileObject=%p, SecurityInformation=%x",
|
FSP_LEAVE_IOC("FileObject=%p, SecurityInformation=%x",
|
||||||
IrpSp->FileObject, IrpSp->Parameters.QuerySecurity.SecurityInformation);
|
IrpSp->FileObject, IrpSp->Parameters.QuerySecurity.SecurityInformation);
|
||||||
}
|
}
|
||||||
@ -58,6 +164,16 @@ NTSTATUS FspFsvolSetSecurityComplete(
|
|||||||
IrpSp->FileObject, IrpSp->Parameters.SetSecurity.SecurityInformation);
|
IrpSp->FileObject, IrpSp->Parameters.SetSecurity.SecurityInformation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VOID FspFsvolSecurityRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Context[4])
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
FSP_FILE_NODE *FileNode = Context[RequestFileNode];
|
||||||
|
|
||||||
|
if (0 != FileNode)
|
||||||
|
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS FspQuerySecurity(
|
NTSTATUS FspQuerySecurity(
|
||||||
PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,10 @@
|
|||||||
BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams);
|
BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams);
|
||||||
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix);
|
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix);
|
||||||
NTSTATUS FspCreateGuid(GUID *Guid);
|
NTSTATUS FspCreateGuid(GUID *Guid);
|
||||||
|
NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes);
|
||||||
|
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
||||||
|
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor);
|
||||||
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
|
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
|
||||||
PWORKER_THREAD_ROUTINE Routine, PVOID Context);
|
PWORKER_THREAD_ROUTINE Routine, PVOID Context);
|
||||||
VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem);
|
VOID FspExecuteSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem);
|
||||||
@ -22,6 +26,8 @@ static KDEFERRED_ROUTINE FspQueueDelayedWorkItemDPC;
|
|||||||
#pragma alloc_text(PAGE, FspUnicodePathIsValid)
|
#pragma alloc_text(PAGE, FspUnicodePathIsValid)
|
||||||
#pragma alloc_text(PAGE, FspUnicodePathSuffix)
|
#pragma alloc_text(PAGE, FspUnicodePathSuffix)
|
||||||
#pragma alloc_text(PAGE, FspCreateGuid)
|
#pragma alloc_text(PAGE, FspCreateGuid)
|
||||||
|
#pragma alloc_text(PAGE, FspCcSetFileSizes)
|
||||||
|
#pragma alloc_text(PAGE, FspQuerySecurityDescriptorInfo)
|
||||||
#pragma alloc_text(PAGE, FspInitializeSynchronousWorkItem)
|
#pragma alloc_text(PAGE, FspInitializeSynchronousWorkItem)
|
||||||
#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItem)
|
#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItem)
|
||||||
#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItemRoutine)
|
#pragma alloc_text(PAGE, FspExecuteSynchronousWorkItemRoutine)
|
||||||
@ -41,6 +47,8 @@ static const LONG Delays[] =
|
|||||||
|
|
||||||
PVOID FspAllocMustSucceed(SIZE_T Size)
|
PVOID FspAllocMustSucceed(SIZE_T Size)
|
||||||
{
|
{
|
||||||
|
// !PAGED_CODE();
|
||||||
|
|
||||||
PVOID Result;
|
PVOID Result;
|
||||||
LARGE_INTEGER Delay;
|
LARGE_INTEGER Delay;
|
||||||
|
|
||||||
@ -57,6 +65,8 @@ PVOID FspAllocMustSucceed(SIZE_T Size)
|
|||||||
|
|
||||||
PVOID FspAllocateIrpMustSucceed(CCHAR StackSize)
|
PVOID FspAllocateIrpMustSucceed(CCHAR StackSize)
|
||||||
{
|
{
|
||||||
|
// !PAGED_CODE();
|
||||||
|
|
||||||
PIRP Result;
|
PIRP Result;
|
||||||
LARGE_INTEGER Delay;
|
LARGE_INTEGER Delay;
|
||||||
|
|
||||||
@ -145,6 +155,8 @@ NTSTATUS FspCreateGuid(GUID *Guid)
|
|||||||
|
|
||||||
NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes)
|
NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes)
|
||||||
{
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
CcSetFileSizes(FileObject, FileSizes);
|
CcSetFileSizes(FileObject, FileSizes);
|
||||||
@ -156,6 +168,27 @@ NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS FspQuerySecurityDescriptorInfo(SECURITY_INFORMATION SecurityInformation,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor, PULONG PLength,
|
||||||
|
PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
NTSTATUS Result;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Result = SeQuerySecurityDescriptorInfo(&SecurityInformation,
|
||||||
|
SecurityDescriptor, PLength, &ObjectsSecurityDescriptor);
|
||||||
|
}
|
||||||
|
except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Result = STATUS_INVALID_USER_BUFFER;
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_BUFFER_TOO_SMALL == Result ? STATUS_BUFFER_OVERFLOW : Result;
|
||||||
|
}
|
||||||
|
|
||||||
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
|
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
|
||||||
PWORKER_THREAD_ROUTINE Routine, PVOID Context)
|
PWORKER_THREAD_ROUTINE Routine, PVOID Context)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user