255 lines
4 KiB
C
255 lines
4 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
spudproc.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module contains routine prototypes for SPUD.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
John Ballard (jballard) 21-Oct-1996
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#ifndef _SPUDPROCS_H_
|
||
|
#define _SPUDPROCS_H_
|
||
|
|
||
|
|
||
|
//
|
||
|
// Driver entrypoint.
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
DriverEntry(
|
||
|
IN PDRIVER_OBJECT DriverObject,
|
||
|
IN PUNICODE_STRING RegistryPath
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Initialization routines.
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudInitializeData(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// IRP handlers.
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudIrpCreate(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudIrpClose(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudIrpCleanup(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudIrpQuery(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Completion port safety.
|
||
|
//
|
||
|
|
||
|
PVOID
|
||
|
SpudReferenceCompletionPort(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpudDereferenceCompletionPort(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// XxxAndRecv routines.
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudAfdRecvFastReq(
|
||
|
PFILE_OBJECT fileObject,
|
||
|
PAFD_RECV_INFO recvInfo,
|
||
|
PSPUD_REQ_CONTEXT reqContext
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudAfdContinueRecv(
|
||
|
PDEVICE_OBJECT DeviceObject,
|
||
|
PIRP Irp,
|
||
|
PVOID Context
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudAfdCompleteRecv(
|
||
|
PDEVICE_OBJECT DeviceObject,
|
||
|
PIRP Irp,
|
||
|
PVOID Context
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpudCompleteRequest(
|
||
|
PSPUD_AFD_REQ_CONTEXT SpudReqContext
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudInitializeContextManager(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpudTerminateContextManager(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudAllocateRequestContext(
|
||
|
OUT PSPUD_AFD_REQ_CONTEXT *SpudReqContext,
|
||
|
IN PSPUD_REQ_CONTEXT ReqContext,
|
||
|
IN PAFD_RECV_INFO RecvInfo OPTIONAL,
|
||
|
IN PIRP Irp,
|
||
|
IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpudFreeRequestContext(
|
||
|
IN PSPUD_AFD_REQ_CONTEXT SpudReqContext
|
||
|
);
|
||
|
|
||
|
PSPUD_AFD_REQ_CONTEXT
|
||
|
SpudGetRequestContext(
|
||
|
IN PSPUD_REQ_CONTEXT ReqContext
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Service entry/exit routines.
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudEnterService(
|
||
|
#if DBG
|
||
|
IN PSTR ServiceName,
|
||
|
#endif
|
||
|
IN BOOLEAN InitRequired
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
SpudLeaveService(
|
||
|
#if DBG
|
||
|
IN PSTR ServiceName,
|
||
|
IN NTSTATUS Status,
|
||
|
#endif
|
||
|
IN BOOLEAN DerefRequired
|
||
|
);
|
||
|
|
||
|
#if DBG
|
||
|
#define SPUD_ENTER_SERVICE( name, init ) \
|
||
|
SpudEnterService( (PSTR)(name), (BOOLEAN)(init) )
|
||
|
#define SPUD_LEAVE_SERVICE( name, status, deref ) \
|
||
|
SpudLeaveService( (PSTR)(name), (NTSTATUS)(status), (BOOLEAN)(deref) )
|
||
|
#else
|
||
|
#define SPUD_ENTER_SERVICE( name, init ) \
|
||
|
SpudEnterService( (BOOLEAN)(init) )
|
||
|
#define SPUD_LEAVE_SERVICE( name, status, deref ) \
|
||
|
SpudLeaveService( (BOOLEAN)(deref) )
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//
|
||
|
// Miscellaneous helper routines.
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
SpudGetAfdDeviceObject(
|
||
|
IN PFILE_OBJECT AfdFileObject
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Macros stolen from NTOS\IO\IOP.H.
|
||
|
//
|
||
|
|
||
|
//+
|
||
|
//
|
||
|
// VOID
|
||
|
// IopDequeueThreadIrp(
|
||
|
// IN PIRP Irp
|
||
|
// )
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// This routine dequeues the specified I/O Request Packet (IRP) from the
|
||
|
// thread IRP queue which it is currently queued.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// Irp - Specifies the IRP that is dequeued.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
//-
|
||
|
|
||
|
#define IopDequeueThreadIrp( Irp ) { RemoveEntryList( &Irp->ThreadListEntry ); }
|
||
|
|
||
|
//+
|
||
|
// VOID
|
||
|
// IopQueueThreadIrp(
|
||
|
// IN PIRP Irp
|
||
|
// )
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// This routine queues the specified I/O Request Packet (IRP) to the thread
|
||
|
// whose TCB address is stored in the packet.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// Irp - Supplies the IRP to be queued for the specified thread.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
//-
|
||
|
|
||
|
#define IopQueueThreadIrp( Irp ) { \
|
||
|
KIRQL irql; \
|
||
|
KeRaiseIrql( APC_LEVEL, &irql ); \
|
||
|
InsertHeadList( &Irp->Tail.Overlay.Thread->IrpList, \
|
||
|
&Irp->ThreadListEntry ); \
|
||
|
KeLowerIrql( irql ); \
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif // _SPUDPROCS_H_
|
||
|
|