Querying file in create path

Hi
I am trying to query file with own irp in create path (!IRP_PAGING_IO &
!IRP_SYNCHRONOUS_PAGING_IO & FILE_OPEN & FILE_NON_DIRECTORY_FILE)of same
file. I alway get STATUS_INVALID_PARAMETER. Could you suggest me?

Thanks
Ramraraj


You are currently subscribed to ntfsd as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com

I assume you are querying the FSD after the file has been opened, not
before. If so, it would be helpful if you would post the relevant code so
we could see what the problem is.

-----Original Message-----
From: Ramaraj Pandian [mailto:xxxxx@dvdjukebox.com]
Sent: Wednesday, June 06, 2001 6:33 PM
To: File Systems Developers
Subject: [ntfsd] Querying file in create path

Hi
I am trying to query file with own irp in create path (!IRP_PAGING_IO &
!IRP_SYNCHRONOUS_PAGING_IO & FILE_OPEN & FILE_NON_DIRECTORY_FILE)of same
file. I alway get STATUS_INVALID_PARAMETER. Could you suggest me?

Thanks
Ramraraj


You are currently subscribed to ntfsd as: xxxxx@ntpsoftware.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Are you doing this in your completion routine? If not, the file object
passed in to the create call hasn’t been opened by the FSD yet, as that is
the point of the IRP_MJ_CREATE operation. That would certainly generate an
invalid parameter message.

Another thing to do is to recompile FAT (from the IFS Kit) and then debug
the problem by walking through the FAT code via the debugger.

Regards,

Tony Mason
Consulting Partner
OSR Open Systems Resources, Inc.
http://www.osr.com

-----Original Message-----
From: Ramaraj Pandian [mailto:xxxxx@dvdjukebox.com]
Sent: Wednesday, June 06, 2001 6:33 PM
To: File Systems Developers
Subject: [ntfsd] Querying file in create path

Hi
I am trying to query file with own irp in create path (!IRP_PAGING_IO &
!IRP_SYNCHRONOUS_PAGING_IO & FILE_OPEN & FILE_NON_DIRECTORY_FILE)of same
file. I alway get STATUS_INVALID_PARAMETER. Could you suggest me?

Thanks
Ramraraj


You are currently subscribed to ntfsd as: xxxxx@osr.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Rolling your own CREATE IRP is not this simple for sure.
IIRC Joel Smith succeeded in this. Contact him.

Max

----- Original Message -----
From: “Ramaraj Pandian”
To: “File Systems Developers”
Sent: Thursday, June 07, 2001 2:32 AM
Subject: [ntfsd] Querying file in create path

> Hi
> I am trying to query file with own irp in create path (!IRP_PAGING_IO &
> !IRP_SYNCHRONOUS_PAGING_IO & FILE_OPEN & FILE_NON_DIRECTORY_FILE)of same
> file. I alway get STATUS_INVALID_PARAMETER. Could you suggest me?
>
> Thanks
> Ramraraj
>
> —
> You are currently subscribed to ntfsd as: xxxxx@storagecraft.com
> To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com
>


You are currently subscribed to ntfsd as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com

Here is what I am trying to do:

case IRP_MJ_CREATE:
{

if( (Disposition & FILE_OPEN) && (Options & FILE_NON_DIRECTORY_FILE) &&
( (DesiredAccess & FILE_EXECUTE) || (DesiredAccess & FILE_READ_DATA) )
){
if(!(Irp->Flags & IRP_PAGING_IO) && !(Irp->Flags &
IRP_SYNCHRONOUS_PAGING_IO) ){

if(PwrFilterGetFileInformation(currentIrpStack->FileObject,
pPwrDevExt->FileSystem, FileBasicInformation,
&file_basic_info, sizeof(FILE_BASIC_INFORMATION)) ){

}
}
}
}

NTSTATUS
PwrFilterGetFileInformation(
PFILE_OBJECT FileObject,
PDEVICE_OBJECT DeviceObject,
FILE_INFORMATION_CLASS FileInformationClass,
PVOID FileQueryBuffer,
ULONG FileQueryBufferLength
)
{
KEVENT event;
IO_STATUS_BLOCK stat;
PIRP pIrp;
PIO_STACK_LOCATION pStack;
NTSTATUS ntRet;

DbgPrint(DBG_COMP_QUERY,DBG_LEVEL_INFO,(“PwrFilterGetOpenFileInformation: %s
for %x\n”, FileInformation[FileInformationClass], FileObject));

__try
{
__try
{
//initialize event to signal completion
KeInitializeEvent(&event, SynchronizationEvent,FALSE);

//allocate a new irp
pIrp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

//set a completion routine to free the irp
IoSetCompletionRoutine(pIrp, PwrFilterDefaultComplete, 0,TRUE, TRUE,
TRUE);

//setup the irp
pIrp->UserEvent = &event;
pIrp->AssociatedIrp.SystemBuffer = FileQueryBuffer;
pIrp->UserIosb = &stat;
pIrp->Tail.Overlay.Thread = PsGetCurrentThread();
pIrp->Tail.Overlay.OriginalFileObject = FileObject;
pIrp->RequestorMode = KernelMode;
pIrp->Flags = 0;

//Set up the I/O stack location.
pStack = IoGetNextIrpStackLocation(pIrp);
pStack->MajorFunction = IRP_MJ_QUERY_INFORMATION;
pStack->DeviceObject = DeviceObject;
pStack->FileObject = FileObject;
pStack->Parameters.QueryFile.Length = FileQueryBufferLength;

pStack->Parameters.QueryFile.FileInformationClass = FileInformationClass;

//Send it to the FSD
ntRet = IoCallDriver(DeviceObject, pIrp);
if (ntRet == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);
}
ntRet = stat.Status;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{

ntRet = GetExceptionCode();
}
}
__finally
{

}

//report the result
return ntRet;
}

-----Original Message-----
From: Smith, Joel [mailto:xxxxx@ntpsoftware.com]
Sent: Thursday, June 07, 2001 5:34 AM
To: File Systems Developers
Subject: [ntfsd] RE: Querying file in create path

I assume you are querying the FSD after the file has been opened, not
before. If so, it would be helpful if you would post the relevant code so
we could see what the problem is.

-----Original Message-----
From: Ramaraj Pandian [ mailto:xxxxx@dvdjukebox.com
mailto:xxxxx ]
Sent: Wednesday, June 06, 2001 6:33 PM
To: File Systems Developers
Subject: [ntfsd] Querying file in create path

Hi
I am trying to query file with own irp in create path (!IRP_PAGING_IO &
!IRP_SYNCHRONOUS_PAGING_IO & FILE_OPEN & FILE_NON_DIRECTORY_FILE)of same
file. I alway get STATUS_INVALID_PARAMETER. Could you suggest me?

Thanks
Ramraraj


You are currently subscribed to ntfsd as: xxxxx@ntpsoftware.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: xxxxx@dvdjukebox.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com</mailto:xxxxx>

Ramaraj,
I assume that this case statement is executing BEFORE your dispatch
routine passes the create irp down to the fsd (otherwise, this code would
crash the system). If so, your problem is that the file object you are
specifying for your query irp is not currently open. You either need to let
the IRP pass through to the file system (and query for whatever information
you need after a successful open, in a completion routine or simply after
the (possibly coerced) synchronous open) or open the target of the create
before in the front end of your dispatch routine, using
ObReferenceObjectByHandle to get a file object, and using that file object
to query information. Note that the latter method may lead to subtle
reentrancy conundrums which may cause interoperability with other filter
driver software, but that is a whole other issue.

-Joel

-----Original Message-----
From: Ramaraj Pandian [mailto:xxxxx@dvdjukebox.com]
Sent: Thursday, June 07, 2001 12:56 PM
To: File Systems Developers
Subject: [ntfsd] RE: Querying file in create path

Here is what I am trying to do:

case IRP_MJ_CREATE:
{

if( (Disposition & FILE_OPEN) && (Options & FILE_NON_DIRECTORY_FILE) &&
( (DesiredAccess & FILE_EXECUTE) || (DesiredAccess & FILE_READ_DATA) )
){
if(!(Irp->Flags & IRP_PAGING_IO) && !(Irp->Flags &
IRP_SYNCHRONOUS_PAGING_IO) ){

if(PwrFilterGetFileInformation(currentIrpStack->FileObject,
pPwrDevExt->FileSystem, FileBasicInformation,
&file_basic_info, sizeof(FILE_BASIC_INFORMATION)) ){

}
}
}
}

NTSTATUS
PwrFilterGetFileInformation(
PFILE_OBJECT FileObject,
PDEVICE_OBJECT DeviceObject,
FILE_INFORMATION_CLASS FileInformationClass,
PVOID FileQueryBuffer,
ULONG FileQueryBufferLength
)
{
KEVENT event;
IO_STATUS_BLOCK stat;
PIRP pIrp;
PIO_STACK_LOCATION pStack;
NTSTATUS ntRet;

DbgPrint(DBG_COMP_QUERY,DBG_LEVEL_INFO,(“PwrFilterGetOpenFileInformation: %s
for %x\n”, FileInformation[FileInformationClass], FileObject));

__try
{
__try
{
//initialize event to signal completion
KeInitializeEvent(&event, SynchronizationEvent,FALSE);

//allocate a new irp
pIrp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

//set a completion routine to free the irp
IoSetCompletionRoutine(pIrp, PwrFilterDefaultComplete, 0,TRUE, TRUE,
TRUE);

//setup the irp
pIrp->UserEvent = &event;
pIrp->AssociatedIrp.SystemBuffer = FileQueryBuffer;
pIrp->UserIosb = &stat;
pIrp->Tail.Overlay.Thread = PsGetCurrentThread();
pIrp->Tail.Overlay.OriginalFileObject = FileObject;
pIrp->RequestorMode = KernelMode;
pIrp->Flags = 0;

//Set up the I/O stack location.
pStack = IoGetNextIrpStackLocation(pIrp);
pStack->MajorFunction = IRP_MJ_QUERY_INFORMATION;
pStack->DeviceObject = DeviceObject;
pStack->FileObject = FileObject;
pStack->Parameters.QueryFile.Length = FileQueryBufferLength;

pStack->Parameters.QueryFile.FileInformationClass = FileInformationClass;

//Send it to the FSD
ntRet = IoCallDriver(DeviceObject, pIrp);
if (ntRet == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);
}
ntRet = stat.Status;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{

ntRet = GetExceptionCode();
}
}
__finally
{

}

//report the result
return ntRet;
}

-----Original Message-----
From: Smith, Joel [mailto:xxxxx@ntpsoftware.com]
Sent: Thursday, June 07, 2001 5:34 AM
To: File Systems Developers
Subject: [ntfsd] RE: Querying file in create path

I assume you are querying the FSD after the file has been opened, not
before. If so, it would be helpful if you would post the relevant code so
we could see what the problem is.

-----Original Message-----
From: Ramaraj Pandian [ mailto:xxxxx@dvdjukebox.com
mailto:xxxxx ]
Sent: Wednesday, June 06, 2001 6:33 PM
To: File Systems Developers
Subject: [ntfsd] Querying file in create path

Hi
I am trying to query file with own irp in create path (!IRP_PAGING_IO &
!IRP_SYNCHRONOUS_PAGING_IO & FILE_OPEN & FILE_NON_DIRECTORY_FILE)of same
file. I alway get STATUS_INVALID_PARAMETER. Could you suggest me?

Thanks
Ramraraj


You are currently subscribed to ntfsd as: xxxxx@ntpsoftware.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: xxxxx@dvdjukebox.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: xxxxx@ntpsoftware.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com</mailto:xxxxx>

Thanks Joel. It is very helpful.

----Original Message-----
From: Smith, Joel [mailto:xxxxx@ntpsoftware.com]
Sent: Thursday, June 07, 2001 11:17 AM
To: File Systems Developers
Subject: [ntfsd] RE: Querying file in create path

Ramaraj,
I assume that this case statement is executing BEFORE your dispatch
routine passes the create irp down to the fsd (otherwise, this code would
crash the system). If so, your problem is that the file object you are
specifying for your query irp is not currently open. You either need to let
the IRP pass through to the file system (and query for whatever information
you need after a successful open, in a completion routine or simply after
the (possibly coerced) synchronous open) or open the target of the create
before in the front end of your dispatch routine, using
ObReferenceObjectByHandle to get a file object, and using that file object
to query information. Note that the latter method may lead to subtle
reentrancy conundrums which may cause interoperability with other filter
driver software, but that is a whole other issue.

-Joel

-----Original Message-----
From: Ramaraj Pandian [mailto:xxxxx@dvdjukebox.com]
Sent: Thursday, June 07, 2001 12:56 PM
To: File Systems Developers
Subject: [ntfsd] RE: Querying file in create path

Here is what I am trying to do:

case IRP_MJ_CREATE:
{

if( (Disposition & FILE_OPEN) && (Options & FILE_NON_DIRECTORY_FILE) &&
( (DesiredAccess & FILE_EXECUTE) || (DesiredAccess & FILE_READ_DATA) )
){
if(!(Irp->Flags & IRP_PAGING_IO) && !(Irp->Flags &
IRP_SYNCHRONOUS_PAGING_IO) ){

if(PwrFilterGetFileInformation(currentIrpStack->FileObject,
pPwrDevExt->FileSystem, FileBasicInformation,
&file_basic_info, sizeof(FILE_BASIC_INFORMATION)) ){

}
}
}
}

NTSTATUS
PwrFilterGetFileInformation(
PFILE_OBJECT FileObject,
PDEVICE_OBJECT DeviceObject,
FILE_INFORMATION_CLASS FileInformationClass,
PVOID FileQueryBuffer,
ULONG FileQueryBufferLength
)
{
KEVENT event;
IO_STATUS_BLOCK stat;
PIRP pIrp;
PIO_STACK_LOCATION pStack;
NTSTATUS ntRet;

DbgPrint(DBG_COMP_QUERY,DBG_LEVEL_INFO,(“PwrFilterGetOpenFileInformation: %s
for %x\n”, FileInformation[FileInformationClass], FileObject));

__try
{
__try
{
//initialize event to signal completion
KeInitializeEvent(&event, SynchronizationEvent,FALSE);

//allocate a new irp
pIrp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

//set a completion routine to free the irp
IoSetCompletionRoutine(pIrp, PwrFilterDefaultComplete, 0,TRUE, TRUE,
TRUE);

//setup the irp
pIrp->UserEvent = &event;
pIrp->AssociatedIrp.SystemBuffer = FileQueryBuffer;
pIrp->UserIosb = &stat;
pIrp->Tail.Overlay.Thread = PsGetCurrentThread();
pIrp->Tail.Overlay.OriginalFileObject = FileObject;
pIrp->RequestorMode = KernelMode;
pIrp->Flags = 0;

//Set up the I/O stack location.
pStack = IoGetNextIrpStackLocation(pIrp);
pStack->MajorFunction = IRP_MJ_QUERY_INFORMATION;
pStack->DeviceObject = DeviceObject;
pStack->FileObject = FileObject;
pStack->Parameters.QueryFile.Length = FileQueryBufferLength;

pStack->Parameters.QueryFile.FileInformationClass = FileInformationClass;

//Send it to the FSD
ntRet = IoCallDriver(DeviceObject, pIrp);
if (ntRet == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);
}
ntRet = stat.Status;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{

ntRet = GetExceptionCode();
}
}
__finally
{

}

//report the result
return ntRet;
}

-----Original Message-----
From: Smith, Joel [mailto:xxxxx@ntpsoftware.com]
Sent: Thursday, June 07, 2001 5:34 AM
To: File Systems Developers
Subject: [ntfsd] RE: Querying file in create path

I assume you are querying the FSD after the file has been opened, not
before. If so, it would be helpful if you would post the relevant code so
we could see what the problem is.

-----Original Message-----
From: Ramaraj Pandian [ mailto:xxxxx@dvdjukebox.com
mailto:xxxxx ]
Sent: Wednesday, June 06, 2001 6:33 PM
To: File Systems Developers
Subject: [ntfsd] Querying file in create path

Hi
I am trying to query file with own irp in create path (!IRP_PAGING_IO &
!IRP_SYNCHRONOUS_PAGING_IO & FILE_OPEN & FILE_NON_DIRECTORY_FILE)of same
file. I alway get STATUS_INVALID_PARAMETER. Could you suggest me?

Thanks
Ramraraj


You are currently subscribed to ntfsd as: xxxxx@ntpsoftware.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: xxxxx@dvdjukebox.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: xxxxx@ntpsoftware.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: xxxxx@dvdjukebox.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com</mailto:xxxxx>

RE: [ntfsd] Querying file in create pathFile has not been opened yet. You
must do it via completion processing ina completion handler.
-----Original Message-----
From: xxxxx@lists.osr.com
[mailto:xxxxx@lists.osr.com]On Behalf Of Ramaraj Pandian
Sent: Thursday, June 07, 2001 9:56 AM
To: File Systems Developers
Subject: [ntfsd] RE: Querying file in create path

Here is what I am trying to do:

case IRP_MJ_CREATE:
{

if( (Disposition & FILE_OPEN) && (Options & FILE_NON_DIRECTORY_FILE)
&&
( (DesiredAccess & FILE_EXECUTE) || (DesiredAccess &
FILE_READ_DATA) ) ){
if(!(Irp->Flags & IRP_PAGING_IO) && !(Irp->Flags &
IRP_SYNCHRONOUS_PAGING_IO) ){

if(PwrFilterGetFileInformation(currentIrpStack->FileObject,
pPwrDevExt->FileSystem, FileBasicInformation,
&file_basic_info, sizeof(FILE_BASIC_INFORMATION)) ){

}
}
}
}

NTSTATUS
PwrFilterGetFileInformation(
PFILE_OBJECT FileObject,
PDEVICE_OBJECT DeviceObject,
FILE_INFORMATION_CLASS FileInformationClass,
PVOID FileQueryBuffer,
ULONG FileQueryBufferLength
)
{
KEVENT event;
IO_STATUS_BLOCK stat;
PIRP pIrp;
PIO_STACK_LOCATION pStack;
NTSTATUS ntRet;

DbgPrint(DBG_COMP_QUERY,DBG_LEVEL_INFO,(“PwrFilterGetOpenFileInformation: %s
for %x\n”, FileInformation[FileInformationClass], FileObject));

__try
{
__try
{
//initialize event to signal completion
KeInitializeEvent(&event, SynchronizationEvent,FALSE);

//allocate a new irp
pIrp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

//set a completion routine to free the irp
IoSetCompletionRoutine(pIrp, PwrFilterDefaultComplete, 0,TRUE, TRUE,
TRUE);

//setup the irp
pIrp->UserEvent = &event;
pIrp->AssociatedIrp.SystemBuffer = FileQueryBuffer;
pIrp->UserIosb = &stat;
pIrp->Tail.Overlay.Thread = PsGetCurrentThread();
pIrp->Tail.Overlay.OriginalFileObject = FileObject;
pIrp->RequestorMode = KernelMode;
pIrp->Flags = 0;

//Set up the I/O stack location.
pStack = IoGetNextIrpStackLocation(pIrp);
pStack->MajorFunction = IRP_MJ_QUERY_INFORMATION;
pStack->DeviceObject = DeviceObject;
pStack->FileObject = FileObject;
pStack->Parameters.QueryFile.Length = FileQueryBufferLength;

pStack->Parameters.QueryFile.FileInformationClass =
FileInformationClass;

//Send it to the FSD
ntRet = IoCallDriver(DeviceObject, pIrp);
if (ntRet == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, TRUE, NULL);
}
ntRet = stat.Status;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{

ntRet = GetExceptionCode();
}
}
__finally
{

}

//report the result
return ntRet;
}

-----Original Message-----
From: Smith, Joel [mailto:xxxxx@ntpsoftware.com]
Sent: Thursday, June 07, 2001 5:34 AM
To: File Systems Developers
Subject: [ntfsd] RE: Querying file in create path

I assume you are querying the FSD after the file has been opened, not
before. If so, it would be helpful if you would post the relevant code so
we could see what the problem is.

-----Original Message-----
From: Ramaraj Pandian [mailto:xxxxx@dvdjukebox.com]
Sent: Wednesday, June 06, 2001 6:33 PM
To: File Systems Developers
Subject: [ntfsd] Querying file in create path

Hi
I am trying to query file with own irp in create path (!IRP_PAGING_IO &
!IRP_SYNCHRONOUS_PAGING_IO & FILE_OPEN & FILE_NON_DIRECTORY_FILE)of same
file. I alway get STATUS_INVALID_PARAMETER. Could you suggest me?

Thanks
Ramraraj


You are currently subscribed to ntfsd as: xxxxx@ntpsoftware.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: xxxxx@dvdjukebox.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com

You are currently subscribed to ntfsd as: xxxxx@storagecraft.com
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com


You are currently subscribed to ntfsd as: $subst(‘Recip.EmailAddr’)
To unsubscribe send a blank email to leave-ntfsd-$subst(‘Recip.MemberIDChar’)@lists.osr.com