From dcf7e4c5a6ead1253e40bc0a65007b257f608c4c Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sat, 22 Jun 2019 14:30:23 -0700 Subject: [PATCH] sys: fsext: FsextProvider testing --- opt/fsext/lib/winfsp-x64.lib | Bin 4336 -> 4424 bytes opt/fsext/lib/winfsp-x86.lib | Bin 4512 -> 4600 bytes src/sys/device.c | 7 ++----- src/sys/driver.h | 2 +- src/sys/fsext.c | 13 +++++++------ src/sys/util.c | 1 + src/sys/volume.c | 12 +++++++++++- tools/impdef.bat | 2 +- 8 files changed, 23 insertions(+), 14 deletions(-) diff --git a/opt/fsext/lib/winfsp-x64.lib b/opt/fsext/lib/winfsp-x64.lib index a1192e27671e614332e8b3dfe0e1a5e8d15ea173..9d30816f23e3a741e2684c24cbb804d3bca98d9a 100644 GIT binary patch literal 4424 zcmcInOK;Oa5dM<3l!i2ocpQ*G3Q!4pplw1N9zrNUil|6Sl)AtLk`NnWiN;YJXgP7? z#GN}Qegp@O91#b^u?NK8fLYt??An_b6iegv&SSsX*_qw-nd^;ivvnh}l98XRR>)=x z*_@V>`Kx~SN+75w0GtG7bHH2+NPGa2ZI9AAz-VFLqhy@;M5(ez3lE4-l>XvT>O1j? z=IcIvqn0T7i&3q%zEQbf)oZ1-t=rZ0ihjRZ+qK%yoX*9)LLRl+=61Op)xn#-lBc5I z-QK)cE8Wy@;*Qg~xQzzemWNKrxNW`Wim@PVqcodonWu)hGr z>AOq{59s>~@xIe{eIEEm^owLv$e6`6Qb=MRhj9dRID{D_5JP-`WQtXhl%DF68XS$j zgr&W^8k{vas8o7FIx5qj55iPgwT5#=kdMlCQI(glzza43fu~I0zum-w{iq-4fTa$1 zAaO(CjarhZ0biJiBv_t^M7c=APK@2)#94M;J1dz{ zC#AMp@XyS8!gxD{#rFK;qcKozdC#(8K7ILoam(+bL?7>X$8U>B-&(eeMz66*r>yrJ zr{*isPrpA!Z4s-VeZ7Lu1{FEtgva$5zlh9dI)-tAs+&D2c~a+bEKU1|JG?8V*ZU_& zH>_sYcI;=p%!TSwro6s+j|syMZ6aX4Faqr)?2Gv@<9^9N5$9spTuIne~VV6 z4(4MVeC9>K^}5A5?i@WVUnkFW$OwUs*5@$(Irj1&Hac+K@3AJ1NA&*N5^U3v)`3b19#_&YJTgaMAoXN80Bk%Yv%bNd{4dbluY4T&>JUJBdM0ItM@eVc;>^3f3Do0(4LaxZ&(UH(JbtKric{t<=zir7Flh1w_ Z=A4Wf+~fWgvoK`E6EfyQ)xT;O{|~8zj4S{E literal 4336 zcmcInNl)8A6ngeq5+ZsQiVbr5Qr@bK}eNKNMi$*N*u+efeXEH z>IotE1N{Y@dgKT6&_l(k2YyNE8{6Xg1kgFSN4N9fOmHBzM9KIR~ zhPXJhvN%`DO%^9%TCGj1(yo@TD_>+$su!e9S=FREjwEl_N=?Nm$SbP6yHKvJ$YN1h zmPKabl5pCnSX9u&t!+tAJ12dXG|4t7V{xP9rTVt4s{YocDh>2m_bXr4wx)L71A1z4qv*y(#Z+rHil-JG z#fT~~b-;51sykJ!D5AunIZWJgYMGN-Te{^}uER8|Lo6hC-UTod0occ?oWLpz#{rJ| z0M2``f>0rbeGPes*dOQxI7T`}JuG18f-uA&3cb(`JrIFT=l}r%5Nsj|kt(vKr*}y; zj|P*FwAWXIvYH1KOOH!O&-AB*5LHsG&RpT-?XsO$r6tVqtWAL9d8Y4mHZN;0VnMc8 z-l4X{`n28Y<&;}tw+r0Cx66Gjf!n}qAzWJRmcwm87sVy9mc}LVT%cwrMMFPf2Gu>) zsLggKV``k9k?VqZ5P}bl$VVXnSX0I`C`zApHv5;&Psn2D8~rfbEX3ap%3@h7_YYIi zeeC>1x-c0bY_pI&Gxahi8|xR~FVY2NV4H=+SrFShSk>ea*rZ;Twd}P zs0zflAkZ0S0d#M-C`X^0fn(~Vhz=TorIThH!hcF$=0ipY7&E^}6NEgzuTzq@l_kTe zaqIph9t8C)`JsD8`~&dH644M@Z!SwlD3fH#clu$rBuoCs>ib#K$LK@T%Ndu3{%UJ@ zjGcD0w*DZ3vBKU_Yf)Qi8Yohmq_+4c3t3uQDat2$zv+kB6204wuAj(0Lj2pxM(Z-4 zAh&r^pW*@8w;t$o4BO9nuB=(t-}}|KjH*%|G-1k`&?r{+^*sibCmwU*fC!q zX3)TFa#(VpSI*QlJp>#PeS)YV8>)2#b8xJC^Erk&H21mAkoZHvAL=MAM#mh-!qL=yZ7Dbp>H~w;KU+o8~Ts?JhQ)8?5Uu0_h>|2#_Z-J~Y8zrFHbz3ov<_;76D-FOTwv?k3t1`gTDwaU za^cFM;>uU(hvRn6a9=v~dhRvAJ-_eu+zHK3G;MRMdArrt>Ki*hw>F#Y+b!+L=s&OrKOR>r z(6sH{Mq``?Pew!@N&A=G?OR&?M*9Y|oA%(Qtsgs0%RDrCy4BJj8n&ZbwRI9`91OHr z3gT{>wsE}G8SEOpwz*^UYE_9bY*XSP^0rBgp*->?@znKw-O+;p%Bm!}sapqzZ5w9a zCav`DBg=3e*LAyV83V_(YDKn}IG)fl36q2|F1Bq-BEm6}Fi9A9jDF8NqBFQUHapJV z#&NA!3Q<0iQj+EhX`4Q2oU}+vAY zksnBZ7a>q)B;k?KKVAF8$QH7XxS6P}>s)fx&f z(lnl9Zk9_kW4Tc%0`7RilE)ARdhw~Vf3+U5hN@NMh6LSu9Lmb)8xP^oemSpcXe zab;p1X5BXxh&1V%2Ln?1`TbPt{d)n)T-;d4G{nhkfUEVMSaHwDN@m2$I@8bshBW2T z3a@{~55KW=;F>?P>lx*D>c2#uPayES@9QL`pi zIcok86My8W`Bc%6#J?9vkH`yUc52I2*Coq&`SuSXc-{`TTui=|g|Rp$Ip5?a<=eVg zXS%<|#2-Jlg_BsdK-eF(jum~g7WglObG4D;TK0u|#+k9(gz7g;?Z=8pfB@e2gqNba z68Eq0!Pp{%0@yzgcG|~|{N@J0)#>ESFJB3_^Vfu(QL&|uxr*{XtQ~XW85uR~nh*e2 zr;|@yErp->I-Ph{#!hzsP~o9YCu?&hBF?#lo(gIcaj{V`r}svjMfjf2u`e#E39d{5 yb=2u(i_E$E zUVuF>z=9PE7HC$82N)q1ELrd*1LxSj^|fQWjwn~UzJKT3@7(iuudl9mt=_@y{LMnJ zl&ZDjTCr4FDF^3^-f*q7>h<>W0Dc4}-vGH!z|tJR0j_he z-MUZ!xXzW`I`bCbI$Lz>OoPS^P21dR-D`KW`o_*5?afx_URyghjvm?rXxjE}vpKqs ze_R50x%21l_Fb)hr*j8d!yYtj{bbm(%qK=)x7zw6!yf9ETA|I1!-1AaLEJ6VHcqy> zgI%NFF?Woiee;;k;Apbd9Ug3)sHJj*@UfKA zZq6nh(<4pVEtXR3<|>}I2zZLa7hDq@8%I5}uS?jYR*xhR{B`|I{wR{MBf9KI^elz+ zn@QkP4p^K5-cJLs=7Dvp`_z9)1h40S!U9mH_U#N%q`3yQlnOA33Cv;|Gq{8)N9@JqoCKmAOQIRm^F!h9AcWG4 zw0W%ekLJQNbETj60+u*C8=g{lQINu4W!nVVBP|ppNol81rZ{VjP^PijC{t2aPrN4L ztQdED9Xq$)vi;O{qx`Jfy0Rwj?Y(?c$zty~_g7v4MW<7g<-WfE_|f$pcL=D|c_s#4 zt7885WuxC6cCXVd?Uu{b{73b(J4BXR6~%WRUCo=OOaS~(^|P3uRz=}mhS~+n4_xy8 zp>E)ZdCES{cD%&t==p=iEu&|dw)t>aSZe=TXl`!b<;8GeES7^e0OcX>QQD#m#62H` zB<5O0BKbB(1rz^^p)<3rA}$A-1YQQS65tTXKV3?Rjc9 zjYh8!?z!cv6;GW7{G4fLIy1t@mhj=F8zh}1wHSZCNs?R)OA_-yk>JP9Pf42KcRKsHcx0w{_DG`m-E^9$ rR-(P{8foHESQ7s&<-?4v`y|9%2vK^VeFI{Wweumw`!WBx5`6wE-cXgx diff --git a/src/sys/device.c b/src/sys/device.c index 321dcd6c..63cf14e0 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -329,7 +329,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject) if (0 != FsvolDeviceExtension->VolumeParams.FsextControlCode) { FSP_FSEXT_PROVIDER *Provider = FspFsextProvider( - FsvolDeviceExtension->VolumeParams.FsextControlCode, &Result); + FsvolDeviceExtension->VolumeParams.FsextControlCode, 0); if (0 != Provider) { Result = Provider->DeviceInit(DeviceObject, &FsvolDeviceExtension->VolumeParams); @@ -338,10 +338,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject) FsvolDeviceExtension->InitDoneFsext = 1; } else - { - ASSERT(!NT_SUCCESS(Result)); - return Result; - } + return STATUS_OBJECT_NAME_NOT_FOUND; } /* is there a virtual disk? */ diff --git a/src/sys/driver.h b/src/sys/driver.h index ecf63697..73e20fd3 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1188,7 +1188,7 @@ VOID FspDeviceGlobalUnlock(VOID) // STATUS_VOLUME_DISMOUNTED : STATUS_DEVICE_NOT_CONNECTED) /* fsext */ -FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult); +FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 FsextControlCode, PNTSTATUS PLoadResult); /* process buffers conditional usage */ static inline diff --git a/src/sys/fsext.c b/src/sys/fsext.c index b11a428f..38272502 100644 --- a/src/sys/fsext.c +++ b/src/sys/fsext.c @@ -25,7 +25,7 @@ static KSPIN_LOCK FsextSpinLock = 0; FSP_FSEXT_PROVIDER *FsextProvider; -FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult) +FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 FsextControlCode, PNTSTATUS PLoadResult) { FSP_FSEXT_PROVIDER *Provider; KIRQL Irql; @@ -33,6 +33,8 @@ FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult) KeAcquireSpinLock(&FsextSpinLock, &Irql); Provider = FsextProvider; KeReleaseSpinLock(&FsextSpinLock, Irql); + if (0 != Provider && FsextControlCode != Provider->DeviceTransactCode) + Provider = 0; if (0 != PLoadResult) { @@ -51,15 +53,12 @@ FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult) RtlInitUnicodeString(&Path, L"" FSP_REGKEY "\\Fsext"); RtlInitEmptyUnicodeString(&Name, Buf, sizeof Buf); - Result = RtlUnicodeStringPrintf(&Name, L"%08x", ControlCode); + Result = RtlUnicodeStringPrintf(&Name, L"%08x", FsextControlCode); ASSERT(NT_SUCCESS(Result)); Length = sizeof Value; Result = FspRegistryGetValue(&Path, &Name, &Value.V, &Length); - if (STATUS_SUCCESS != Result/*!NT_SUCCESS*/) + if (!NT_SUCCESS(Result)) { - if (STATUS_BUFFER_OVERFLOW == Result) - Result = STATUS_BUFFER_TOO_SMALL; - *PLoadResult = Result; return 0; } @@ -84,6 +83,8 @@ FSP_FSEXT_PROVIDER *FspFsextProvider(UINT32 ControlCode, PNTSTATUS PLoadResult) KeAcquireSpinLock(&FsextSpinLock, &Irql); Provider = FsextProvider; KeReleaseSpinLock(&FsextSpinLock, Irql); + if (0 != Provider && FsextControlCode != Provider->DeviceTransactCode) + Provider = 0; } *PLoadResult = 0 != Provider ? STATUS_SUCCESS : STATUS_OBJECT_NAME_NOT_FOUND; diff --git a/src/sys/util.c b/src/sys/util.c index 92ddcc04..1268f7cf 100644 --- a/src/sys/util.c +++ b/src/sys/util.c @@ -306,6 +306,7 @@ NTSTATUS FspRegistryGetValue(PUNICODE_STRING Path, PUNICODE_STRING ValueName, goto exit; Result = STATUS_SUCCESS; + /* NOTE: also converts STATUS_BUFFER_OVERFLOW to STATUS_SUCCESS */ exit: if (0 != Handle) diff --git a/src/sys/volume.c b/src/sys/volume.c index 77792dba..7e9ae3b0 100644 --- a/src/sys/volume.c +++ b/src/sys/volume.c @@ -100,6 +100,7 @@ static NTSTATUS FspVolumeCreateNoLock( UNICODE_STRING VolumeName; UNICODE_STRING FsmupDeviceName; WCHAR VolumeNameBuf[FSP_FSCTL_VOLUME_NAME_SIZE / sizeof(WCHAR)]; + FSP_FSEXT_PROVIDER *Provider = 0; PDEVICE_OBJECT FsvolDeviceObject; PDEVICE_OBJECT FsvrtDeviceObject; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; @@ -209,6 +210,14 @@ static NTSTATUS FspVolumeCreateNoLock( VolumeParams.AlwaysUseDoubleBuffering = 1; #endif + /* load any fsext provider */ + if (0 != VolumeParams.FsextControlCode) + { + Provider = FspFsextProvider(VolumeParams.FsextControlCode, &Result); + if (0 == Provider) + return Result; + } + /* create volume guid */ Result = FspCreateGuid(&Guid); if (!NT_SUCCESS(Result)) @@ -226,7 +235,8 @@ static NTSTATUS FspVolumeCreateNoLock( VolumeName.MaximumLength = VolumeName.Length; /* create the volume (and virtual disk) device(s) */ - Result = FspDeviceCreate(FspFsvolDeviceExtensionKind, 0, + Result = FspDeviceCreate(FspFsvolDeviceExtensionKind, + 0 == Provider ? 0 : Provider->DeviceExtensionSize, FsctlDeviceObject->DeviceType, FILE_DEVICE_DISK_FILE_SYSTEM == FsctlDeviceObject->DeviceType ? 0 : FILE_REMOTE_DEVICE, &FsvolDeviceObject); diff --git a/tools/impdef.bat b/tools/impdef.bat index 60e13df5..8abbec83 100644 --- a/tools/impdef.bat +++ b/tools/impdef.bat @@ -10,7 +10,7 @@ set infile=%infile:/=\% set outfile=%2 set outfile=%outfile:/=\% set workdir=!infile!.work -set workbase=!workdir!\%~n1 +set workbase=!workdir!\%~n2 set outarch=%~n2 set outarch=%outarch:~-3%