mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
4.4 KiB
224 lines
4.4 KiB
/*++
|
|
|
|
Copyright (c) 1998-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
filecache.h
|
|
|
|
Abstract:
|
|
|
|
This module contains declarations for the open file handle cache.
|
|
|
|
Author:
|
|
|
|
Keith Moore (keithmo) 21-Aug-1998
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _FILECACHE_H_
|
|
#define _FILECACHE_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
//
|
|
// Data used to track a file cache entry.
|
|
//
|
|
|
|
typedef struct _UL_FILE_CACHE_ENTRY
|
|
{
|
|
//
|
|
// Signature.
|
|
//
|
|
|
|
ULONG Signature;
|
|
|
|
//
|
|
// A reference count.
|
|
//
|
|
|
|
LONG ReferenceCount;
|
|
|
|
//
|
|
// A pre-referenced file object pointer for this file. This pointer
|
|
// is valid in *any* thread/process context.
|
|
//
|
|
|
|
PFILE_OBJECT pFileObject;
|
|
|
|
//
|
|
// The *correct* device object referenced by the above file object.
|
|
//
|
|
|
|
PDEVICE_OBJECT pDeviceObject;
|
|
|
|
//
|
|
// Fast I/O routines.
|
|
//
|
|
|
|
PFAST_IO_MDL_READ pMdlRead;
|
|
PFAST_IO_MDL_READ_COMPLETE pMdlReadComplete;
|
|
|
|
//
|
|
// The name of the file.
|
|
//
|
|
|
|
UNICODE_STRING FileName;
|
|
|
|
//
|
|
// The open file handle. Note that this handle is only valid
|
|
// in the context of the system process.
|
|
//
|
|
|
|
HANDLE FileHandle;
|
|
|
|
//
|
|
// A work item for deferred operations.
|
|
//
|
|
|
|
UL_WORK_ITEM WorkItem;
|
|
|
|
//
|
|
// File-specific information gleaned from the file system.
|
|
//
|
|
|
|
FILE_STANDARD_INFORMATION FileInfo;
|
|
|
|
} UL_FILE_CACHE_ENTRY, *PUL_FILE_CACHE_ENTRY;
|
|
|
|
#define UL_FILE_CACHE_ENTRY_SIGNATURE ((ULONG)'ELIF')
|
|
#define UL_FILE_CACHE_ENTRY_SIGNATURE_X MAKE_FREE_SIGNATURE(UL_FILE_CACHE_ENTRY_SIGNATURE)
|
|
|
|
#define IS_VALID_FILE_CACHE_ENTRY( entry ) \
|
|
( (entry)->Signature == UL_FILE_CACHE_ENTRY_SIGNATURE )
|
|
|
|
|
|
//
|
|
// A file buffer contains the results of a read from a file cache entry.
|
|
// The file cache read and read complete routines take pointers to this
|
|
// structure. A read fills it in, and a read complete frees the data.
|
|
//
|
|
|
|
typedef struct _UL_FILE_BUFFER
|
|
{
|
|
//
|
|
// The file that provided the data.
|
|
//
|
|
PUL_FILE_CACHE_ENTRY pFileCacheEntry;
|
|
|
|
//
|
|
// The data read from the file. Filled in by
|
|
// the read routines.
|
|
//
|
|
PMDL pMdl;
|
|
|
|
//
|
|
// If we have to allocate our own buffer to hold file data
|
|
// we'll save a pointer to the data buffer here.
|
|
//
|
|
PUCHAR pFileData;
|
|
|
|
//
|
|
// Information about the data buffers.
|
|
// Filled in by the read routine's caller.
|
|
//
|
|
LARGE_INTEGER FileOffset;
|
|
ULONG Length;
|
|
|
|
//
|
|
// Completion routine and context information set by the caller.
|
|
//
|
|
PIO_COMPLETION_ROUTINE pCompletionRoutine;
|
|
PVOID pContext;
|
|
|
|
} UL_FILE_BUFFER, *PUL_FILE_BUFFER;
|
|
|
|
|
|
NTSTATUS
|
|
InitializeFileCache(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TerminateFileCache(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Routines to create, reference and release a cache entry.
|
|
//
|
|
|
|
NTSTATUS
|
|
UlCreateFileEntry(
|
|
IN PUNICODE_STRING pFileName OPTIONAL,
|
|
IN HANDLE FileHandle OPTIONAL,
|
|
IN KPROCESSOR_MODE AccessMode,
|
|
OUT PUL_FILE_CACHE_ENTRY *pFileCacheEntry
|
|
);
|
|
|
|
VOID
|
|
ReferenceCachedFile(
|
|
IN PUL_FILE_CACHE_ENTRY pFileCacheEntry
|
|
);
|
|
|
|
VOID
|
|
DereferenceCachedFile(
|
|
IN PUL_FILE_CACHE_ENTRY pFileCacheEntry
|
|
);
|
|
|
|
|
|
//
|
|
// Read and read complete routines.
|
|
//
|
|
// The fast versions complete immediately, but sometimes fail.
|
|
// The normal versions use an IRP provided by the caller.
|
|
//
|
|
|
|
NTSTATUS
|
|
UlReadFileEntry(
|
|
IN OUT PUL_FILE_BUFFER pFileBuffer,
|
|
IN PIRP pIrp
|
|
);
|
|
|
|
NTSTATUS
|
|
UlReadFileEntryFast(
|
|
IN OUT PUL_FILE_BUFFER pFileBuffer
|
|
);
|
|
|
|
NTSTATUS
|
|
UlReadCompleteFileEntry(
|
|
IN PUL_FILE_BUFFER pFileBuffer,
|
|
IN PIRP pIrp
|
|
);
|
|
|
|
NTSTATUS
|
|
UlReadCompleteFileEntryFast(
|
|
IN PUL_FILE_BUFFER pFileBuffer
|
|
);
|
|
|
|
//
|
|
// UL_FILE_BUFFER macros.
|
|
//
|
|
|
|
#define INITIALIZE_FILE_BUFFER(fbuf) \
|
|
do { \
|
|
(fbuf)->pFileCacheEntry = NULL; \
|
|
(fbuf)->pMdl = NULL; \
|
|
(fbuf)->pFileData = NULL; \
|
|
(fbuf)->FileOffset.QuadPart = 0; \
|
|
(fbuf)->Length = 0; \
|
|
} while (0)
|
|
|
|
#define IS_FILE_BUFFER_IN_USE(fbuf) ((fbuf)->pFileCacheEntry)
|
|
|
|
#ifdef __cplusplus
|
|
}; // extern "C"
|
|
#endif
|
|
|
|
#endif // _FILECACHE_H_
|