Please see comment.
NTSTATUS
SfDirectoryControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
PIO_STACK_LOCATION IrpStack;
IrpStack = IoGetCurrentIrpStackLocation(Irp);
if(IrpStack->MinorFunction == IRP_MN_QUERY_DIRECTORY)
{
KEVENT WaitEvent;
NTSTATUS Status;
KeInitializeEvent(&WaitEvent,SynchronizationEvent,false);
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine(
Irp,
SfDirectoryControlCompletion,
&WaitEvent,
TRUE,
TRUE,
TRUE
);
Status =
IoCallDriver(((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Att
achedToDeviceObject,Irp);
if(Status == STATUS_PENDING)
{
Status = KeWaitForSingleObject(&WaitEvent, Executive,
KernelMode, FALSE, NULL);
if(Status == STATUS_SUCCESS)
{
Status = Irp->IoStatus.Status;
}
}
//
// Processing Buffer
//
if(Status == STATUS_SUCCESS)
{
if(IrpStack->Parameters.QueryDirectory.FileInformationClass
== FileBothDirectoryInformation
)
{
UNICODE_STRING DirName;
WCHAR DirNameBuf[1024];
RtlZeroMemory(DirNameBuf,sizeof(DirNameBuf));
RtlInitEmptyUnicodeString(
&DirName,
DirNameBuf,
sizeof(DirNameBuf)
);
//
// System hang when running to the line,why?
//
SfGetObjectName(IrpStack->FileObject,&DirName);
DbgPrint(“SFilter : Query Dir = %ws”,DirName.Buffer);
}
}
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}
else
{
IoSkipCurrentIrpStackLocation(Irp);
return
IoCallDriver(((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Att
achedToDeviceObject,Irp);
}
}
NTSTATUS
SfDirectoryControlCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
)
{
UNREFERENCED_PARAMETER(DeviceObject);
UNREFERENCED_PARAMETER(Irp);
KeSetEvent((PKEVENT)Context,IO_NO_INCREMENT,false);
return STATUS_MORE_PROCESSING_REQUIRED;
}