NTSTATUS DokanDispatchDirectoryControl(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp) { NTSTATUS status = STATUS_NOT_IMPLEMENTED; PFILE_OBJECT fileObject; PIO_STACK_LOCATION irpSp; PDokanVCB vcb; __try { DDbgPrint("==> DokanDirectoryControl\n"); irpSp = IoGetCurrentIrpStackLocation(Irp); fileObject = irpSp->FileObject; if (fileObject == NULL) { DDbgPrint(" fileObject is NULL\n"); status = STATUS_INVALID_PARAMETER; __leave; } vcb = DeviceObject->DeviceExtension; if (GetIdentifierType(vcb) != VCB || !DokanCheckCCB(vcb->Dcb, fileObject->FsContext2)) { status = STATUS_INVALID_PARAMETER; __leave; } DDbgPrint(" ProcessId %lu\n", IoGetRequestorProcessId(Irp)); DokanPrintFileName(fileObject); if (irpSp->MinorFunction == IRP_MN_QUERY_DIRECTORY) { status = DokanQueryDirectory(DeviceObject, Irp); } else if (irpSp->MinorFunction == IRP_MN_NOTIFY_CHANGE_DIRECTORY) { status = DokanNotifyChangeDirectory(DeviceObject, Irp); } else { DDbgPrint(" invalid minor function\n"); status = STATUS_INVALID_PARAMETER; } } __finally { DokanCompleteIrpRequest(Irp, status, 0); DDbgPrint("<== DokanDirectoryControl\n"); } return status; }
NTSTATUS DokanDispatchDirectoryControl( __in PDEVICE_OBJECT DeviceObject, __in PIRP Irp ) { NTSTATUS status = STATUS_NOT_IMPLEMENTED; PFILE_OBJECT fileObject; PIO_STACK_LOCATION irpSp; PDokanCCB ccb; PDokanVCB vcb; //PAGED_CODE(); __try { FsRtlEnterFileSystem(); DDbgPrint("==> DokanDirectoryControl"); irpSp = IoGetCurrentIrpStackLocation(Irp); fileObject = irpSp->FileObject; if (fileObject == NULL) { DDbgPrint(" failed fileObject is NULL"); status = STATUS_INVALID_PARAMETER; __leave; } vcb = DeviceObject->DeviceExtension; if (GetIdentifierType(vcb) != VCB || !DokanCheckCCB(vcb->Dcb, fileObject->FsContext2)) { status = STATUS_INVALID_PARAMETER; __leave; } DDbgPrint(" ProcessId %lu\n", IoGetRequestorProcessId(Irp)); DokanPrintFileName(fileObject); if (irpSp->MinorFunction == IRP_MN_QUERY_DIRECTORY) { status = DokanQueryDirectory(DeviceObject, Irp); } else if( irpSp->MinorFunction == IRP_MN_NOTIFY_CHANGE_DIRECTORY) { status = DokanNotifyChangeDirectory(DeviceObject, Irp); } else { DDbgPrint(" invalid minor function"); status = STATUS_INVALID_PARAMETER; } } __finally { if (status != STATUS_PENDING) { Irp->IoStatus.Status = status; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); } DokanPrintNTStatus(status); DDbgPrint("<== DokanDirectoryControl"); FsRtlExitFileSystem(); } return status; }