mirror of
https://github.com/reactos/reactos.git
synced 2025-06-05 09:20:30 +00:00
[CSQ]
Formatting, add annotations, use doxygen style comments, no functional change svn path=/trunk/; revision=57953
This commit is contained in:
parent
a011b6bc32
commit
ed547ad4a5
1 changed files with 289 additions and 255 deletions
|
@ -30,13 +30,13 @@
|
||||||
#include <ntifs.h>
|
#include <ntifs.h>
|
||||||
|
|
||||||
|
|
||||||
static VOID NTAPI IopCsqCancelRoutine(PDEVICE_OBJECT DeviceObject,
|
/*!
|
||||||
PIRP Irp)
|
* @brief Cancel routine that is installed on any IRP that this library manages
|
||||||
/*
|
*
|
||||||
* FUNCTION: Cancel routine that is installed on any IRP that this library manages
|
* @param DeviceObject
|
||||||
* ARGUMENTS:
|
* @param Irp
|
||||||
* [Called back by the system]
|
*
|
||||||
* NOTES:
|
* @note
|
||||||
* - We assume that Irp->Tail.Overlay.DriverContext[3] has either a IO_CSQ
|
* - We assume that Irp->Tail.Overlay.DriverContext[3] has either a IO_CSQ
|
||||||
* or an IO_CSQ_IRP_CONTEXT in it, but we have to figure out which it is
|
* or an IO_CSQ_IRP_CONTEXT in it, but we have to figure out which it is
|
||||||
* - By the time this routine executes, the I/O Manager has already cleared
|
* - By the time this routine executes, the I/O Manager has already cleared
|
||||||
|
@ -46,6 +46,13 @@ static VOID NTAPI IopCsqCancelRoutine(PDEVICE_OBJECT DeviceObject,
|
||||||
* system
|
* system
|
||||||
* - May be called at high IRQL
|
* - May be called at high IRQL
|
||||||
*/
|
*/
|
||||||
|
_Function_class_(DRIVER_CANCEL)
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
IopCsqCancelRoutine(
|
||||||
|
_Inout_ PDEVICE_OBJECT DeviceObject,
|
||||||
|
_Inout_ _IRQL_uses_cancel_ PIRP Irp)
|
||||||
{
|
{
|
||||||
PIO_CSQ Csq;
|
PIO_CSQ Csq;
|
||||||
KIRQL Irql;
|
KIRQL Irql;
|
||||||
|
@ -74,28 +81,33 @@ static VOID NTAPI IopCsqCancelRoutine(PDEVICE_OBJECT DeviceObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS NTAPI IoCsqInitialize(PIO_CSQ Csq,
|
/*!
|
||||||
PIO_CSQ_INSERT_IRP CsqInsertIrp,
|
* @brief Set up a CSQ struct to initialize the queue
|
||||||
PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
|
*
|
||||||
PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
|
* @param Csq - Caller-allocated non-paged space for our IO_CSQ to be initialized
|
||||||
PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
|
* @param CsqInsertIrp - Insert routine
|
||||||
PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
|
* @param CsqRemoveIrp - Remove routine
|
||||||
PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)
|
* @param CsqPeekNextIrp - Routine to paeek at the next IRP in queue
|
||||||
/*
|
* @param CsqAcquireLock - Acquire the queue's lock
|
||||||
* FUNCTION: Set up a CSQ struct to initialize the queue
|
* @param CsqReleaseLock - Release the queue's lock
|
||||||
* ARGUMENTS:
|
* @param CsqCompleteCanceledIrp - Routine to complete IRPs when they are canceled
|
||||||
* Csq: Caller-allocated non-paged space for our IO_CSQ to be initialized
|
*
|
||||||
* CsqInsertIrp: Insert routine
|
* @return
|
||||||
* CsqRemoveIrp: Remove routine
|
|
||||||
* CsqPeekNextIrp: Routine to paeek at the next IRP in queue
|
|
||||||
* CsqAcquireLock: Acquire the queue's lock
|
|
||||||
* CsqReleaseLock: Release the queue's lock
|
|
||||||
* CsqCompleteCanceledIrp: Routine to complete IRPs when they are canceled
|
|
||||||
* RETURNS:
|
|
||||||
* - STATUS_SUCCESS in all cases
|
* - STATUS_SUCCESS in all cases
|
||||||
* NOTES:
|
*
|
||||||
|
* @note
|
||||||
* - Csq must be non-paged, as the queue is manipulated with a held spinlock
|
* - Csq must be non-paged, as the queue is manipulated with a held spinlock
|
||||||
*/
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IoCsqInitialize(
|
||||||
|
_Out_ PIO_CSQ Csq,
|
||||||
|
_In_ PIO_CSQ_INSERT_IRP CsqInsertIrp,
|
||||||
|
_In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
|
||||||
|
_In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
|
||||||
|
_In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
|
||||||
|
_In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
|
||||||
|
_In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)
|
||||||
{
|
{
|
||||||
Csq->Type = IO_TYPE_CSQ;
|
Csq->Type = IO_TYPE_CSQ;
|
||||||
Csq->CsqInsertIrp = CsqInsertIrp;
|
Csq->CsqInsertIrp = CsqInsertIrp;
|
||||||
|
@ -110,28 +122,32 @@ NTSTATUS NTAPI IoCsqInitialize(PIO_CSQ Csq,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS NTAPI IoCsqInitializeEx(PIO_CSQ Csq,
|
/*!
|
||||||
PIO_CSQ_INSERT_IRP_EX CsqInsertIrpEx,
|
* @brief Set up a CSQ struct to initialize the queue (extended version)
|
||||||
PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
|
*
|
||||||
PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
|
* @param Csq - Caller-allocated non-paged space for our IO_CSQ to be initialized
|
||||||
PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
|
* @param CsqInsertIrpEx - Extended insert routine
|
||||||
PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
|
* @param CsqRemoveIrp - Remove routine
|
||||||
PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)
|
* @param CsqPeekNextIrp - Routine to paeek at the next IRP in queue
|
||||||
/*
|
* @param CsqAcquireLock - Acquire the queue's lock
|
||||||
* FUNCTION: Set up a CSQ struct to initialize the queue (extended version)
|
* @param CsqReleaseLock - Release the queue's lock
|
||||||
* ARGUMENTS:
|
* @param CsqCompleteCanceledIrp - Routine to complete IRPs when they are canceled
|
||||||
* Csq: Caller-allocated non-paged space for our IO_CSQ to be initialized
|
*
|
||||||
* CsqInsertIrpEx: Extended insert routine
|
* @return
|
||||||
* CsqRemoveIrp: Remove routine
|
|
||||||
* CsqPeekNextIrp: Routine to paeek at the next IRP in queue
|
|
||||||
* CsqAcquireLock: Acquire the queue's lock
|
|
||||||
* CsqReleaseLock: Release the queue's lock
|
|
||||||
* CsqCompleteCanceledIrp: Routine to complete IRPs when they are canceled
|
|
||||||
* RETURNS:
|
|
||||||
* - STATUS_SUCCESS in all cases
|
* - STATUS_SUCCESS in all cases
|
||||||
* NOTES:
|
* @note
|
||||||
* - Csq must be non-paged, as the queue is manipulated with a held spinlock
|
* - Csq must be non-paged, as the queue is manipulated with a held spinlock
|
||||||
*/
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IoCsqInitializeEx(
|
||||||
|
_Out_ PIO_CSQ Csq,
|
||||||
|
_In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrpEx,
|
||||||
|
_In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
|
||||||
|
_In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
|
||||||
|
_In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
|
||||||
|
_In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
|
||||||
|
_In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp)
|
||||||
{
|
{
|
||||||
Csq->Type = IO_TYPE_CSQ_EX;
|
Csq->Type = IO_TYPE_CSQ_EX;
|
||||||
Csq->CsqInsertIrp = (PIO_CSQ_INSERT_IRP)CsqInsertIrpEx;
|
Csq->CsqInsertIrp = (PIO_CSQ_INSERT_IRP)CsqInsertIrpEx;
|
||||||
|
@ -146,35 +162,36 @@ NTSTATUS NTAPI IoCsqInitializeEx(PIO_CSQ Csq,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID NTAPI IoCsqInsertIrp(PIO_CSQ Csq,
|
/*!
|
||||||
PIRP Irp,
|
* @brief Insert an IRP into the CSQ
|
||||||
PIO_CSQ_IRP_CONTEXT Context)
|
*
|
||||||
/*
|
* @param Csq - Pointer to the initialized CSQ
|
||||||
* FUNCTION: Insert an IRP into the CSQ
|
* @param Irp - Pointer to the IRP to queue
|
||||||
* ARGUMENTS:
|
* @param Context - Context record to track the IRP while queued
|
||||||
* Csq: Pointer to the initialized CSQ
|
*
|
||||||
* Irp: Pointer to the IRP to queue
|
* @return
|
||||||
* Context: Context record to track the IRP while queued
|
|
||||||
* NOTES:
|
|
||||||
* - Just passes through to IoCsqInsertIrpEx, with no InsertContext
|
* - Just passes through to IoCsqInsertIrpEx, with no InsertContext
|
||||||
*/
|
*/
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
IoCsqInsertIrp(
|
||||||
|
_Inout_ PIO_CSQ Csq,
|
||||||
|
_Inout_ PIRP Irp,
|
||||||
|
_Out_opt_ PIO_CSQ_IRP_CONTEXT Context)
|
||||||
{
|
{
|
||||||
IoCsqInsertIrpEx(Csq, Irp, Context, 0);
|
IoCsqInsertIrpEx(Csq, Irp, Context, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS NTAPI IoCsqInsertIrpEx(PIO_CSQ Csq,
|
/*!
|
||||||
PIRP Irp,
|
* @brief Insert an IRP into the CSQ, with additional tracking context
|
||||||
PIO_CSQ_IRP_CONTEXT Context,
|
*
|
||||||
PVOID InsertContext)
|
* @param Csq - Pointer to the initialized CSQ
|
||||||
/*
|
* @param Irp - Pointer to the IRP to queue
|
||||||
* FUNCTION: Insert an IRP into the CSQ, with additional tracking context
|
* @param Context - Context record to track the IRP while queued
|
||||||
* ARGUMENTS:
|
* @param InsertContext - additional data that is passed through to CsqInsertIrpEx
|
||||||
* Csq: Pointer to the initialized CSQ
|
*
|
||||||
* Irp: Pointer to the IRP to queue
|
* @note
|
||||||
* Context: Context record to track the IRP while queued
|
|
||||||
* InsertContext: additional data that is passed through to CsqInsertIrpEx
|
|
||||||
* NOTES:
|
|
||||||
* - Passes the additional context through to the driver-supplied callback,
|
* - Passes the additional context through to the driver-supplied callback,
|
||||||
* which can be used with more sophistocated queues
|
* which can be used with more sophistocated queues
|
||||||
* - Marks the IRP pending in all cases
|
* - Marks the IRP pending in all cases
|
||||||
|
@ -183,6 +200,13 @@ NTSTATUS NTAPI IoCsqInsertIrpEx(PIO_CSQ Csq,
|
||||||
* I'm sure I have gotten the details wrong on a fine point or two, but
|
* I'm sure I have gotten the details wrong on a fine point or two, but
|
||||||
* basically this works with the MS-supplied samples.
|
* basically this works with the MS-supplied samples.
|
||||||
*/
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IoCsqInsertIrpEx(
|
||||||
|
_Inout_ PIO_CSQ Csq,
|
||||||
|
_Inout_ PIRP Irp,
|
||||||
|
_Out_opt_ PIO_CSQ_IRP_CONTEXT Context,
|
||||||
|
_In_opt_ PVOID InsertContext)
|
||||||
{
|
{
|
||||||
NTSTATUS Retval = STATUS_SUCCESS;
|
NTSTATUS Retval = STATUS_SUCCESS;
|
||||||
KIRQL Irql;
|
KIRQL Irql;
|
||||||
|
@ -281,19 +305,24 @@ NTSTATUS NTAPI IoCsqInsertIrpEx(PIO_CSQ Csq,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PIRP NTAPI IoCsqRemoveIrp(PIO_CSQ Csq,
|
/*!
|
||||||
PIO_CSQ_IRP_CONTEXT Context)
|
* @brief Remove anb IRP from the queue
|
||||||
/*
|
*
|
||||||
* FUNCTION: Remove anb IRP from the queue
|
* @param Csq - Queue to remove the IRP from
|
||||||
* ARGUMENTS:
|
* @param Context - Context record containing the IRP to be dequeued
|
||||||
* Csq: Queue to remove the IRP from
|
*
|
||||||
* Context: Context record containing the IRP to be dequeued
|
* @return
|
||||||
* RETURNS:
|
|
||||||
* - Pointer to an IRP if we found it
|
* - Pointer to an IRP if we found it
|
||||||
* NOTES:
|
*
|
||||||
|
* @note
|
||||||
* - Don't forget that we can be canceled any time up to the point
|
* - Don't forget that we can be canceled any time up to the point
|
||||||
* where we unset our cancel routine
|
* where we unset our cancel routine
|
||||||
*/
|
*/
|
||||||
|
PIRP
|
||||||
|
NTAPI
|
||||||
|
IoCsqRemoveIrp(
|
||||||
|
_Inout_ PIO_CSQ Csq,
|
||||||
|
_Inout_ PIO_CSQ_IRP_CONTEXT Context)
|
||||||
{
|
{
|
||||||
KIRQL Irql;
|
KIRQL Irql;
|
||||||
PIRP Irp = NULL;
|
PIRP Irp = NULL;
|
||||||
|
@ -334,23 +363,28 @@ PIRP NTAPI IoCsqRemoveIrp(PIO_CSQ Csq,
|
||||||
return Irp;
|
return Irp;
|
||||||
}
|
}
|
||||||
|
|
||||||
PIRP NTAPI IoCsqRemoveNextIrp(PIO_CSQ Csq,
|
/*!
|
||||||
PVOID PeekContext)
|
* @brief IoCsqRemoveNextIrp - Removes the next IRP from the queue
|
||||||
/*
|
*
|
||||||
* FUNCTION: IoCsqRemoveNextIrp - Removes the next IRP from the queue
|
* @param Csq - Queue to remove the IRP from
|
||||||
* ARGUMENTS:
|
* @param PeekContext - Identifier of the IRP to be removed
|
||||||
* Csq: Queue to remove the IRP from
|
*
|
||||||
* PeekContext: Identifier of the IRP to be removed
|
* @return
|
||||||
* RETURNS:
|
|
||||||
* Pointer to the IRP that was removed, or NULL if one
|
* Pointer to the IRP that was removed, or NULL if one
|
||||||
* could not be found
|
* could not be found
|
||||||
* NOTES:
|
*
|
||||||
|
* @note
|
||||||
* - This function is sensitive to yet another race condition.
|
* - This function is sensitive to yet another race condition.
|
||||||
* The basic idea is that we have to return the first IRP that
|
* The basic idea is that we have to return the first IRP that
|
||||||
* we get that matches the PeekContext >that is not already canceled<.
|
* we get that matches the PeekContext >that is not already canceled<.
|
||||||
* Therefore, we have to do a trick similar to the one done in Insert
|
* Therefore, we have to do a trick similar to the one done in Insert
|
||||||
* above.
|
* above.
|
||||||
*/
|
*/
|
||||||
|
PIRP
|
||||||
|
NTAPI
|
||||||
|
IoCsqRemoveNextIrp(
|
||||||
|
_Inout_ PIO_CSQ Csq,
|
||||||
|
_In_opt_ PVOID PeekContext)
|
||||||
{
|
{
|
||||||
KIRQL Irql;
|
KIRQL Irql;
|
||||||
PIRP Irp = NULL;
|
PIRP Irp = NULL;
|
||||||
|
|
Loading…
Reference in a new issue