📄 cdprocs.h
字号:
IN PFILE_OBJECT FileObject
);
VOID
CdReleaseForCreateSection (
IN PFILE_OBJECT FileObject
);
//
// In-memory structure support routines. Implemented in StrucSup.c
//
VOID
CdInitializeVcb (
IN PIRP_CONTEXT IrpContext,
IN OUT PVCB Vcb,
IN PDEVICE_OBJECT TargetDeviceObject,
IN PVPB Vpb,
IN PCDROM_TOC_LARGE CdromToc,
IN ULONG TocLength,
IN ULONG TocTrackCount,
IN ULONG TocDiskFlags,
IN ULONG BlockFactor,
IN ULONG MediaChangeCount
);
VOID
CdUpdateVcbFromVolDescriptor (
IN PIRP_CONTEXT IrpContext,
IN OUT PVCB Vcb,
IN PCHAR RawIsoVd OPTIONAL
);
VOID
CdDeleteVcb (
IN PIRP_CONTEXT IrpContext,
IN OUT PVCB Vcb
);
PFCB
CdCreateFcb (
IN PIRP_CONTEXT IrpContext,
IN FILE_ID FileId,
IN NODE_TYPE_CODE NodeTypeCode,
OUT PBOOLEAN FcbExisted OPTIONAL
);
VOID
CdInitializeFcbFromPathEntry (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN PFCB ParentFcb OPTIONAL,
IN PPATH_ENTRY PathEntry
);
VOID
CdInitializeFcbFromFileContext (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN PFCB ParentFcb OPTIONAL,
IN PFILE_ENUM_CONTEXT FileContext
);
PCCB
CdCreateCcb (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN ULONG Flags
);
VOID
CdDeleteCcb (
IN PIRP_CONTEXT IrpContext,
IN PCCB Ccb
);
BOOLEAN
CdCreateFileLock (
IN PIRP_CONTEXT IrpContext OPTIONAL,
IN PFCB Fcb,
IN BOOLEAN RaiseOnError
);
VOID
CdDeleteFileLock (
IN PIRP_CONTEXT IrpContext,
IN PFILE_LOCK FileLock
);
PIRP_CONTEXT
CdCreateIrpContext (
IN PIRP Irp,
IN BOOLEAN Wait
);
VOID
CdCleanupIrpContext (
IN PIRP_CONTEXT IrpContext,
IN BOOLEAN Post
);
VOID
CdInitializeStackIrpContext (
OUT PIRP_CONTEXT IrpContext,
IN PIRP_CONTEXT_LITE IrpContextLite
);
//
// PIRP_CONTEXT_LITE
// CdCreateIrpContextLite (
// IN PIRP_CONTEXT IrpContext
// );
//
// VOID
// CdFreeIrpContextLite (
// IN PIRP_CONTEXT_LITE IrpContextLite
// );
//
#define CdCreateIrpContextLite(IC) \
ExAllocatePoolWithTag( CdNonPagedPool, sizeof( IRP_CONTEXT_LITE ), TAG_IRP_CONTEXT_LITE )
#define CdFreeIrpContextLite(ICL) \
CdFreePool( &(ICL) )
VOID
CdTeardownStructures (
IN PIRP_CONTEXT IrpContext,
IN PFCB StartingFcb,
OUT PBOOLEAN RemovedStartingFcb
);
//
// VOID
// CdIncrementCleanupCounts (
// IN PIRP_CONTEXT IrpContext,
// IN PFCB Fcb
// );
//
// VOID
// CdDecrementCleanupCounts (
// IN PIRP_CONTEXT IrpContext,
// IN PFCB Fcb
// );
//
// VOID
// CdIncrementReferenceCounts (
// IN PIRP_CONTEXT IrpContext,
// IN PFCB Fcb,
// IN ULONG ReferenceCount
// IN ULONG UserReferenceCount
// );
//
// VOID
// CdDecrementReferenceCounts (
// IN PIRP_CONTEXT IrpContext,
// IN PFCB Fcb,
// IN ULONG ReferenceCount
// IN ULONG UserReferenceCount
// );
//
// VOID
// CdIncrementFcbReference (
// IN PIRP_CONTEXT IrpContext,
// IN PFCB Fcb
// );
//
// VOID
// CdDecrementFcbReference (
// IN PIRP_CONTEXT IrpContext,
// IN PFCB Fcb
// );
//
#define CdIncrementCleanupCounts(IC,F) { \
ASSERT_LOCKED_VCB( (F)->Vcb ); \
(F)->FcbCleanup += 1; \
(F)->Vcb->VcbCleanup += 1; \
}
#define CdDecrementCleanupCounts(IC,F) { \
ASSERT_LOCKED_VCB( (F)->Vcb ); \
(F)->FcbCleanup -= 1; \
(F)->Vcb->VcbCleanup -= 1; \
}
#define CdIncrementReferenceCounts(IC,F,C,UC) { \
ASSERT_LOCKED_VCB( (F)->Vcb ); \
(F)->FcbReference += (C); \
(F)->FcbUserReference += (UC); \
(F)->Vcb->VcbReference += (C); \
(F)->Vcb->VcbUserReference += (UC); \
}
#define CdDecrementReferenceCounts(IC,F,C,UC) { \
ASSERT_LOCKED_VCB( (F)->Vcb ); \
(F)->FcbReference -= (C); \
(F)->FcbUserReference -= (UC); \
(F)->Vcb->VcbReference -= (C); \
(F)->Vcb->VcbUserReference -= (UC); \
}
//
// PCD_IO_CONTEXT
// CdAllocateIoContext (
// );
//
// VOID
// CdFreeIoContext (
// PCD_IO_CONTEXT IoContext
// );
//
#define CdAllocateIoContext() \
FsRtlAllocatePoolWithTag( CdNonPagedPool, \
sizeof( CD_IO_CONTEXT ), \
TAG_IO_CONTEXT )
#define CdFreeIoContext(IO) CdFreePool( &(IO) )
PFCB
CdLookupFcbTable (
IN PIRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN FILE_ID FileId
);
PFCB
CdGetNextFcb (
IN PIRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN PVOID *RestartKey
);
NTSTATUS
CdProcessToc (
IN PIRP_CONTEXT IrpContext,
IN PDEVICE_OBJECT TargetDeviceObject,
IN PCDROM_TOC_LARGE CdromToc,
IN OUT PULONG Length,
OUT PULONG TrackCount,
OUT PULONG DiskFlags
);
//
// For debugging purposes we sometimes want to allocate our structures from nonpaged
// pool so that in the kernel debugger we can walk all the structures.
//
#define CdPagedPool PagedPool
#define CdNonPagedPool NonPagedPool
#define CdNonPagedPoolCacheAligned NonPagedPoolCacheAligned
//
// Verification support routines. Contained in verfysup.c
//
INLINE
BOOLEAN
CdOperationIsDasdOpen(
IN PIRP_CONTEXT IrpContext
)
{
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( IrpContext->Irp);
return ((IrpContext->MajorFunction == IRP_MJ_CREATE) &&
(IrpSp->FileObject->FileName.Length == 0) &&
(IrpSp->FileObject->RelatedFileObject == NULL));
}
NTSTATUS
CdPerformVerify (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp,
IN PDEVICE_OBJECT DeviceToVerify
);
BOOLEAN
CdCheckForDismount (
IN PIRP_CONTEXT IrpContext,
IN PVCB,
IN BOOLEAN Force
);
VOID
CdVerifyVcb (
IN PIRP_CONTEXT IrpContext,
IN PVCB Vcb
);
BOOLEAN
CdVerifyFcbOperation (
IN PIRP_CONTEXT IrpContext OPTIONAL,
IN PFCB Fcb
);
BOOLEAN
CdDismountVcb (
IN PIRP_CONTEXT IrpContext,
IN PVCB Vcb
);
//
// Macros to abstract device verify flag changes.
//
#define CdUpdateMediaChangeCount( V, C) (V)->MediaChangeCount = (C)
#define CdUpdateVcbCondition( V, C) (V)->VcbCondition = (C)
#define CdMarkRealDevForVerify( DO) SetFlag( (DO)->Flags, DO_VERIFY_VOLUME)
#define CdMarkRealDevVerifyOk( DO) ClearFlag( (DO)->Flags, DO_VERIFY_VOLUME)
#define CdRealDevNeedsVerify( DO) BooleanFlagOn( (DO)->Flags, DO_VERIFY_VOLUME)
//
// BOOLEAN
// CdIsRawDevice (
// IN PIRP_CONTEXT IrpContext,
// IN NTSTATUS Status
// );
//
#define CdIsRawDevice(IC,S) ( \
((S) == STATUS_DEVICE_NOT_READY) || \
((S) == STATUS_NO_MEDIA_IN_DEVICE) \
)
//
// Work queue routines for posting and retrieving an Irp, implemented in
// workque.c
//
NTSTATUS
CdFsdPostRequest(
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
VOID
CdPrePostIrp (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
VOID
CdOplockComplete (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
//
// Miscellaneous support routines
//
//
// This macro returns TRUE if a flag in a set of flags is on and FALSE
// otherwise
//
//#ifndef BooleanFlagOn
//#define BooleanFlagOn(F,SF) ( \
// (BOOLEAN)(((F) & (SF)) != 0) \
//)
//#endif
//#ifndef SetFlag
//#define SetFlag(Flags,SingleFlag) { \
// (Flags) |= (SingleFlag); \
//}
//#endif
//#ifndef ClearFlag
//#define ClearFlag(Flags,SingleFlag) { \
// (Flags) &= ~(SingleFlag); \
//}
//#endif
//
// CAST
// Add2Ptr (
// IN PVOID Pointer,
// IN ULONG Increment
// IN (CAST)
// );
//
// ULONG
// PtrOffset (
// IN PVOID BasePtr,
// IN PVOID OffsetPtr
// );
//
#define Add2Ptr(PTR,INC,CAST) ((CAST)((PUCHAR)(PTR) + (INC)))
#define PtrOffset(BASE,OFFSET) ((ULONG)((ULONG_PTR)(OFFSET) - (ULONG_PTR)(BASE)))
//
// This macro takes a pointer (or ulong) and returns its rounded up word
// value
//
#define WordAlign(Ptr) ( \
((((ULONG)(Ptr)) + 1) & 0xfffffffe) \
)
//
// This macro takes a pointer (or ulong) and returns its rounded up longword
// value
//
#define LongAlign(Ptr) ( \
((((ULONG)(Ptr)) + 3) & 0xfffffffc) \
)
//
// This macro takes a pointer (or ulong) and returns its rounded up quadword
// value
//
#define QuadAlign(Ptr) ( \
((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
)
//
// The following macros round up and down to sector boundaries.
//
#define SectorAlign(L) ( \
((((ULONG)(L)) + (SECTOR_SIZE - 1)) & ~(SECTOR_SIZE - 1)) \
)
#define LlSectorAlign(L) ( \
((((LONGLONG)(L)) + (SECTOR_SIZE - 1)) & ~(SECTOR_SIZE - 1)) \
)
#define SectorTruncate(L) ( \
((ULONG)(L)) & ~(SECTOR_SIZE - 1) \
)
#define LlSectorTruncate(L) ( \
((LONGLONG)(L)) & ~(SECTOR_SIZE - 1) \
)
#define BytesFromSectors(L) ( \
((ULONG) (L)) << SECTOR_SHIFT \
)
#define SectorsFromBytes(L) ( \
((ULONG) (L)) >> SECTOR_SHIFT \
)
INLINE
ULONG
SectorsFromLlBytes(
ULONGLONG Bytes
) {
return (ULONG)(Bytes >> SECTOR_SHIFT);
}
#define LlBytesFromSectors(L) ( \
Int64ShllMod32( (LONGLONG)(L), SECTOR_SHIFT ) \
)
#define LlSectorsFromBytes(L) ( \
Int64ShraMod32( (LONGLONG)(L), SECTOR_SHIFT ) \
)
#define SectorOffset(L) ( \
((ULONG)(ULONG_PTR) (L)) & SECTOR_MASK \
)
#define SectorBlockOffset(V,LB) ( \
((ULONG) (LB)) & ((V)->BlocksPerSector - 1) \
)
#define BytesFromBlocks(V,B) ( \
(ULONG) (B) << (V)->BlockToByteShift \
)
#define LlBytesFromBlocks(V,B) ( \
Int64ShllMod32( (LONGLONG) (B), (V)->BlockToByteShift ) \
)
#define BlockAlign(V,L) ( \
((ULONG)(L) + (V)->BlockMask) & (V)->BlockInverseMask \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -