| 1024 | } |
| 1025 | |
| 1026 | NTSTATUS |
| 1027 | Ext2NotifyChangeDirectory ( |
| 1028 | IN PEXT2_IRP_CONTEXT IrpContext |
| 1029 | ) |
| 1030 | { |
| 1031 | PDEVICE_OBJECT DeviceObject; |
| 1032 | BOOLEAN CompleteRequest = TRUE; |
| 1033 | NTSTATUS Status = STATUS_UNSUCCESSFUL; |
| 1034 | PEXT2_VCB Vcb = NULL; |
| 1035 | PEXT2_FCB Fcb = NULL; |
| 1036 | PEXT2_CCB Ccb = NULL; |
| 1037 | PIRP Irp = NULL; |
| 1038 | PIO_STACK_LOCATION IrpSp; |
| 1039 | PFILE_OBJECT FileObject; |
| 1040 | ULONG CompletionFilter; |
| 1041 | BOOLEAN WatchTree; |
| 1042 | |
| 1043 | BOOLEAN bFcbAcquired = FALSE; |
| 1044 | |
| 1045 | __try { |
| 1046 | |
| 1047 | ASSERT(IrpContext); |
| 1048 | ASSERT((IrpContext->Identifier.Type == EXT2ICX) && |
| 1049 | (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT))); |
| 1050 | |
| 1051 | // |
| 1052 | // Always set the wait flag in the Irp context for the original request. |
| 1053 | // |
| 1054 | |
| 1055 | SetFlag( IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT ); |
| 1056 | |
| 1057 | DeviceObject = IrpContext->DeviceObject; |
| 1058 | |
| 1059 | if (IsExt2FsDevice(DeviceObject)) { |
| 1060 | Status = STATUS_INVALID_DEVICE_REQUEST; |
| 1061 | __leave; |
| 1062 | } |
| 1063 | |
| 1064 | Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension; |
| 1065 | |
| 1066 | ASSERT(Vcb != NULL); |
| 1067 | ASSERT((Vcb->Identifier.Type == EXT2VCB) && |
| 1068 | (Vcb->Identifier.Size == sizeof(EXT2_VCB))); |
| 1069 | |
| 1070 | FileObject = IrpContext->FileObject; |
| 1071 | Fcb = (PEXT2_FCB) FileObject->FsContext; |
| 1072 | ASSERT(Fcb); |
| 1073 | if (Fcb->Identifier.Type == EXT2VCB) { |
| 1074 | DbgBreak(); |
| 1075 | Status = STATUS_INVALID_PARAMETER; |
| 1076 | __leave; |
| 1077 | } |
| 1078 | ASSERT((Fcb->Identifier.Type == EXT2FCB) && |
| 1079 | (Fcb->Identifier.Size == sizeof(EXT2_FCB))); |
| 1080 | |
| 1081 | Ccb = (PEXT2_CCB) FileObject->FsContext2; |
| 1082 | ASSERT(Ccb); |
| 1083 | ASSERT((Ccb->Identifier.Type == EXT2CCB) && |
no test coverage detected