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.
252 lines
5.2 KiB
252 lines
5.2 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
irp2pkt.h
|
|
|
|
Abstract:
|
|
|
|
IRP to packet[s] mapping declaration.
|
|
|
|
1-1 messages, IRP handles a single packet request to QM.
|
|
1-N messages, IRP may handle multiple packet requests to QM.
|
|
|
|
Author:
|
|
|
|
Shai Kariv (shaik) 29-May-2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef __IRP2PKT_H
|
|
#define __IRP2PKT_H
|
|
|
|
#include "packet.h"
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
//
|
|
// class CPacketIterator
|
|
//
|
|
// Header is declared here to allow inclusion of nested classes.
|
|
//
|
|
//--------------------------------------------------------------
|
|
|
|
class CPacketIterator {
|
|
public:
|
|
|
|
//--------------------------------------------------------------
|
|
//
|
|
// class CPacketIterator::CEntry
|
|
//
|
|
// Linked list entry. Points to a packet.
|
|
//
|
|
//--------------------------------------------------------------
|
|
|
|
class CEntry {
|
|
public:
|
|
|
|
CEntry(CPacket * pPacket) : m_pPacket(pPacket) {}
|
|
|
|
LIST_ENTRY m_link;
|
|
CPacket * m_pPacket;
|
|
};
|
|
|
|
//--------------------------------------------------------------
|
|
//
|
|
// class CPacketIterator
|
|
//
|
|
// The class definition actually starts at the top of this file.
|
|
//
|
|
//--------------------------------------------------------------
|
|
//class CPacketIterator {
|
|
public:
|
|
//
|
|
// Constructor.
|
|
//
|
|
CPacketIterator() :
|
|
m_nEntries(0),
|
|
m_nPacketsPendingCreate(0),
|
|
m_fHeld(false)
|
|
{
|
|
}
|
|
|
|
//
|
|
// List manipulation encapsulation.
|
|
//
|
|
bool insert(CPacket * pPacket);
|
|
VOID remove(CPacket * pPacket);
|
|
VOID remove(CEntry * pEntry);
|
|
CPacket * gethead(VOID);
|
|
CPacket * peekhead(VOID);
|
|
|
|
//
|
|
// Get number of entries in list.
|
|
//
|
|
ULONG
|
|
NumOfEntries(
|
|
VOID
|
|
)
|
|
{
|
|
return m_nEntries;
|
|
}
|
|
|
|
//
|
|
// Get a reference to the list
|
|
//
|
|
List<CEntry>&
|
|
entries(
|
|
VOID
|
|
)
|
|
{
|
|
return m_entries;
|
|
}
|
|
|
|
//
|
|
// Get number of packets that are pending for create by QM.
|
|
//
|
|
ULONG
|
|
NumOfPacketsPendingCreate(
|
|
VOID
|
|
)
|
|
{
|
|
return m_nPacketsPendingCreate;
|
|
}
|
|
|
|
//
|
|
// Increase counter of packets that are pending for create by QM.
|
|
//
|
|
VOID
|
|
IncreasePacketsPendingCreateCounter(
|
|
VOID
|
|
)
|
|
{
|
|
++m_nPacketsPendingCreate;
|
|
}
|
|
|
|
//
|
|
// Decrease counter of packets that are pending for create by QM.
|
|
//
|
|
VOID
|
|
DecreasePacketsPendingCreateCounter(
|
|
VOID
|
|
)
|
|
{
|
|
ASSERT(m_nPacketsPendingCreate > 0);
|
|
--m_nPacketsPendingCreate;
|
|
}
|
|
|
|
//
|
|
// Handle is held in list
|
|
//
|
|
bool
|
|
IsHeld(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_fHeld;
|
|
}
|
|
|
|
VOID
|
|
IsHeld(
|
|
bool fHeld
|
|
)
|
|
{
|
|
m_fHeld = fHeld;
|
|
}
|
|
|
|
private:
|
|
//
|
|
// Find an entry in the list
|
|
//
|
|
CEntry * Packet2Entry(CPacket * pPacket);
|
|
|
|
private:
|
|
//
|
|
// The linked list of packets.
|
|
//
|
|
List<CEntry> m_entries;
|
|
ULONG m_nEntries;
|
|
|
|
//
|
|
// Number of packets that are pending for create by QM.
|
|
//
|
|
ULONG m_nPacketsPendingCreate;
|
|
|
|
//
|
|
// Is held in list
|
|
//
|
|
bool m_fHeld;
|
|
|
|
}; // class CPacketIterator
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
//
|
|
// class CIrp2Pkt
|
|
//
|
|
// Interface encapulation for IRP to packet mapping.
|
|
//
|
|
//--------------------------------------------------------------
|
|
|
|
class CIrp2Pkt
|
|
{
|
|
public:
|
|
|
|
//
|
|
// Handle irp to single packet mapping.
|
|
//
|
|
static VOID AttachSinglePacket(PIRP irp, CPacket * pPacket);
|
|
static CPacket * DetachSinglePacket(PIRP irp);
|
|
static CPacket * PeekSinglePacket(PIRP irp);
|
|
|
|
//
|
|
// Handle irp to multiple packets mapping.
|
|
//
|
|
static ULONG NumOfAttachedPackets(PIRP irp);
|
|
static bool AttachPacket(PIRP irp, CPacket * pPacket);
|
|
static CPacket * DetachPacket(PIRP irp, CPacket * pPacket);
|
|
static CPacket * GetAttachedPacketsHead(PIRP irp);
|
|
static bool IsHeld(PIRP irp);
|
|
static VOID IsHeld(PIRP irp, bool fHeld);
|
|
|
|
//
|
|
// Handle packets that are pending for creation by QM.
|
|
//
|
|
static ULONG NumOfPacketsPendingCreate(PIRP irp);
|
|
static VOID IncreasePacketsPendingCreateCounter(PIRP irp);
|
|
static VOID DecreasePacketsPendingCreateCounter(PIRP irp);
|
|
|
|
//
|
|
// "safe" routines: used when caller doesn't care if irp represents multiple packets or not.
|
|
//
|
|
static CPacket * SafePeekFirstPacket(PIRP irp);
|
|
static CPacket * SafeGetAttachedPacketsHead(PIRP irp);
|
|
static CPacket * SafeDetachPacket(PIRP irp, CPacket * pPacket);
|
|
static bool SafeAttachPacket(PIRP irp, CPacket * pPacket);
|
|
|
|
//
|
|
// Handle packet iterator for the irp.
|
|
//
|
|
static VOID InitPacketIterator(PIRP irp);
|
|
static List<CPacketIterator::CEntry>& GetPacketIteratorEntries(PIRP);
|
|
|
|
private:
|
|
|
|
//
|
|
// Handle packet iterator for the irp.
|
|
//
|
|
static CPacketIterator * AllocatePacketIterator(PIRP irp);
|
|
static VOID DeallocatePacketIterator(PIRP irp);
|
|
static CPacketIterator * SetPacketIterator(PIRP irp, CPacketIterator * p);
|
|
static CPacketIterator * GetPacketIterator(PIRP irp);
|
|
|
|
}; // class CIrp2Pkt
|
|
|
|
|
|
#endif // __IRP2PKT_H
|
|
|
|
|