📄 cdprocs.h
字号:
/*++
Copyright (c) 1989-2000 Microsoft Corporation
Module Name:
CdProcs.h
Abstract:
This module defines all of the globally used procedures in the Cdfs
file system.
--*/
#ifndef _CDPROCS_
#define _CDPROCS_
#include <ntifs.h>
#include <ntddcdrm.h>
#include <ntdddisk.h>
#include <ntddscsi.h>
#ifndef INLINE
#define INLINE __inline
#endif
#include "nodetype.h"
#include "Cd.h"
#include "CdStruc.h"
#include "CdData.h"
//**** x86 compiler bug ****
#if defined(_M_IX86)
#undef Int64ShraMod32
#define Int64ShraMod32(a, b) ((LONGLONG)(a) >> (b))
#endif
#ifndef Min
#define Min(a, b) ((a) < (b) ? (a) : (b))
#endif
#ifndef Max
#define Max(a, b) ((a) > (b) ? (a) : (b))
#endif
//
// Here are the different pool tags.
//
#define TAG_CCB 'ccdC' // Ccb
#define TAG_CDROM_TOC 'ctdC' // TOC
#define TAG_DIRENT_NAME 'nddC' // CdName in dirent
#define TAG_ENUM_EXPRESSION 'eedC' // Search expression for enumeration
#define TAG_FCB_DATA 'dfdC' // Data Fcb
#define TAG_FCB_INDEX 'ifdC' // Index Fcb
#define TAG_FCB_NONPAGED 'nfdC' // Nonpaged Fcb
#define TAG_FCB_TABLE 'tfdC' // Fcb Table entry
#define TAG_FILE_NAME 'nFdC' // Filename buffer
#define TAG_GEN_SHORT_NAME 'sgdC' // Generated short name
#define TAG_IO_BUFFER 'fbdC' // Temporary IO buffer
#define TAG_IO_CONTEXT 'oidC' // Io context for async reads
#define TAG_IRP_CONTEXT 'cidC' // Irp Context
#define TAG_IRP_CONTEXT_LITE 'lidC' // Irp Context lite
#define TAG_MCB_ARRAY 'amdC' // Mcb array
#define TAG_PATH_ENTRY_NAME 'nPdC' // CdName in path entry
#define TAG_PREFIX_ENTRY 'epdC' // Prefix Entry
#define TAG_PREFIX_NAME 'npdC' // Prefix Entry name
#define TAG_SPANNING_PATH_TABLE 'psdC' // Buffer for spanning path table
#define TAG_UPCASE_NAME 'nudC' // Buffer for upcased name
#define TAG_VOL_DESC 'dvdC' // Buffer for volume descriptor
#define TAG_VPB 'pvdC' // Vpb allocated in filesystem
//
// Tag all of our allocations if tagging is turned on
//
#ifdef POOL_TAGGING
#undef FsRtlAllocatePool
#undef FsRtlAllocatePoolWithQuota
#define FsRtlAllocatePool(a,b) FsRtlAllocatePoolWithTag(a,b,'sfdC')
#define FsRtlAllocatePoolWithQuota(a,b) FsRtlAllocatePoolWithQuotaTag(a,b,'sfdC')
#endif // POOL_TAGGING
//
// File access check routine, implemented in AcChkSup.c
//
//
// BOOLEAN
// CdIllegalFcbAccess (
// IN PIRP_CONTEXT IrpContext,
// IN TYPE_OF_OPEN TypeOfOpen,
// IN ACCESS_MASK DesiredAccess
// );
//
#define CdIllegalFcbAccess(IC,T,DA) ( \
BooleanFlagOn( (DA), \
((T) != UserVolumeOpen ? \
(FILE_WRITE_ATTRIBUTES | \
FILE_WRITE_DATA | \
FILE_WRITE_EA | \
FILE_ADD_FILE | \
FILE_ADD_SUBDIRECTORY | \
FILE_APPEND_DATA) : 0) | \
FILE_DELETE_CHILD | \
DELETE | \
WRITE_DAC ))
//
// Allocation support routines, implemented in AllocSup.c
//
// These routines are for querying allocation on individual streams.
//
VOID
CdLookupAllocation (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN LONGLONG FileOffset,
OUT PLONGLONG DiskOffset,
OUT PULONG ByteCount
);
VOID
CdAddAllocationFromDirent (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN ULONG McbEntryOffset,
IN LONGLONG StartingFileOffset,
IN PDIRENT Dirent
);
VOID
CdAddInitialAllocation (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN ULONG StartingBlock,
IN LONGLONG DataLength
);
VOID
CdTruncateAllocation (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN LONGLONG StartingFileOffset
);
VOID
CdInitializeMcb (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb
);
VOID
CdUninitializeMcb (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb
);
//
// Buffer control routines for data caching, implemented in CacheSup.c
//
VOID
CdCreateInternalStream (
IN PIRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN PFCB Fcb,
IN OPTIONAL PUNICODE_STRING Name
);
VOID
CdDeleteInternalStream (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb
);
NTSTATUS
CdCompleteMdl (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
CdPurgeVolume (
IN PIRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN BOOLEAN DismountUnderway
);
VOID
INLINE
CdVerifyOrCreateDirStreamFile(
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb
)
{
//
// Unsafe test to see if call / lock neccessary.
//
if (NULL == Fcb->FileObject) {
CdCreateInternalStream( IrpContext,
Fcb->Vcb,
Fcb,
&Fcb->FileNamePrefix.ExactCaseName.FileName);
}
}
//
// VOID
// CdUnpinData (
// IN PIRP_CONTEXT IrpContext,
// IN OUT PBCB *Bcb
// );
//
#define CdUnpinData(IC,B) \
if (*(B) != NULL) { CcUnpinData( *(B) ); *(B) = NULL; }
//
// Device I/O routines, implemented in DevIoSup.c
//
// These routines perform the actual device read and writes. They only affect
// the on disk structure and do not alter any other data structures.
//
VOID
CdFreeDirCache(
IN PIRP_CONTEXT IrpContext
);
NTSTATUS
CdNonCachedRead (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN LONGLONG StartingOffset,
IN ULONG ByteCount
);
NTSTATUS
CdNonCachedXARead (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN LONGLONG StartingOffset,
IN ULONG ByteCount
);
BOOLEAN
CdReadSectors (
IN PIRP_CONTEXT IrpContext,
IN LONGLONG StartingOffset,
IN ULONG ByteCount,
IN BOOLEAN RaiseOnError,
IN OUT PVOID Buffer,
IN PDEVICE_OBJECT TargetDeviceObject
);
NTSTATUS
CdCreateUserMdl (
IN PIRP_CONTEXT IrpContext,
IN ULONG BufferLength,
IN BOOLEAN RaiseOnError
);
NTSTATUS
FASTCALL
CdPerformDevIoCtrl (
IN PIRP_CONTEXT IrpContext,
IN ULONG IoControlCode,
IN PDEVICE_OBJECT Device,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength,
IN BOOLEAN InternalDeviceIoControl,
IN BOOLEAN OverrideVerify,
OUT PIO_STATUS_BLOCK Iosb OPTIONAL
);
NTSTATUS
CdPerformDevIoCtrlEx (
IN PIRP_CONTEXT IrpContext,
IN ULONG IoControlCode,
IN PDEVICE_OBJECT Device,
IN OPTIONAL PVOID InputBuffer,
IN ULONG InputBufferLength,
OUT OPTIONAL PVOID OutputBuffer,
IN ULONG OutputBufferLength,
IN BOOLEAN InternalDeviceIoControl,
IN BOOLEAN OverrideVerify,
OUT OPTIONAL PIO_STATUS_BLOCK Iosb
);
//
// VOID
// CdMapUserBuffer (
// IN PIRP_CONTEXT IrpContext
// OUT PVOID UserBuffer
// );
//
// Returns pointer to sys address. Will raise on failure.
//
//
// VOID
// CdLockUserBuffer (
// IN PIRP_CONTEXT IrpContext,
// IN ULONG BufferLength
// );
//
#define CdMapUserBuffer(IC, UB) { \
*(UB) = (PVOID) ( ((IC)->Irp->MdlAddress == NULL) ? \
(IC)->Irp->UserBuffer : \
(MmGetSystemAddressForMdlSafe( (IC)->Irp->MdlAddress, NormalPagePriority))); \
if (NULL == *(UB)) { \
CdRaiseStatus( (IC), STATUS_INSUFFICIENT_RESOURCES); \
} \
}
#define CdLockUserBuffer(IC,BL) { \
if ((IC)->Irp->MdlAddress == NULL) { \
(VOID) CdCreateUserMdl( (IC), (BL), TRUE ); \
} \
}
//
// Dirent support routines, implemented in DirSup.c
//
VOID
CdLookupDirent (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN ULONG DirentOffset,
OUT PDIRENT_ENUM_CONTEXT DirContext
);
BOOLEAN
CdLookupNextDirent (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN PDIRENT_ENUM_CONTEXT CurrentDirContext,
OUT PDIRENT_ENUM_CONTEXT NextDirContext
);
VOID
CdUpdateDirentFromRawDirent (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN PDIRENT_ENUM_CONTEXT DirContext,
IN OUT PDIRENT Dirent
);
VOID
CdUpdateDirentName (
IN PIRP_CONTEXT IrpContext,
IN OUT PDIRENT Dirent,
IN ULONG IgnoreCase
);
BOOLEAN
CdFindFile (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN PCD_NAME Name,
IN BOOLEAN IgnoreCase,
IN OUT PFILE_ENUM_CONTEXT FileContext,
OUT PCD_NAME *MatchingName
);
BOOLEAN
CdFindDirectory (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN PCD_NAME Name,
IN BOOLEAN IgnoreCase,
IN OUT PFILE_ENUM_CONTEXT FileContext
);
BOOLEAN
CdFindFileByShortName (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN PCD_NAME Name,
IN BOOLEAN IgnoreCase,
IN ULONG ShortNameDirentOffset,
IN OUT PFILE_ENUM_CONTEXT FileContext
);
BOOLEAN
CdLookupNextInitialFileDirent (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN OUT PFILE_ENUM_CONTEXT FileContext
);
VOID
CdLookupLastFileDirent (
IN PIRP_CONTEXT IrpContext,
IN PFCB Fcb,
IN PFILE_ENUM_CONTEXT FileContext
);
VOID
CdCleanupFileContext (
IN PIRP_CONTEXT IrpContext,
IN PFILE_ENUM_CONTEXT FileContext
);
//
// VOID
// CdInitializeFileContext (
// IN PIRP_CONTEXT IrpContext,
// IN PFILE_ENUM_CONTEXT FileContext
// );
//
//
// VOID
// CdInitializeDirent (
// IN PIRP_CONTEXT IrpContext,
// IN PDIRENT Dirent
// );
//
// VOID
// CdInitializeDirContext (
// IN PIRP_CONTEXT IrpContext,
// IN PDIRENT_ENUM_CONTEXT DirContext
// );
//
// VOID
// CdCleanupDirent (
// IN PIRP_CONTEXT IrpContext,
// IN PDIRENT Dirent
// );
//
// VOID
// CdCleanupDirContext (
// IN PIRP_CONTEXT IrpContext,
// IN PDIRENT_ENUM_CONTEXT DirContext
// );
//
// VOID
// CdLookupInitialFileDirent (
// IN PIRP_CONTEXT IrpContext,
// IN PFCB Fcb,
// IN PFILE_ENUM_CONTEXT FileContext,
// IN ULONG DirentOffset
// );
//
#define CdInitializeFileContext(IC,FC) { \
RtlZeroMemory( FC, sizeof( FILE_ENUM_CONTEXT )); \
(FC)->PriorDirent = &(FC)->Dirents[0]; \
(FC)->InitialDirent = &(FC)->Dirents[1]; \
(FC)->CurrentDirent = &(FC)->Dirents[2]; \
(FC)->ShortName.FileName.MaximumLength = BYTE_COUNT_8_DOT_3; \
(FC)->ShortName.FileName.Buffer = (FC)->ShortNameBuffer; \
}
#define CdInitializeDirent(IC,D) \
RtlZeroMemory( D, sizeof( DIRENT ))
#define CdInitializeDirContext(IC,DC) \
RtlZeroMemory( DC, sizeof( DIRENT_ENUM_CONTEXT ))
#define CdCleanupDirent(IC,D) { \
if (FlagOn( (D)->Flags, DIRENT_FLAG_ALLOC_BUFFER )) { \
CdFreePool( &(D)->CdFileName.FileName.Buffer ); \
} \
}
#define CdCleanupDirContext(IC,DC) \
CdUnpinData( (IC), &(DC)->Bcb )
#define CdLookupInitialFileDirent(IC,F,FC,DO) \
CdLookupDirent( IC, \
F, \
DO, \
&(FC)->InitialDirent->DirContext ); \
CdUpdateDirentFromRawDirent( IC, \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -