windows-nt/Source/XPSP1/NT/net/ndis/sys/requestm.h
2020-09-26 16:20:57 +08:00

161 lines
7.9 KiB
C

/*++
Copyright (c) 1990-1995 Microsoft Corporation
Module Name:
requestm.h
Abstract:
Author:
Kyle Brandon (KyleB)
Environment:
Kernel mode
Revision History:
--*/
#ifndef __REQUESTM_H
#define __REQUESTM_H
typedef struct _NDIS_REQUEST_RESERVED
{
PNDIS_REQUEST Next;
PNDIS_OPEN_BLOCK Open;
PVOID Context;
ULONG Flags;
} NDIS_REQUEST_RESERVED, *PNDIS_REQUEST_RESERVED;
#define PNDIS_RESERVED_FROM_PNDIS_REQUEST(_request) ((PNDIS_REQUEST_RESERVED)((_request)->MacReserved))
//
// Used by the NdisCoRequest api to keep context information in the Request->NdisReserved
//
typedef struct _NDIS_COREQ_RESERVED
{
union
{
struct
{
CO_REQUEST_COMPLETE_HANDLER CoRequestCompleteHandler;
NDIS_HANDLE VcContext;
NDIS_HANDLE AfContext;
NDIS_HANDLE PartyContext;
};
struct
{
NDIS_STATUS Status;
KEVENT Event;
};
};
} NDIS_COREQ_RESERVED, *PNDIS_COREQ_RESERVED;
#define REQST_DOWNLEVEL 0x00000001
#define REQST_FREE_REQUEST 0x00000002
#define REQST_SIGNAL_EVENT 0x00000004
#define REQST_SAVE_BUF 0x00000008
#define REQST_LAST_RESTORE 0x00000010
#define REQST_MANDATORY 0x00000020
#define REQST_COMPLETED 0x80000000
#define PNDIS_COREQ_RESERVED_FROM_REQUEST(_request) ((PNDIS_COREQ_RESERVED)((_request)->NdisReserved))
//
// The following structure keeps track of wakeup patterns for open blocks.
//
typedef struct _NDIS_PACKET_PATTERN_ENTRY
{
SINGLE_LIST_ENTRY Link;
PNDIS_OPEN_BLOCK Open;
NDIS_PM_PACKET_PATTERN Pattern;
} NDIS_PACKET_PATTERN_ENTRY, *PNDIS_PACKET_PATTERN_ENTRY;
#define MINIPORT_QUERY_INFO(_M_, _R_, _S_) *(_S_) = ndisMDispatchRequest(_M_, _R_, TRUE)
#define MINIPORT_SET_INFO(_M_, _R_, _S_) *(_S_) = ndisMDispatchRequest(_M_, _R_, FALSE)
#define SAVE_REQUEST_BUF(_M_, _R_, _B_, _L_) \
{ \
PNDIS_RESERVED_FROM_PNDIS_REQUEST(_R_)->Flags |= REQST_SAVE_BUF; \
(_M_)->SetInfoBuf = (_R_)->DATA.SET_INFORMATION.InformationBuffer; \
(_M_)->SetInfoBufLen = (USHORT)((_R_)->DATA.SET_INFORMATION.InformationBufferLength); \
(_R_)->DATA.SET_INFORMATION.InformationBuffer = _B_; \
(_R_)->DATA.SET_INFORMATION.InformationBufferLength = _L_; \
}
#define RESTORE_REQUEST_BUF(_M_, _R_) \
{ \
if (PNDIS_RESERVED_FROM_PNDIS_REQUEST(_R_)->Flags & REQST_SAVE_BUF) \
{ \
PNDIS_RESERVED_FROM_PNDIS_REQUEST(_R_)->Flags &= ~REQST_SAVE_BUF; \
(_R_)->DATA.SET_INFORMATION.InformationBuffer = (_M_)->SetInfoBuf; \
(_R_)->DATA.SET_INFORMATION.InformationBufferLength = (_M_)->SetInfoBufLen; \
(_M_)->SetInfoBuf = NULL; \
(_M_)->SetInfoBufLen = 0; \
} \
}
//
// This macro verifies the query information buffer length.
//
#define VERIFY_QUERY_PARAMETERS(_Request, _SizeNeeded, _Status) \
{ \
_Status = NDIS_STATUS_SUCCESS; \
if ((_Request)->DATA.QUERY_INFORMATION.InformationBufferLength < (_SizeNeeded)) \
{ \
(_Request)->DATA.QUERY_INFORMATION.BytesNeeded = (_SizeNeeded); \
_Status = NDIS_STATUS_INVALID_LENGTH; \
} \
}
//
// This macro verifies the set information buffer length.
//
#define VERIFY_SET_PARAMETERS(_Request, _SizeNeeded, _Status) \
{ \
_Status = NDIS_STATUS_SUCCESS; \
if ((_Request)->DATA.SET_INFORMATION.InformationBufferLength < (_SizeNeeded)) \
{ \
(_Request)->DATA.SET_INFORMATION.BytesNeeded = (_SizeNeeded); \
_Status = NDIS_STATUS_INVALID_LENGTH; \
} \
}
#define SET_INTERNAL_REQUEST(_Request, _Open, _Flags) \
{ \
PNDIS_RESERVED_FROM_PNDIS_REQUEST(_Request)->Open = (_Open); \
PNDIS_RESERVED_FROM_PNDIS_REQUEST(_Request)->Flags = _Flags; \
\
if (NULL != (_Open)) \
{ \
M_OPEN_INCREMENT_REF_INTERLOCKED(_Open); \
\
DBGPRINT(DBG_COMP_OPENREF, DBG_LEVEL_INFO, \
("+ Open 0x%x Reference 0x%x\n", _Open, (_Open)->References)); \
} \
}
#define SET_INTERNAL_REQUEST_NULL_OPEN(_Request, _Flags) \
{ \
PNDIS_RESERVED_FROM_PNDIS_REQUEST(_Request)->Open = NULL; \
PNDIS_RESERVED_FROM_PNDIS_REQUEST(_Request)->Flags = _Flags; \
}
#define INIT_INTERNAL_REQUEST(_Request, _Oid, _Type, _Buf, _Len) \
{ \
NdisZeroMemory(_Request, sizeof(NDIS_REQUEST)); \
PNDIS_RESERVED_FROM_PNDIS_REQUEST(_Request)->Flags = REQST_SIGNAL_EVENT; \
(_Request)->DATA.QUERY_INFORMATION.Oid = _Oid; \
(_Request)->RequestType = _Type; \
(_Request)->DATA.QUERY_INFORMATION.InformationBuffer = _Buf; \
(_Request)->DATA.QUERY_INFORMATION.InformationBufferLength = _Len; \
}
#endif // __REQUESTM_H