Reparse is processed on IRP_MJ_CREATE not IRP_MJ_READ.
A caller has no idea there will be a mount point, so until you see the
STATUS_REPARSE in your filter you wouldn’t know either. The difference
is that your filter will see the STATUS_REPARSE but the original caller
will not.
Hint when trying to find data structure declarations - look in ntifs.h.
Even if you are using NOTEPAD as your programming editor, it does have a
search function and searching for the tag REPARSE turns up:
typedef struct _REPARSE_DATA_BUFFER {
ULONG ReparseTag;
USHORT ReparseDataLength;
USHORT Reserved;
union {
struct {
USHORT SubstituteNameOffset;
USHORT SubstituteNameLength;
USHORT PrintNameOffset;
USHORT PrintNameLength;
WCHAR PathBuffer[1];
} SymbolicLinkReparseBuffer;
struct {
USHORT SubstituteNameOffset;
USHORT SubstituteNameLength;
USHORT PrintNameOffset;
USHORT PrintNameLength;
WCHAR PathBuffer[1];
} MountPointReparseBuffer;
struct {
UCHAR DataBuffer[1];
} GenericReparseBuffer;
};
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
(which is itself a superstructure that overlays nicely with
REPARSE_GUID_DATA_BUFFER the structure following it in ntifs.h). AND
you will find some comments about all of this - data structures, reparse
point tags, GUIDs, etc. in the ntifs.h header file.
I think there are other discussions and articles on this topic on
OSRONLINE but I’ll leave the exercise of searching for them (heck, you
can even find them in Google) to you.
Regards,
Tony
Tony Mason
Consulting Partner
OSR Open Systems Resources, Inc.
http://www.osr.com
Looking forward to seeing you at the next OSR File Systems class in
Boston, MA April 18-21, 2006.