Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

284 lines
6.6 KiB

/*
Copyright (c) 1992 Microsoft Corporation
Module Name:
forkio.h
Abstract:
This file defines the fork I/O prototypes which are callable at DISPATCH
level.
Author:
Jameel Hyder (microsoft!jameelh)
Revision History:
15 Jan 1993 Initial Version
Notes: Tab stop: 4
--*/
#ifndef _FORKIO_
#define _FORKIO_
#define AFP_DELALLOC_SIGNATURE 0x15263748
typedef struct _DelayedAlloc
{
#if DBG
LIST_ENTRY Linkage;
DWORD Signature;
PIRP pIrp;
DWORD State;
#endif
WORK_ITEM WorkItem;
PSDA pSda;
PREQUEST pRequest;
LARGE_INTEGER Offset;
DWORD BufSize;
POPENFORKENTRY pOpenForkEntry;
PMDL pMdl;
DWORD Flags;
} DELAYEDALLOC, *PDELAYEDALLOC;
#define AFP_CACHEMDL_DEADSESSION 0x1
#define AFP_CACHEMDL_ALLOC_ERROR 0x2
#define AFP_DBG_MDL_INIT 0x00000001
#define AFP_DBG_MDL_REQUESTED 0x00000002
#define AFP_DBG_MDL_IN_USE 0x00000004
#define AFP_DBG_MDL_RETURN_IN_PROGRESS 0x00000008
#define AFP_DBG_MDL_RETURN_COMPLETED 0x00000010
#define AFP_DBG_MDL_PROC_QUEUED 0x00000020
#define AFP_DBG_MDL_PROC_IN_PROGRESS 0x00000040
#define AFP_DBG_WRITE_MDL 0x10000000
#define AFP_DBG_READ_MDL 0x40000000
#define AFP_DBG_MDL_END 0x80000000
#if DBG
#define AFP_DBG_SET_DELALLOC_STATE(_pDelA, _flag) (_pDelA->State |= _flag)
#define AFP_DBG_SET_DELALLOC_IRP(_pDelA, _pIrp) (_pDelA->pIrp = (PIRP)_pIrp)
#define AFP_DBG_INC_DELALLOC_BYTECOUNT(_Counter, _ByteCount) \
{ \
KIRQL _OldIrql; \
ACQUIRE_SPIN_LOCK(&AfpDebugSpinLock, &_OldIrql); \
_Counter += _ByteCount; \
RELEASE_SPIN_LOCK(&AfpDebugSpinLock, _OldIrql); \
}
#define AFP_DBG_DEC_DELALLOC_BYTECOUNT(_Counter, _ByteCount) \
{ \
KIRQL _OldIrql; \
ACQUIRE_SPIN_LOCK(&AfpDebugSpinLock, &_OldIrql); \
_Counter -= _ByteCount; \
RELEASE_SPIN_LOCK(&AfpDebugSpinLock, _OldIrql); \
}
#else
#define AFP_DBG_SET_DELALLOC_STATE(_pDelA, _flag)
#define AFP_DBG_SET_DELALLOC_IRP(_pDelA, _pIrp)
#define AFP_DBG_INC_DELALLOC_BYTECOUNT(_Counter, _ByteCount)
#define AFP_DBG_DEC_DELALLOC_BYTECOUNT(_Counter, _ByteCount)
#endif
extern
AFPSTATUS
AfpIoForkRead(
IN PSDA pSda, // The session requesting read
IN POPENFORKENTRY pOpenForkEntry, // The open fork in question
IN PFORKOFFST pOffset, // Pointer to fork offset
IN LONG ReqCount, // Size of read request
IN BYTE NlMask,
IN BYTE NlChar
);
extern
AFPSTATUS
AfpIoForkWrite(
IN PSDA pSda, // The session requesting read
IN POPENFORKENTRY pOpenForkEntry, // The open fork in question
IN PFORKOFFST pOffset, // Pointer to fork offset
IN LONG ReqCount // Size of read request
);
extern
AFPSTATUS
AfpIoForkLockUnlock(
IN PSDA pSda,
IN PFORKLOCK pForkLock,
IN PFORKOFFST pForkOffset,
IN PFORKSIZE pLockSize,
IN BYTE Func
);
extern
VOID FASTCALL
AfpAllocWriteMdl(
IN PDELAYEDALLOC pDelAlloc
);
extern
NTSTATUS
AfpAllocWriteMdlCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP pIrp,
IN PVOID Context
);
extern
NTSTATUS FASTCALL
AfpBorrowWriteMdlFromCM(
IN PDELAYEDALLOC pDelAlloc,
OUT PMDL *ppReturnMdl
);
extern
VOID FASTCALL
AfpReturnWriteMdlToCM(
IN PDELAYEDALLOC pDelAlloc
);
extern
NTSTATUS
AfpReturnWriteMdlToCMCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP pIrp,
IN PVOID Context
);
extern
NTSTATUS FASTCALL
AfpBorrowReadMdlFromCM(
IN PSDA pSda
);
extern
NTSTATUS
AfpBorrowReadMdlFromCMCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP pIrp,
IN PVOID Context
);
extern
VOID FASTCALL
AfpReturnReadMdlToCM(
IN PDELAYEDALLOC pDelAlloc
);
extern
NTSTATUS
AfpReturnReadMdlToCMCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP pIrp,
IN PVOID Context
);
extern
PDELAYEDALLOC FASTCALL
AfpAllocDelAlloc(
IN VOID
);
extern
VOID FASTCALL
AfpFreeDelAlloc(
IN PDELAYEDALLOC pDelAlloc
);
// defined in fsp_fork.c, but we will put the prototype here
extern
AFPSTATUS FASTCALL
AfpFspDispReadContinue(
IN PSDA pSda
);
#define FUNC_READ 0x01
#define FUNC_WRITE 0x02
#define FUNC_LOCK 0x03
#define FUNC_UNLOCK 0x04
#define FUNC_NOTIFY 0x05
// if the Write size is below this, it's probably more efficient to avoid going to cache mgr
#define CACHEMGR_WRITE_THRESHOLD 8192
// if the Read size is below this, it's probably more efficient to avoid going to cache mgr
#define CACHEMGR_READ_THRESHOLD 8192
#ifdef FORKIO_LOCALS
// The following structure is used as a context in the Irp. The completion
// routines uses this to handle responding to the original request.
#if DBG
#define CTX_SIGNATURE *(DWORD *)"FCTX"
#define VALID_CTX(pCmplCtxt) (((pCmplCtxt) != NULL) && \
((pCmplCtxt)->Signature == CTX_SIGNATURE))
#else
#define VALID_CTX(pCmplCtxt) ((pCmplCtxt) != NULL)
#endif
typedef struct _CompletionContext
{
#if DBG
DWORD Signature;
#endif
PSDA cc_pSda; // The session context (valid except unlock)
PFORKLOCK cc_pForkLock; // Valid only during a LOCK
AFPSTATUS cc_SavedStatus; // Used by READ
LONG cc_Offst; // Offset of Write request
LONG cc_ReqCount; // The request count for read/write
BYTE cc_Func; // READ/WRITE/LOCK/UNLOCK/NOTIFY
BYTE cc_NlMask; // For read only
BYTE cc_NlChar; // For read only
} CMPLCTXT, *PCMPLCTXT;
#if DBG
#define afpInitializeCmplCtxt(pCtxt, Func, SavedStatus, pSda, pForkLock, ReqCount, Offst) \
(pCtxt)->Signature = CTX_SIGNATURE; \
(pCtxt)->cc_Func = Func; \
(pCtxt)->cc_pSda = pSda; \
(pCtxt)->cc_pForkLock = pForkLock; \
(pCtxt)->cc_SavedStatus = SavedStatus; \
(pCtxt)->cc_ReqCount= ReqCount; \
(pCtxt)->cc_Offst = Offst;
#else
#define afpInitializeCmplCtxt(pCtxt, Func, SavedStatus, pSda, pForkLock, ReqCount, Offst) \
(pCtxt)->cc_Func = Func; \
(pCtxt)->cc_pSda = pSda; \
(pCtxt)->cc_pForkLock = pForkLock; \
(pCtxt)->cc_SavedStatus = SavedStatus; \
(pCtxt)->cc_ReqCount= ReqCount; \
(pCtxt)->cc_Offst = Offst;
#endif
extern
PCMPLCTXT
AfpAllocCmplCtxtBuf(
IN PSDA pSda
);
VOID
AfpFreeCmplCtxtBuf(
IN PCMPLCTXT pCmplCtxt
);
#endif // FORKIO_LOCALS
#endif // _FORKIO_