📄 request.c
字号:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
request.c
Abstract:
This file implements the IrDA Serial IR NDIS MAC driver set and query
information handlers. This is provided as a sample to platform writers
and is expected to be able to be used without modification on most (if
not all) hardware platforms.
Functions:
IrsirQueryInformation
IrsirsetInformation
IrsirpNdisRequest
IrsirpSetSpeed
Notes:
--*/
#include "irsirp.h"
#define MAX(a,b) (((a) >= (b)) ? (a) : (b))
//
// Internal structure for performing asynchronous requests.
//
typedef struct _IRSIR_REQUEST
{
PIR_DEVICE pIrDevice;
NDIS_REQUEST NdisRequest;
} IRSIR_REQUEST, *PIRSIR_REQUEST;
//
// Worker prototypes.
//
static DWORD
IrsirpNdisRequest(
LPVOID pvRequest
);
static NDIS_STATUS
IrsirpSetSpeed(
PIR_DEVICE pIrDevice,
DWORD dwRequestedBPS
);
//
// Static data.
//
static const char
// v_lpszVendorDesc[] = "Serial Infrared (COM) Port";
v_lpszVendorDesc[] = "VrFIR Port";
static const UINT
v_rgSupportedOids[] =
{
//
// General required OIDs.
//
// Query Set Bytes
// supported supported required
// ----------- ----------- ----------
OID_GEN_SUPPORTED_LIST, // Query Arr(4)
OID_GEN_HARDWARE_STATUS, // Query 4
OID_GEN_MEDIA_SUPPORTED, // Query Arr(4)
OID_GEN_MEDIA_IN_USE, // Query Arr(4)
OID_GEN_MAXIMUM_LOOKAHEAD, // Query 4
OID_GEN_MAXIMUM_FRAME_SIZE, // Query 4
OID_GEN_LINK_SPEED, // Query 4
OID_GEN_TRANSMIT_BUFFER_SPACE, // Query 4
OID_GEN_RECEIVE_BUFFER_SPACE, // Query 4
OID_GEN_TRANSMIT_BLOCK_SIZE, // Query 4
OID_GEN_RECEIVE_BLOCK_SIZE, // Query 4
OID_GEN_VENDOR_ID, // Query 4
OID_GEN_VENDOR_DESCRIPTION, // Query variable
OID_GEN_VENDOR_DRIVER_VERSION, // Query 2
// OID_GEN_CURRENT_PACKET_FILTER, // Query Set 4
OID_GEN_CURRENT_LOOKAHEAD, // Query Set 4
OID_GEN_DRIVER_VERSION, // Query 2
OID_GEN_MAXIMUM_TOTAL_SIZE, // Query 4
OID_GEN_PROTOCOL_OPTIONS, // Set 4
OID_GEN_MAC_OPTIONS, // Query 4
OID_GEN_MEDIA_CONNECT_STATUS, // Query 4
OID_GEN_MAXIMUM_SEND_PACKETS, // Query 4
OID_GEN_VENDOR_DRIVER_VERSION, // Query 4
//
// Required statistical OIDs.
//
OID_GEN_XMIT_OK, // Query 4
OID_GEN_RCV_OK, // Query 4
OID_GEN_XMIT_ERROR, // Query 4
OID_GEN_RCV_ERROR, // Query 4
OID_GEN_RCV_NO_BUFFER, // Query 4
//
// Infrared-specific OIDs.
//
OID_IRDA_RECEIVING, // Query 4
OID_IRDA_TURNAROUND_TIME, // Query 4
OID_IRDA_SUPPORTED_SPEEDS, // Query Arr(4)
OID_IRDA_LINK_SPEED, // Query Set 4
OID_IRDA_MEDIA_BUSY, // Query Set 4
OID_IRDA_EXTRA_RCV_BOFS, // Query 4
OID_IRDA_REACQUIRE_HW_RESOURCES, // Set 4
OID_IRDA_RELEASE_HW_RESOURCES // Query 4
};
/*++
Function: IrsirQueryInformation
Description: Queries the caps and status of the miniport.
Arguments:
hContext - Handle to miniport context. (PIR_DEVICE).
Oid - System defined OID_Xxx.
lpvBuf - Where to return Oid specific information.
cbBuf - Size of lpvBuf in bytes.
lpcbWritten - Number of bytes written to lpvBuf.
lpcbNeeded - Additional bytes required if cbBuf less than the information
to write to the buffer.
Returns:
NDIS_STATUS Code.
Success - NDIS_STATUS_SUCCESS.
NDIS_STATUS_PENDING:
Will complete asynchronously and call
NdisMQueryInformationComplete.
Failure - NDIS_STATUS_INVALID_OID:
Don't recognize the OID.
NDIS_STATUS_INVALID_LENGTH:
lpvBuf does not match length for OID.
NDIS_STATUS_NOT_ACCEPTED:
Failure.
NDIS_STATUS_NOT_SUPPORTED:
Do not support optional OID.
NDIS_STATUS_RESOURCES:
Failure resources allocation.
Comments:
See v_rgSupportedOids array for supported OIDs.
--*/
NDIS_STATUS
IrsirQueryInformation(
IN NDIS_HANDLE hContext,
IN NDIS_OID Oid,
IN PVOID lpvBuf,
IN ULONG cbBuf,
OUT PULONG lpcbWritten,
OUT PULONG lpcbNeeded
)
{
PIR_DEVICE pIrDevice = (PIR_DEVICE)hContext;
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
ULONG cbNeeded;
DWORD dwSpeedMask;
ASSERT(lpvBuf != NULL);
ASSERT(lpcbWritten != NULL);
ASSERT(lpcbNeeded != NULL);
DEBUGMSG(ZONE_QUERYINFO,
(TEXT("+IrsirQueryInformation(0x%.8X, 0x%.8X, 0x%.8X, %d, ")
TEXT("0x%.8X, 0x%.8X)\r\n"),
hContext, Oid, lpvBuf, cbBuf, lpcbWritten, lpcbNeeded)
);
//
// First thing: Figure out required buffer size. Most OIDs require
// just a UINT, but there are exceptions.
//
switch (Oid)
{
case OID_GEN_SUPPORTED_LIST:
cbNeeded = sizeof(v_rgSupportedOids);
break;
case OID_GEN_DRIVER_VERSION:
case OID_GEN_VENDOR_DRIVER_VERSION:
cbNeeded = sizeof(USHORT);
break;
case OID_GEN_VENDOR_DESCRIPTION:
cbNeeded = sizeof(v_lpszVendorDesc);
break;
case OID_IRDA_SUPPORTED_SPEEDS:
dwSpeedMask = pIrDevice->dwSupportedSpeedsMask;
for (cbNeeded = 0; dwSpeedMask != 0; cbNeeded += sizeof(UINT))
{
// This clears the lowest set bit in the dwSpeedMask var.
dwSpeedMask &= (dwSpeedMask - 1);
}
break;
default:
cbNeeded = sizeof(UINT);
break;
}
//
// Return if the buffer provided is not large enough.
//
if (cbBuf < cbNeeded)
{
*lpcbNeeded = cbNeeded - cbBuf;
*lpcbWritten = 0;
status = NDIS_STATUS_INVALID_LENGTH;
goto done;
}
//
// Do real work.
//
*lpcbWritten = cbNeeded;
*lpcbNeeded = 0;
switch (Oid)
{
//
// General OIDs.
//
case OID_GEN_SUPPORTED_LIST:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_SUPPORTED_LIST\r\n")));
NdisMoveMemory(lpvBuf, (PVOID)v_rgSupportedOids, cbNeeded);
break;
case OID_GEN_HARDWARE_STATUS:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_HARDWARE_STATUS\r\n")));
// If we can be called with a context, the we are ready to rumble.
*(UINT *)lpvBuf = NdisHardwareStatusReady;
break;
case OID_GEN_MEDIA_SUPPORTED:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_SUPPORTED\r\n")));
*(UINT *)lpvBuf = NdisMediumIrda;
break;
case OID_GEN_MEDIA_IN_USE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MEDIA_IN_USE\r\n")));
*(UINT *)lpvBuf = NdisMediumIrda;
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_LOOKAHEAD\r\n")));
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_FRAME_SIZE\r\n")));
*(UINT *)lpvBuf = MAX_I_DATA_SIZE;
break;
case OID_GEN_LINK_SPEED:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_LINK_SPEED\r\n")));
// Link speed in 100 bps.
*(UINT *)lpvBuf = (UINT)(v_rgSupportedBaudRates[NUM_BAUDRATES - 1].dwBPS/100);
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_TRANSMIT_BUFFER_SPACE\r\n")));
// We can buffer data, so make it one NDIS packet size.
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RECEIVE_BUFFER_SPACE\r\n")));
// We can buffer data, so make it one NDIS packet size.
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
case OID_GEN_TRANSMIT_BLOCK_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_TRANSMIT_BLOCK_SIZE\r\n")));
// We can buffer data, so make it one IR packet size.
*(UINT *)lpvBuf = MAX_IRDA_DATA_SIZE;
break;
case OID_GEN_RECEIVE_BLOCK_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_RECEIVE_BLOCK_SIZE\r\n")));
// We can buffer data, so make it one IR packet size.
*(UINT *)lpvBuf = MAX_IRDA_DATA_SIZE;
break;
case OID_GEN_VENDOR_ID:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_ID\r\n")));
*(UINT *)lpvBuf = 0x00ffffff;
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_DRIVER_VERSION\r\n")));
*(USHORT *)lpvBuf = MAKEWORD(IRSIR_MINOR_VERSION, IRSIR_MAJOR_VERSION);
break;
case OID_GEN_VENDOR_DESCRIPTION:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_VENDOR_DESCRIPTION\r\n")));
NdisMoveMemory(lpvBuf, v_lpszVendorDesc, cbNeeded);
break;
// case OID_GEN_CURRENT_PACKET_FILTER:
// DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_CURRENT_PACKET_FILTER\r\n")));
// *(UINT *)lpvBuf = NDIS_PACKET_TYPE_PROMISCUOUS;
// break;
case OID_GEN_CURRENT_LOOKAHEAD:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_CURRENT_LOOKAHEAD\r\n")));
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
case OID_GEN_DRIVER_VERSION:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_DRIVER_VERSION\r\n")));
*(USHORT *)lpvBuf = MAKEWORD(NDIS_MINOR_VERSION, NDIS_MAJOR_VERSION);
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
DEBUGMSG(ZONE_QUERYINFO, (TEXT("Query: OID_GEN_MAXIMUM_TOTAL_SIZE\r\n")));
*(UINT *)lpvBuf = MAX_NDIS_DATA_SIZE;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -