Yes, you are right.
But my method is different from your.
I always use the driver below me and I’m the only level, which
is using his fileobjects. For my clients I have different (completly
my) fileobjects.
EG:
Some calls ZwCreateFile
-> NtCreateFile, IoCreateFile, ObOpenObjectByName …
IopParseFile - creates fileobject for me and calls IoCallDriver to call me
MyCreateDispatch - I will create and initialize new fileobject for the one
below me
and call IoCallDriver to pass the request down.
eg. NtfsFsdCreate -> NtfsCommonCreate creates the file using fileobject
created by me.
Of course I am using the same Irp as comes to me.
The only changes I’m doing are:
-> Set the NextIrpSp->FileObject to the newly created one
-> Change the Disposition to non-destructive one, …
But the routine you have studied (ZbfsCreateFile) is for another purpose.
It is for these instances where I need to create the file by using only
my next lower level components. Thus it is mostly equivalent to ZwCreateFile
with exception I and filters before me gets not called.
Paul
-----P?vodn? zpr?va-----
Od: Jamey Kirby [SMTP:xxxxx@storagecraft.com]
Odesl?no: 19. ?ervence 2000 19:19
Komu: File Systems Developers
P?edm?t: [ntfsd] RE: preventing recursive loop in create dispatch
hand lerAlso, I am trying to understand the need to open a file via an alternate
IRP
in a creation routine. If you are getting an IRP_MJ_CREATE and the file
is,
say, “c:\x.x”, why would anyone create a seperate file object, build a new
IRP and open the file “c:\x.x”? WOuld it not be better to simply let the
original IRP_MJ_CREATE go through and then perform some operation on the
file after completion?Am I missing something?
Jamey
> -----Original Message-----
> From: xxxxx@lists.osr.com
> [mailto:xxxxx@lists.osr.com]On Behalf Of Pavel Hrdina
> Sent: Wednesday, July 19, 2000 9:51 AM
> To: File Systems Developers
> Subject: [ntfsd] RE: preventing recursive loop in create dispatch hand
> ler
>
>
> I think the Geoff Clow is nearest to the TRUTH.
> It is neccessary to disassemble some parts of NTOS to
> definitely understand some interactions between components.
>
> I have used the following techniques:
>
> 1. I am using no Io Manager’s and Memory Manager’s ZwXxxx routines
> inside the FSD filter. I use them only from some system thread where
> I know I’m the Request Iniciator (mostly in Nt variant,
> because there is
> evident the Thread->PreviousMode is KernelMode and thus the mechanism
> for system calls [int 2e] is not needed at all).
>
> 2. For every mounted volume there is in our VCB:
>
> a) Physical device (named, eg. \Device\Harddisk0\Partition5)
> b) FSD device (mostly unnamed)
> c) Next lower device
>
> - to NextLowerDevice we will forward all requests
> - if we are attached right to FSD device, these two will be the same
> - for network redirectors the Physical device and FSD device
> are the same
> eg. \Device\LanmanRedirector
>
> 3. If I want to open the file, query or set some info on it:
>
> I have written some synchronous routines like a NtCreateFile,
> NtQueryInformationFile and NtSetInformation file. Each of
> it builds an IRP and sends it down to the Vcb->NextLowerDevice.
> Thus I’m always calling all the filter stack below me, but no
> filter above me gets called.
>
> I am appending the file APISUP.C which contains these routines and
> mechanisms I’m using. (Hardest routine to implement is Create and
> currently I know some of its disadvantages - base methods are taken
> from the IopParseDevice routine)
>
> Paul
>
> > <<apisup.c>>
> >
> >
>
>
> —
> You are currently subscribed to ntfsd as: xxxxx@sodatsw.cz
> To unsubscribe send a blank email to $subst(‘Email.Unsub’)</apisup.c>