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.
160 lines
7.9 KiB
160 lines
7.9 KiB
/*++
|
|
|
|
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
|