sys: FspFsvolCreatePrepare

This commit is contained in:
Bill Zissimopoulos 2015-12-04 11:17:56 -08:00
parent e0c47750d9
commit 3e4cfdd143
4 changed files with 76 additions and 27 deletions

View File

@ -12,17 +12,17 @@ static NTSTATUS FspFsvrtCreate(
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
static NTSTATUS FspFsvolCreate( static NTSTATUS FspFsvolCreate(
PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
FSP_IOPREP_DISPATCH FspFsvolCreatePrepare;
FSP_IOCMPL_DISPATCH FspFsvolCreateComplete;
FSP_DRIVER_DISPATCH FspCreate; FSP_DRIVER_DISPATCH FspCreate;
FSP_IOPREP_DISPATCH FspCreatePrepare;
FSP_IOCMPL_DISPATCH FspCreateComplete;
#ifdef ALLOC_PRAGMA #ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FspFsctlCreate) #pragma alloc_text(PAGE, FspFsctlCreate)
#pragma alloc_text(PAGE, FspFsvrtCreate) #pragma alloc_text(PAGE, FspFsvrtCreate)
#pragma alloc_text(PAGE, FspFsvolCreate) #pragma alloc_text(PAGE, FspFsvolCreate)
#pragma alloc_text(PAGE, FspFsvolCreatePrepare)
#pragma alloc_text(PAGE, FspFsvolCreateComplete)
#pragma alloc_text(PAGE, FspCreate) #pragma alloc_text(PAGE, FspCreate)
#pragma alloc_text(PAGE, FspCreatePrepare)
#pragma alloc_text(PAGE, FspCreateComplete)
#endif #endif
static NTSTATUS FspFsctlCreate( static NTSTATUS FspFsctlCreate(
@ -277,7 +277,7 @@ static NTSTATUS FspFsvolCreate(
{ {
Result = ObOpenObjectByPointer( Result = ObOpenObjectByPointer(
SeQuerySubjectContextToken(&AccessState->SubjectSecurityContext), SeQuerySubjectContextToken(&AccessState->SubjectSecurityContext),
OBJ_KERNEL_HANDLE, 0, TOKEN_QUERY, 0, KernelMode, &AccessToken); OBJ_KERNEL_HANDLE, 0, 0, *SeTokenObjectType, KernelMode, &AccessToken);
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))
{ {
FspFileContextDelete(FsContext); FspFileContextDelete(FsContext);
@ -285,6 +285,7 @@ static NTSTATUS FspFsvolCreate(
} }
/* send the kernel handle and change it into a process handle at prepare time */ /* send the kernel handle and change it into a process handle at prepare time */
Irp->Tail.Overlay.DriverContext[1] = AccessToken;
Request->Req.Create.AccessToken = (UINT_PTR)AccessToken; Request->Req.Create.AccessToken = (UINT_PTR)AccessToken;
} }
@ -311,6 +312,52 @@ static NTSTATUS FspFsvolCreate(
return STATUS_PENDING; return STATUS_PENDING;
} }
NTSTATUS FspFsvolCreatePrepare(
PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request)
{
FSP_ENTER_IOP(PAGED_CODE());
HANDLE KernelModeAccessToken = (HANDLE)Request->Req.Create.AccessToken;
HANDLE UserModeAccessToken;
PACCESS_TOKEN AccessToken;
if (0 == KernelModeAccessToken)
FSP_RETURN(Result = STATUS_SUCCESS);
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(IrpSp->DeviceObject);
ASSERT(FspFsvolDeviceExtensionKind == FsvolDeviceExtension->Base.Kind);
Request->Req.Create.AccessToken = 0;
Irp->Tail.Overlay.DriverContext[1] = 0;
Result = ObReferenceObjectByHandle(KernelModeAccessToken,
0, *SeTokenObjectType, KernelMode, &AccessToken, 0);
ObCloseHandle(KernelModeAccessToken, KernelMode);
if (!NT_SUCCESS(Result))
FSP_RETURN();
Result = ObOpenObjectByPointer(AccessToken,
0, 0, TOKEN_QUERY, *SeTokenObjectType, UserMode, &UserModeAccessToken);
ObDereferenceObject(AccessToken);
if (!NT_SUCCESS(Result))
FSP_RETURN();
Irp->Tail.Overlay.DriverContext[1] = UserModeAccessToken;
Request->Req.Create.AccessToken = (UINT_PTR)UserModeAccessToken;
FSP_LEAVE_IOP();
}
VOID FspFsvolCreateComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{
FSP_ENTER_IOC(PAGED_CODE());
FSP_LEAVE_IOC(
"FileObject=%p[%p:\"%wZ\"]",
IrpSp->FileObject, IrpSp->FileObject->RelatedFileObject, IrpSp->FileObject->FileName);
}
NTSTATUS FspCreate( NTSTATUS FspCreate(
PDEVICE_OBJECT DeviceObject, PIRP Irp) PDEVICE_OBJECT DeviceObject, PIRP Irp)
{ {
@ -348,21 +395,3 @@ NTSTATUS FspCreate(
Irp->Overlay.AllocationSize.HighPart, Irp->Overlay.AllocationSize.LowPart, Irp->Overlay.AllocationSize.HighPart, Irp->Overlay.AllocationSize.LowPart,
Irp->AssociatedIrp.SystemBuffer, IrpSp->Parameters.Create.EaLength); Irp->AssociatedIrp.SystemBuffer, IrpSp->Parameters.Create.EaLength);
} }
NTSTATUS FspCreatePrepare(
PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request)
{
PAGED_CODE();
return STATUS_SUCCESS;
}
VOID FspCreateComplete(
PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response)
{
FSP_ENTER_IOC(PAGED_CODE());
FSP_LEAVE_IOC(
"FileObject=%p[%p:\"%wZ\"]",
IrpSp->FileObject, IrpSp->FileObject->RelatedFileObject, IrpSp->FileObject->FileName);
}

View File

@ -63,10 +63,10 @@ NTSTATUS DriverEntry(
DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = FspSetSecurity; DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = FspSetSecurity;
/* setup the I/O preparation functions */ /* setup the I/O preparation functions */
FspIopPrepareFunction[IRP_MJ_CREATE] = FspCreatePrepare; FspIopPrepareFunction[IRP_MJ_CREATE] = FspFsvolCreatePrepare;
/* setup the I/O completion functions */ /* setup the I/O completion functions */
FspIopCompleteFunction[IRP_MJ_CREATE] = FspCreateComplete; FspIopCompleteFunction[IRP_MJ_CREATE] = FspFsvolCreateComplete;
FspIopCompleteFunction[IRP_MJ_CLOSE] = FspCloseComplete; FspIopCompleteFunction[IRP_MJ_CLOSE] = FspCloseComplete;
FspIopCompleteFunction[IRP_MJ_READ] = FspReadComplete; FspIopCompleteFunction[IRP_MJ_READ] = FspReadComplete;
FspIopCompleteFunction[IRP_MJ_WRITE] = FspWriteComplete; FspIopCompleteFunction[IRP_MJ_WRITE] = FspWriteComplete;

View File

@ -127,6 +127,12 @@
FspIopCompleteRequestEx(Irp, Result, fsp_device_release);\ FspIopCompleteRequestEx(Irp, Result, fsp_device_release);\
); \ ); \
return Result return Result
#define FSP_ENTER_IOP(...) \
NTSTATUS Result = STATUS_SUCCESS; \
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); (VOID)IrpSp;\
FSP_ENTER_NOCRIT_(__VA_ARGS__)
#define FSP_LEAVE_IOP() \
FSP_LEAVE_NOCRIT_(); return Result
#define FSP_ENTER_IOC(...) \ #define FSP_ENTER_IOC(...) \
NTSTATUS Result = STATUS_SUCCESS; \ NTSTATUS Result = STATUS_SUCCESS; \
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); (VOID)IrpSp;\ PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); (VOID)IrpSp;\
@ -203,10 +209,10 @@ _IRQL_requires_max_(APC_LEVEL)
_IRQL_requires_same_ _IRQL_requires_same_
typedef VOID FSP_IOCMPL_DISPATCH( typedef VOID FSP_IOCMPL_DISPATCH(
_Inout_ PIRP Irp, _In_ const FSP_FSCTL_TRANSACT_RSP *Response); _Inout_ PIRP Irp, _In_ const FSP_FSCTL_TRANSACT_RSP *Response);
FSP_IOPREP_DISPATCH FspCreatePrepare; FSP_IOPREP_DISPATCH FspFsvolCreatePrepare;
FSP_IOCMPL_DISPATCH FspCleanupComplete; FSP_IOCMPL_DISPATCH FspCleanupComplete;
FSP_IOCMPL_DISPATCH FspCloseComplete; FSP_IOCMPL_DISPATCH FspCloseComplete;
FSP_IOCMPL_DISPATCH FspCreateComplete; FSP_IOCMPL_DISPATCH FspFsvolCreateComplete;
FSP_IOCMPL_DISPATCH FspDeviceControlComplete; FSP_IOCMPL_DISPATCH FspDeviceControlComplete;
FSP_IOCMPL_DISPATCH FspDirectoryControlComplete; FSP_IOCMPL_DISPATCH FspDirectoryControlComplete;
FSP_IOCMPL_DISPATCH FspFileSystemControlComplete; FSP_IOCMPL_DISPATCH FspFileSystemControlComplete;

View File

@ -65,6 +65,20 @@ VOID FspIopCompleteRequestEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceRelease)
Irp->Tail.Overlay.DriverContext[0] = 0; Irp->Tail.Overlay.DriverContext[0] = 0;
} }
if (0 != Irp->Tail.Overlay.DriverContext[1])
{
#if DBG
NTSTATUS Result0;
Result0 = ObCloseHandle(Irp->Tail.Overlay.DriverContext[1], KernelMode);
if (!NT_SUCCESS(Result0))
DEBUGLOG("ObCloseHandle() = %s", NtStatusSym(Result0));
#else
ObCloseHandle(Irp->Tail.Overlay.DriverContext[1], KernelMode);
#endif
Irp->Tail.Overlay.DriverContext[1] = 0;
}
PDEVICE_OBJECT DeviceObject = IoGetCurrentIrpStackLocation(Irp)->DeviceObject; PDEVICE_OBJECT DeviceObject = IoGetCurrentIrpStackLocation(Irp)->DeviceObject;
if (!NT_SUCCESS(Result)) if (!NT_SUCCESS(Result))