From 39c189aff778ddf5cc8913544ba8d8995330b033 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sat, 16 Nov 2019 14:02:44 -0800 Subject: [PATCH] sys: fsext: FspFsextProviderTransact --- opt/fsext/inc/winfsp/fsext.h | 3 ++ opt/fsext/lib/winfsp-x64.lib | Bin 4424 -> 4672 bytes opt/fsext/lib/winfsp-x86.lib | Bin 4600 -> 4868 bytes src/sys/fsext.c | 53 +++++++++++++++++++++++++++++++++++ tools/build-sample.bat | 0 tools/fsreg.bat | 0 tools/impdef.bat | 0 7 files changed, 56 insertions(+) mode change 100644 => 100755 tools/build-sample.bat mode change 100644 => 100755 tools/fsreg.bat mode change 100644 => 100755 tools/impdef.bat diff --git a/opt/fsext/inc/winfsp/fsext.h b/opt/fsext/inc/winfsp/fsext.h index 5344795d..e2b180f3 100644 --- a/opt/fsext/inc/winfsp/fsext.h +++ b/opt/fsext/inc/winfsp/fsext.h @@ -53,6 +53,9 @@ typedef struct FSP_DDI_DEF(NTSTATUS, FspFsextProviderRegister, FSP_FSEXT_PROVIDER *Provider) +FSP_DDI_DEF(NTSTATUS, FspFsextProviderTransact, + PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject, + FSP_FSCTL_TRANSACT_RSP *Response, FSP_FSCTL_TRANSACT_REQ **PRequest) FSP_DDI_DEF(NTSTATUS, FspPosixMapUidToSid, UINT32 Uid, diff --git a/opt/fsext/lib/winfsp-x64.lib b/opt/fsext/lib/winfsp-x64.lib index 9d30816f23e3a741e2684c24cbb804d3bca98d9a..3ab901fb4e51b6a62b81c39ff390d785c2f0ea3c 100644 GIT binary patch delta 950 zcmZ{jO=}ZT6o%hPW-`5*&$Ma8RH%&=G%D6;T1OWmmO>%cEV}5Xrp2~Up&F7P?u0H} z#~u(}iEDAu&L0T4kuFMISyYOGi>`|QK+l~a$wbnDm$@_VbH47}`J8KwH?sp%*S#AP zlb*L_WnOsKCeMb~QWC%jpzi?U2rzPhc^t}G1Ef-=Q0@UBWp0LYrU5B;E>x<;9Lw1Y zWiJ4McKOb-4y7uUS!!rSDv2{&%I)Gzef4>xTzmR#ePy*aUt4}sUw+g;rLw+Jt<2P` z{cZY@IPWhi_hY?N6}nS7Jl2j590?$20LLbwoY3?yElUsMNx!MiE5m&m|C{z$iOzJo zIMJPH=8|NUB z`&71~K!%!DI)M0iGQv+E7cVn06ixaJ#A=ga@_0KUR=!)xg;`xW`ag+2u;!?B) LgIg$TK@0x?edXe- delta 813 zcmZ{hJx|+E7=@4R#IbMeYloyx`H&!ip%hgmmJ*<CPzV8g9}q`?Gf3pO0VQvg$kBPulG};A4$oQsFp<3AIm_++(>bp! z=TfQLeZI4|`?B4A^7QcJ6Lkyq=)1O~j}>d(6qDR6ECBm9aKtqS4$$_2kq79!-)5l0 z`ytORc;9n@bJit$d?OT)gM3g`L=VJl zbWoI8mVP-El|pCEO1jSdc-V9|)59uxvh1i{i~JlqKL@=rr|6lir>THG%SueunKBgh z!YI?Rtfi?q%f8OaQPtZ>+X21vE3y5EL-KU!?WXN2{qf30b^0OOCUSJ8*J#}zE5aFZ z5tX6-9(~l8=*-U)3FvJpq2`&g6m_aq=y7Q*i>bJeqHOwBTD!fE;66X|HCmqV{{nim Bn;rlF diff --git a/opt/fsext/lib/winfsp-x86.lib b/opt/fsext/lib/winfsp-x86.lib index 6616c9bbdeb2f04f6ade0daeced081a15e155e88..7870c6e6807369c041b77f55d2e73fe74790acae 100644 GIT binary patch delta 924 zcmaKq%WD&16vfXxGmp$G4NdToYDF=znOxQ+8Q{JZ|?6q_ntfRYv@US>zGk4Rn8a7 z;}@x$=zm>PfH4bL8-TqFIGd4Nt_h{~6>I}SPA-zS2M7gvq|_R-EPp+c zCv#n>70GS0U%OVjPG7VO)HP4MkgjE?n+vVgYGdW$y*mqynMQrNS--t{h36d8vv%y< znUr43y(z|v#r+ubmd7z>4Pb+3-L-*Dhx53s6tEotIX>?(r1SqZezxudGM`(lHgmiJ z7*L_Xg98^PlCY3~4jU5W!)mH1(lfPmbcP*efE>-BisE*Ds*4g$=uS_loBC5J9xAVV zTYA?q4J{V6YG-K7^1{kx%Z%|=JFhW6_mQqz1D%()9;0A>Kb>>Z zwzxRTsU@h-f1jj9XRw!f<)+UF<}5QZZ>Bcgynp1&`tJXGJM18CD^O`i$7*ERik)=!B1taLT`$&a%ZqxIm`JeAXL*>u zdIx&3O}NY{dhe%cQXZs7e#}Gcvk>%!Gw0dIWS<98mVO)pnPMCPS#%?at)AxyOJWY2 H-Uj7AU%}a= delta 764 zcmZ`$ze^io7=AAIBlqjO%O#SiShN*0L`7og6%mAr4i1u{4h~AXbgD=Oamb*Hf|CgE z!^buu7Z>x;``kVcM0_1;r;HOAMf*VN7aAhXTxS#uZQ*7aE{t$ z`EYJF97~?hHh>`@e+gL6fD;1lOM(K=7$-a#?r8$=9+2?634%R9!rxCIo&X7NCxPhj zd#BY}S^d;p+h{E<)21;^ZF_`FWs%CpKy;y8=(V|;zh5~Jf9#n_6eJ9$| zzbes#aiC;tR@L{rB04wqO!*t9LceT3X0B~3qrY*gI_tOp(jR*?s<}pnYnv5nijs8E z7crkM`Q}yVw>qtFIh5Yf>kOt z{hl>xfF=X3)V_eRpcb1K*sRmX!g@BlOh1bQG2LL=pzFd)O0zRAC!O+F(2v{<9S42o m=8H+WDyvMo4Kn3qccvZLUD6gb3XDN|^m;OSOW1T({O}4r+?;9v diff --git a/src/sys/fsext.c b/src/sys/fsext.c index e4faacb0..3e3601cf 100644 --- a/src/sys/fsext.c +++ b/src/sys/fsext.c @@ -132,3 +132,56 @@ NTSTATUS FspFsextProviderRegister(FSP_FSEXT_PROVIDER *Provider) return Result; } + +NTSTATUS FspFsextProviderTransact(PDEVICE_OBJECT DeviceObject, PFILE_OBJECT FileObject, + FSP_FSCTL_TRANSACT_RSP *Response, FSP_FSCTL_TRANSACT_REQ **PRequest) +{ + /* + * This function uses IoBuildDeviceIoControlRequest to build an IRP and then send it + * to the WinFsp driver. IoBuildDeviceIoControlRequest places the IRP in the IRP queue + * thus allowing it to be cancelled with CancelSynchronousIo. + * + * Special kernel APC's must be enabled: + * See https://www.osr.com/blog/2018/02/14/beware-iobuilddeviceiocontrolrequest/ + */ + ASSERT(!KeAreAllApcsDisabled()); + + NTSTATUS Result; + IO_STATUS_BLOCK IoStatus; + PIRP Irp; + PIO_STACK_LOCATION IrpSp; + + if (0 != PRequest) + *PRequest = 0; + + if (0 == DeviceObject) + DeviceObject = IoGetRelatedDeviceObject(FileObject); + + Irp = IoBuildDeviceIoControlRequest(FSP_FSCTL_TRANSACT_INTERNAL, + DeviceObject, + Response, + 0 != Response ? Response->Size : 0, + PRequest, + 0 != PRequest ? sizeof(PVOID) : 0, + FALSE, + 0, + &IoStatus); + if (0 == Irp) + return STATUS_INSUFFICIENT_RESOURCES; + + /* + * IoBuildDeviceIoControlRequest builds an IOCTL IRP without a FileObject. + * Patch it so that it is an FSCTL IRP with a FileObject. Mark it as + * IRP_SYNCHRONOUS_API so that CancelSynchronousIo can cancel it. + */ + Irp->Flags |= IRP_SYNCHRONOUS_API; + IrpSp = IoGetNextIrpStackLocation(Irp); + IrpSp->MajorFunction = IRP_MJ_FILE_SYSTEM_CONTROL; + IrpSp->MinorFunction = IRP_MN_USER_FS_REQUEST; + IrpSp->FileObject = FileObject; + + Result = IoCallDriver(DeviceObject, Irp); + ASSERT(STATUS_PENDING != Result); + + return Result; +} diff --git a/tools/build-sample.bat b/tools/build-sample.bat old mode 100644 new mode 100755 diff --git a/tools/fsreg.bat b/tools/fsreg.bat old mode 100644 new mode 100755 diff --git a/tools/impdef.bat b/tools/impdef.bat old mode 100644 new mode 100755