20 #define UDF_BUG_CHECK_ID UDF_FILE_CLOSE 23 #define TREE_ITEM_LIST_GRAN 32 81 Irp->IoStatus.Status = RC;
82 Irp->IoStatus.Information = 0;
163 AdPrint((
"UDFCommonClose: \n"));
233 #ifdef UDF_DELAYED_CLOSE 245 AdPrint((
" Cant queue Close Irp, status=%x\n", RC));
247 #endif //UDF_DELAYED_CLOSE 252 (
Fcb->NTRequiredFCB->AcqFlushCount)) {
253 AdPrint((
" post NOT_TOP_LEVEL Irp\n"));
270 AdPrint((
"UDF: Closing volume\n"));
271 AdPrint((
"UDF: ReferenceCount: %x\n",
Fcb->ReferenceCount));
308 AdPrint((
"UDF: Closing volume, reset write status\n"));
334 AdPrint((
"Closing file: ??? \n"));
337 AdPrint((
"UDF: ReferenceCount: %x\n",
Fcb->ReferenceCount));
381 Irp->IoStatus.Information = 0;
412 LONG RefCount, ComRefCount;
417 AdPrint((
"UDFCleanUpFcbChain\n"));
511 #ifndef UDF_READ_ONLY_BUILD 527 #endif //UDF_READ_ONLY_BUILD 533 #ifndef UDF_READ_ONLY_BUILD 537 #endif //UDF_READ_ONLY_BUILD 545 fi->Dloc->CommonFcb =
NULL;
563 if(
NtReqFcb->CommonFCBHeader.Resource) {
567 NtReqFcb->CommonFCBHeader.Resource =
647 for(;TreeLength && fi;TreeLength--) {
651 ASSERT(
Fcb->NTRequiredFCB->CommonRefCount);
676 AdPrint((
" UDFDoDelayedClose\n"));
697 AdPrint((
" UDFDelayedClose\n"));
762 AdPrint((
" UDFCloseAllDelayed\n"));
766 GlobalDataAcquired =
TRUE;
777 if (NextIrpContextLite->
Fcb->
Vcb ==
Vcb) {
792 if (NextIrpContextLite->
Fcb->
Vcb ==
Vcb) {
800 if(GlobalDataAcquired)
820 UDFPrint((
" UDFBuildTreeItemsList():\n"));
821 if(!(*PassedList) || !(*FoundList)) {
827 (*PassedListSize) = 0;
836 (*FoundListSize) = 0;
840 for(
i=0;
i<(*PassedListSize);
i++) {
853 (*PassedList)[(*PassedListSize)-1] =
FileInfo;
865 (*FoundList)[(*FoundListSize)-1] =
FileInfo;
869 if((SDirInfo =
FileInfo->Dloc->SDirInfo))
871 PassedList, PassedListSize, FoundList, FoundListSize);
874 if((hDirNdx =
FileInfo->Dloc->DirIndex)) {
886 PassedList, PassedListSize, FoundList, FoundListSize);
910 Fcb->ReferenceCount &&
911 Fcb->NTRequiredFCB->SectionObject.DataSectionObject) {
925 ULONG PassedListSize = 0;
927 ULONG FoundListSize = 0;
939 UDFPrint((
" UDFCloseAllXXXDelayedInDir(): Acquire DelayedCloseResource\n"));
949 &PassedList, &PassedListSize, &FoundList, &FoundListSize);
952 UDFPrint((
" UDFBuildTreeItemsList(): error %x\n", RC));
956 if(!FoundList || !FoundListSize) {
963 UDFPrint((
" Can't alloc ListPtrArray for %x items\n", FoundListSize));
967 for(
i=0;
i<FoundListSize;
i++) {
971 CurFileInfo = FoundList[
i];
975 UDFPrint((
" Can't alloc ListPtrEntry for items %x\n",
i));
978 CurFileInfo->
ListPtr->FileInfo = CurFileInfo;
979 CurFileInfo->
ListPtr->EntryRefCount = 0;
981 CurFileInfo->
ListPtr->EntryRefCount++;
982 ListPtrArray[
i] = CurFileInfo->
ListPtr;
1000 for(
i=FoundListSize;
i>0;
i--) {
1005 CurListPtr = ListPtrArray[
i-1];
1006 CurFileInfo = CurListPtr->
FileInfo;
1008 (
Fcb = CurFileInfo->
Fcb)) {
1014 MmPrint((
" CcFlushCache()\n"));
1017 if(
NtReqFcb->SectionObject.ImageSectionObject) {
1018 MmPrint((
" MmFlushImageSection()\n"));
1021 if(
NtReqFcb->SectionObject.DataSectionObject) {
1022 MmPrint((
" CcPurgeCacheSection()\n"));
1026 MmPrint((
" Skip item: deleted\n"));
1038 AcquiredVcb =
FALSE;
1046 for(
i=FoundListSize;
i>0;
i--) {
1051 CurListPtr = ListPtrArray[
i-1];
1052 CurFileInfo = CurListPtr->
FileInfo;
1056 (NextIrpContextLite = CurFileInfo->
Fcb->IrpContextLite)) {
1073 AcquiredVcb =
FALSE;
1116 AdPrint((
" UDFQueueDelayedClose\n"));
1129 if(
Fcb->IrpContextLite ||
1148 Fcb->IrpContextLite = IrpContextLite;
#define UDFAcquireResourceExclusive(Resource, CanWait)
VOID UDFReleaseIrpContext(PtrUDFIrpContext PtrIrpContext)
PtrUDFIrpContext UDFAllocateIrpContext(PIRP Irp, PDEVICE_OBJECT PtrTargetDeviceObject)
#define UDF_CLOSE_NTREQFCB_DELETED
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
#define UDFReferenceFile__(fi)
#define UDF_CLOSE_FCB_DELETED
#define STATUS_DELETE_PENDING
struct _UDFContextControlBlock * PtrUDFCCB
#define UDF_CCB_READ_ONLY
NTSTATUS NTAPI UDFPhSendIOCTL(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, OUT PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN OverrideVerify, OUT PIO_STATUS_BLOCK Iosb OPTIONAL)
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
#define STATUS_INSUFFICIENT_RESOURCES
#define FsRtlEnterFileSystem
BOOLEAN UDFCheckForDismount(IN PtrUDFIrpContext IrpContext, IN PVCB Vcb, IN BOOLEAN VcbAcquired)
NTSTATUS UDFBuildTreeItemsList(IN PVCB Vcb, IN PUDF_FILE_INFO FileInfo, IN PCHECK_TREE_ITEM CheckItemProc, IN PUDF_DATALOC_INFO **PassedList, IN PULONG PassedListSize, IN PUDF_DATALOC_INFO **FoundList, IN PULONG FoundListSize)
ULONG UDFCleanUpFcbChain(IN PVCB Vcb, IN PUDF_FILE_INFO fi, IN ULONG TreeLength, IN BOOLEAN VcbAcquired)
#define UDF_IRP_CONTEXT_NOT_TOP_LEVEL
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
#define FsRtlExitFileSystem
VOID UDFLogEvent(NTSTATUS UDFEventLogId, NTSTATUS RC)
#define UDF_FCB_DELETE_PARENT
#define UDF_FCB_POSTED_RENAME
#define UDF_NODE_TYPE_VCB
VOID NTAPI FsRtlUninitializeFileLock(IN PFILE_LOCK FileLock)
#define UDF_NODE_TYPE_FCB
#define UDFReleaseResource(Resource)
#define UDF_FCB_DELETE_ON_CLOSE
__inline PDIR_INDEX_ITEM UDFDirIndex(IN PDIR_INDEX_HDR hDirNdx, IN uint_di i)
BOOLEAN UDFIsInDelayedCloseQueue(PUDF_FILE_INFO FileInfo)
struct _FE_LIST_ENTRY * PFE_LIST_ENTRY
struct _FCB::@709::@712 Fcb
_UDFFileControlBlock * Fcb
PDEVICE_OBJECT TargetDeviceObject
#define InsertTailList(ListHead, Entry)
VOID NTAPI UDFDelayedClose(PVOID unused)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define UDF_NODE_TYPE_NT_REQ_FCB
#define TREE_ITEM_LIST_GRAN
#define UDF_VCB_FLAGS_RAW_DISK
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
_In_ PDEVICE_OBJECT DeviceObject
#define IO_DISK_INCREMENT
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
PDIR_INDEX_HDR UDFGetDirIndexByFileInfo(IN PUDF_FILE_INFO FileInfo)
struct _UDFIrpContextLite * IrpContextLite
#define _SEH2_GetExceptionInformation()
#define UDFInterlockedDecrement(addr)
NTSTATUS UDFInitializeIrpContextLite(OUT PtrUDFIrpContextLite *IrpContextLite, IN PtrUDFIrpContext IrpContext, IN PtrUDFFCB Fcb)
#define _SEH2_AbnormalTermination()
#define IoCompleteRequest
OSSTATUS UDFFlushFile__(IN PVCB Vcb, IN PUDF_FILE_INFO FileInfo, IN ULONG FlushFlags)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
NTSTATUS UDFCloseAllXXXDelayedInDir(IN PVCB Vcb, IN PUDF_FILE_INFO FileInfo, IN BOOLEAN System)
struct _UDFVolumeControlBlock * Vcb
NTSTATUS UDFExceptionHandler(PtrUDFIrpContext PtrIrpContext, PIRP Irp)
#define UDFIsAStreamDir(FI)
uint32 UDFCleanUpFile__(IN PVCB Vcb, IN PUDF_FILE_INFO FileInfo)
VOID UDFDoDelayedClose(IN PtrUDFIrpContextLite NextIrpContextLite)
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI MmFlushImageSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN MMFLUSH_TYPE FlushType)
#define EXCEPTION_EXECUTE_HANDLER
struct _FE_LIST_ENTRY * ListPtr
#define UDFDeleteResource(Resource)
#define UDF_FCB_DIRECTORY
NTSTATUS UDFCommonClose(PtrUDFIrpContext PtrIrpContext, PIRP Irp)
struct _UDF_FILE_INFO * ParentFile
NTSTATUS UDFQueueDelayedClose(PtrUDFIrpContext IrpContext, PtrUDFFCB Fcb)
BOOLEAN __fastcall UDFIsIrpTopLevel(PIRP Irp)
#define STATUS_UNSUCCESSFUL
#define ValidateFileInfo(fi)
PDIR_INDEX_ITEM UDFDirIndexScan(PUDF_DIR_SCAN_CONTEXT Context, PUDF_FILE_INFO *_FileInfo)
#define UDF_NTREQ_FCB_DELETED
#define UDF_VCB_FLAGS_VOLUME_MOUNTED
#define UDF_VCB_FLAGS_NO_DELAYED_CLOSE
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
NTSTATUS NTAPI UDFClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define InterlockedDecrement
#define UDF_FCB_DELAY_CLOSE
long UDFExceptionFilter(PtrUDFIrpContext PtrIrpContext, PEXCEPTION_POINTERS PtrExceptionPointers)
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
#define UDFAcquireResourceShared(Resource, CanWait)
OSSTATUS UDFCloseFile__(IN PVCB Vcb, IN PUDF_FILE_INFO FileInfo)
BOOLEAN(* PCHECK_TREE_ITEM)(IN PUDF_FILE_INFO FileInfo)
#define UDFInterlockedIncrement(addr)
LIST_ENTRY DelayedCloseLinks
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define UDF_ERROR_INTERNAL_ERROR
NTSTATUS UDFPostRequest(IN PtrUDFIrpContext PtrIrpContext, IN PIRP Irp)
#define UDF_IRP_CONTEXT_READ_ONLY
#define UDF_VCB_FLAGS_BEING_DISMOUNTED
#define InterlockedIncrement
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
VOID __fastcall UDFCleanUpCCB(PtrUDFCCB Ccb)
_In_ PIO_STACK_LOCATION IrpSp
#define UDF_CHECK_PAGING_IO_RESOURCE(NTReqFCB)
OSSTATUS UDFUnlinkFile__(IN PVCB Vcb, IN PUDF_FILE_INFO FileInfo, IN BOOLEAN FreeSpace)
#define IOCTL_CDRW_RESET_WRITE_STATUS
VOID UDFInitializeIrpContextFromLite(OUT PtrUDFIrpContext *IrpContext, IN PtrUDFIrpContextLite IrpContextLite)
BOOLEAN UDFIsLastClose(PUDF_FILE_INFO FileInfo)
VOID __fastcall UDFCleanUpFCB(PtrUDFFCB Fcb)
VOID UDFCloseAllDelayed(IN PVCB Vcb)
BOOLEAN UDFDirIndexInitScan(IN PUDF_FILE_INFO DirInfo, OUT PUDF_DIR_SCAN_CONTEXT Context, IN uint_di Index)
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
_UDFFileControlBlock * Fcb
#define _SEH2_EXCEPT(...)
struct _UDFFileControlBlock * Fcb
#define ExIsResourceAcquiredExclusive
BOOL Delete(LPCTSTR ServiceName)
VOID UDFDeassignAcl(IN PtrUDFNTRequiredFCB NtReqFcb, IN BOOLEAN AutoInherited)
base of all file and directory entries
#define UDF_RESIDUAL_REFERENCE
#define UDF_NTREQ_FCB_MODIFIED