PACCESS_STATE AccessState;
PVCB Vcb = NULL;
- BOOLEAN AcquiredVcb = FALSE;
+ _SEH2_VOLATILE BOOLEAN AcquiredVcb = FALSE;
BOOLEAN OpenExisting = FALSE;
PERESOURCE Res1 = NULL;
PERESOURCE Res2 = NULL;
PtrUDFFCB PtrRelatedFCB = NULL, PtrNewFcb = NULL;
PtrUDFNTRequiredFCB NtReqFcb;
- ULONG ReturnedInformation;
+ ULONG ReturnedInformation = 0;
UNICODE_STRING TargetObjectName;
UNICODE_STRING RelatedObjectName;
if (Vcb->SoftEjectReq) {
AdPrint((" Eject requested\n"));
+ ReturnedInformation = FILE_DOES_NOT_EXIST;
try_return(RC = STATUS_FILE_INVALID);
}
if ((RequestedDisposition != FILE_OPEN) && (RequestedDisposition != FILE_OPEN_IF)) {
// cannot create a new volume, I'm afraid ...
+ ReturnedInformation = FILE_DOES_NOT_EXIST;
try_return(RC = STATUS_ACCESS_DENIED);
}
#endif //UDF_READ_ONLY_BUILD
- KdPrint((" ShareAccess %x, DesiredAccess %x\n", ShareAccess, DesiredAccess));
+ UDFPrint((" ShareAccess %x, DesiredAccess %x\n", ShareAccess, DesiredAccess));
/*
if(!(ShareAccess & (FILE_SHARE_WRITE | FILE_SHARE_DELETE)) &&
!(DesiredAccess & (FILE_GENERIC_WRITE & ~SYNCHRONIZE)) &&
*/
if(!(DesiredAccess & ((GENERIC_WRITE | FILE_GENERIC_WRITE) & ~(SYNCHRONIZE | READ_CONTROL))) &&
(ShareAccess & FILE_SHARE_READ) ) {
- KdPrint((" R/O volume open\n"));
+ UDFPrint((" R/O volume open\n"));
} else {
- KdPrint((" R/W volume open\n"));
+ UDFPrint((" R/W volume open\n"));
if(Vcb->VCBFlags & UDF_VCB_FLAGS_MEDIA_READ_ONLY) {
- KdPrint((" media-ro\n"));
+ UDFPrint((" media-ro\n"));
try_return(RC = STATUS_MEDIA_WRITE_PROTECTED);
}
}
// As soon as OpenVolume flushes the volume
// we should complete all pending requests (Close)
- KdPrint((" set UDF_IRP_CONTEXT_FLUSH2_REQUIRED\n"));
+ UDFPrint((" set UDF_IRP_CONTEXT_FLUSH2_REQUIRED\n"));
PtrIrpContext->IrpContextFlags |= UDF_IRP_CONTEXT_FLUSH2_REQUIRED;
/*
if ((Vcb->VCBHandleCount) &&
!(ShareAccess & FILE_SHARE_READ)) {
// Sharing violation
- KdPrint((" !FILE_SHARE_READ + open handles (%d)\n", Vcb->VCBHandleCount));
+ UDFPrint((" !FILE_SHARE_READ + open handles (%d)\n", Vcb->VCBHandleCount));
try_return(RC = STATUS_SHARING_VIOLATION);
}
if(PtrIrpContext->IrpContextFlags & UDF_IRP_CONTEXT_FLUSH2_REQUIRED) {
- KdPrint((" perform flush\n"));
+ UDFPrint((" perform flush\n"));
PtrIrpContext->IrpContextFlags &= ~UDF_IRP_CONTEXT_FLUSH2_REQUIRED;
UDFInterlockedIncrement((PLONG)&(Vcb->VCBOpenCount));
if((ShareAccess & FILE_SHARE_READ) &&
((Vcb->VCBOpenCount - UDF_RESIDUAL_REFERENCE) != (Vcb->VCBOpenCountRO))) {
- KdPrint((" FILE_SHARE_READ + R/W handles: %d(%d) -> STATUS_SHARING_VIOLATION ?\n",
+ UDFPrint((" FILE_SHARE_READ + R/W handles: %d(%d) -> STATUS_SHARING_VIOLATION ?\n",
Vcb->VCBOpenCount - UDF_RESIDUAL_REFERENCE,
Vcb->VCBOpenCountRO));
/* we shall not check it here, let System do it in IoCheckShareAccess() */
}
// Lock the volume
if(!(ShareAccess & FILE_SHARE_READ)) {
- KdPrint((" set Lock\n"));
+ UDFPrint((" set Lock\n"));
Vcb->VCBFlags |= UDF_VCB_FLAGS_VOLUME_LOCKED;
Vcb->VolumeLockFileObject = PtrNewFileObject;
UndoLock = TRUE;
} else
if(DesiredAccess & ((GENERIC_WRITE | FILE_GENERIC_WRITE) & ~(SYNCHRONIZE | READ_CONTROL))) {
- KdPrint((" set UDF_IRP_CONTEXT_FLUSH_REQUIRED\n"));
+ UDFPrint((" set UDF_IRP_CONTEXT_FLUSH_REQUIRED\n"));
PtrIrpContext->IrpContextFlags |= UDF_IRP_CONTEXT_FLUSH_REQUIRED;
}
}
// we should check appropriate privilege if OpenForBackup requested
if(OpenForBackup) {
- RC = SeSinglePrivilegeCheck(SeExports->SeBackupPrivilege, UserMode);
- if(!NT_SUCCESS(RC))
- try_return(RC);
+ if (!SeSinglePrivilegeCheck(SeExports->SeBackupPrivilege, UserMode)) {
+ try_return(RC = STATUS_PRIVILEGE_NOT_HELD);
+ }
}
// The FSD might wish to implement the open-by-id option. The "id"
PUNICODE_STRING TmpPath;
LONGLONG Id;
- KdPrint((" open by File ID\n"));
+ UDFPrint((" open by File ID\n"));
if(Vcb->VCBFlags & UDF_VCB_FLAGS_RAW_DISK) {
ReturnedInformation = 0;
AdPrint((" Can't open by FileID on blank volume ;)\n"));
// This implies a "relative" open i.e. relative to the directory
// represented by the related file object ...
- KdPrint((" PtrRelatedFileObject %x, FCB %x\n", PtrRelatedFileObject, PtrRelatedFCB));
+ UDFPrint((" PtrRelatedFileObject %x, FCB %x\n", PtrRelatedFileObject, PtrRelatedFCB));
// Note: The only purpose FSD implementations ever have for
// the related file object is to determine whether this
// is a relative open or not. At all other times (including
// ****************
// The suplied path-name must be an absolute path-name i.e.
// starting at the root of the file system tree
- KdPrint((" Absolute open\n"));
+ UDFPrint((" Absolute open\n"));
ASSERT(TargetObjectName.Buffer);
if (!TargetObjectName.Length || TargetObjectName.Buffer[0] != L'\\') {
AdPrint((" Wrong target name (1)\n"));
if(Vcb->VCBFlags & UDF_VCB_FLAGS_RAW_DISK) {
ReturnedInformation = 0;
AdPrint((" Can't open File on blank volume ;)\n"));
+ ReturnedInformation = FILE_DOES_NOT_EXIST;
try_return(RC = STATUS_OBJECT_NAME_NOT_FOUND);
}
try_return(RC = STATUS_OBJECT_NAME_INVALID);
}
if(StreamOpen && !UDFStreamsSupported(Vcb)) {
+ ReturnedInformation = FILE_DOES_NOT_EXIST;
try_return(RC = STATUS_OBJECT_NAME_INVALID);
}
// get next path part...
TmpBuffer = TailName.Buffer;
TailName.Buffer = UDFDissectName(TailName.Buffer,&(CurName.Length) );
- TailName.Length -= (USHORT)((ULONG)(TailName.Buffer) - (ULONG)TmpBuffer);
+ TailName.Length -= (USHORT)((ULONG_PTR)(TailName.Buffer) - (ULONG_PTR)TmpBuffer);
CurName.Buffer = TailName.Buffer - CurName.Length;
CurName.Length *= sizeof(WCHAR);
CurName.MaximumLength = CurName.Length + sizeof(WCHAR);
// Only say ..CK OFF !!!!
if(RC == STATUS_OBJECT_NAME_NOT_FOUND)
RC = STATUS_OBJECT_PATH_NOT_FOUND;
+ ReturnedInformation = FILE_DOES_NOT_EXIST;
try_return(RC);
}
} else {
AdPrint((" Open Target: unexpected error\n"));
NewFileInfo = NULL;
+ ReturnedInformation = FILE_DOES_NOT_EXIST;
try_return(RC = STATUS_OBJECT_NAME_INVALID);
}
if ((RequestedDisposition != FILE_CREATE) && (RequestedDisposition != FILE_OPEN_IF) &&
(RequestedDisposition != FILE_OVERWRITE_IF) && (RequestedDisposition != FILE_SUPERSEDE)) {
AdPrint((" File doesn't exist (2)\n"));
+ ReturnedInformation = FILE_DOES_NOT_EXIST;
try_return(RC);
}
// Check Volume ReadOnly attr
((LocalPath->Buffer[LocalPath->Length/sizeof(WCHAR)-1] != L':') /*&&
(LocalPath->Buffer[LocalPath->Length/sizeof(WCHAR)-1] != L'\\')*/) )) {
RC = MyAppendUnicodeToString(&(NewFCBName->ObjectName), L"\\");
- if(!NT_SUCCESS(RC)) return STATUS_INSUFFICIENT_RESOURCES;
+ if(!NT_SUCCESS(RC)) {
+ UDFReleaseObjectName(NewFCBName);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
}
// Make link between Fcb and FileInfo
(*PtrNewFcb)->ParentFcb = RelatedFileInfo->Fcb;
if(!((*PtrNewFcb)->NTRequiredFCB = NewFileInfo->Dloc->CommonFcb)) {
- if(!((*PtrNewFcb)->NTRequiredFCB =
- (PtrUDFNTRequiredFCB)MyAllocatePool__(NonPagedPool, UDFQuadAlign(sizeof(UDFNTRequiredFCB))) ) )
+ (*PtrNewFcb)->NTRequiredFCB = (PtrUDFNTRequiredFCB)MyAllocatePool__(NonPagedPool, UDFQuadAlign(sizeof(UDFNTRequiredFCB)));
+ if(!((*PtrNewFcb)->NTRequiredFCB)) {
+ UDFReleaseObjectName(NewFCBName);
return STATUS_INSUFFICIENT_RESOURCES;
+ }
- KdPrint(("UDFAllocateNtReqFCB: %x\n", (*PtrNewFcb)->NTRequiredFCB));
+ UDFPrint(("UDFAllocateNtReqFCB: %x\n", (*PtrNewFcb)->NTRequiredFCB));
RtlZeroMemory((*PtrNewFcb)->NTRequiredFCB, UDFQuadAlign(sizeof(UDFNTRequiredFCB)));
(*PtrNewFcb)->FileInfo->Dloc->CommonFcb = (*PtrNewFcb)->NTRequiredFCB;
Linked = FALSE;
if(!(NewFileInfo->Dloc->CommonFcb->NtReqFCBFlags & UDF_NTREQ_FCB_VALID)) {
(*PtrNewFcb)->NTRequiredFCB = NULL;
BrutePoint();
+ UDFReleaseObjectName(NewFCBName);
return STATUS_ACCESS_DENIED;
}
}