/* §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ (C) Copyright 1998 All rights reserved. §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ Portions of this software are: (C) Copyright 1994 TriplePoint, Inc. -- http://www.TriplePoint.com License to use this software is granted under the same terms outlined in the Microsoft Windows Device Driver Development Kit. (C) Copyright 1992 Microsoft Corp. -- http://www.Microsoft.com License to use this software is granted under the terms outlined in the Microsoft Windows Device Driver Development Kit. §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ @doc INTERNAL TpiParam TpiParam_h @module TpiParam.h | This module, along with , implements a table driven parser for the NDIS registry parameters. This file defines the parameter parsing structures and values used by the routine . You should #include this file into the driver module defining the configuration parameter table . @comm See for details of how to add new parameters. This is a driver independent module which can be re-used, without change, by any NDIS3 driver. @head3 Contents | @index class,mfunc,func,msg,mdata,struct,enum | TpiParam_h @end §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ */ #ifndef _TPIPARAM_H #define _TPIPARAM_H #if !defined(NDIS_NT) && !defined(UNICODE_NULL) /* // These types were culled from the NT ndis.h file // We should be compiling with the NT DDK's ndis.h to get these, // but sometimes we need to compile with the 95 DDK ndis.h. */ #undef PUNICODE_STRING typedef USHORT WCHAR; typedef WCHAR *PWSTR; typedef STRING ANSI_STRING; typedef PSTRING PANSI_STRING; /* // Unicode strings are counted 16-bit character strings. If they are // NULL terminated, Length does not include trailing NULL. */ typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; #ifdef MIDL_PASS [size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer; #else // MIDL_PASS PWSTR Buffer; #endif // MIDL_PASS } UNICODE_STRING; typedef UNICODE_STRING *PUNICODE_STRING; #define UNICODE_NULL ((WCHAR)0) // winnt #endif // NDIS_NT /* @doc INTERNAL TpiParam TpiParam_h PARAM_ENTRY §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ @func | PARAM_ENTRY | This macro is used to define an entry in the registry parameter table, one entry per parameter. See for more details on the expected input values. @parm struct | Strct | The structure type associated with . @parm type | Field | The name of the field within the structure . @parm const char * | Name | The name of the registry parameter key. @parm BOOL | Required | True if parameter is required. @parm NDIS_PARAMETER_TYPE | Type | The kind of parameter value. @parm UCHAR | Flags | How to return a string parameter value (ANSI, UNICODE). @parm UINT | Default | The default value for an undefined integer parameter. @parm UINT | Min | The minimum value for an integer parameter. @parm UINT | Max | The minimum value for an integer parameter. @comm Parameters that need to be stored in different data structures, need to be declared in separate parameter tables, and then parsed separately using mulitple calls to . @iex PARAM_TABLE ParameterTable[] = { PARAM_ENTRY(MINIPORT_CONTEXT, DbgFlags, PARAM_DEBUGFLAGS_STRING, FALSE, NdisParameterHexInteger, 0, DBG_ERROR_ON|DBG_WARNING_ON, 0, 0xffffffff), // The last entry must be an empty string! { { 0 } } }; @normal */ #if defined(_IA64_) # define PARAM_OFFSET(Strct, Field) ((LONG)(LONG_PTR)&(((Strct *)0)->Field)) #else # define PARAM_OFFSET(Strct, Field) ((UINT)((PUCHAR) &((Strct *) 0)->Field)) #endif #define PARAM_SIZEOF(Strct, Field) sizeof(((Strct *) 0)->Field) #define PARAM_ENTRY(Strct, Field, Name, \ Required, Type, Flags, \ Default, Min, Max) \ { NDIS_STRING_CONST(Name), \ Required, \ Type, \ Flags, \ PARAM_SIZEOF(Strct, Field), \ PARAM_OFFSET(Strct, Field), \ (PVOID) (Default), \ Min, \ Max } /* @doc INTERNAL TpiParam TpiParam_h PARAM_TABLE §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ @struct PARAM_TABLE | This structure defines how a parameter is to be parsed from the Windows registry. The driver declares an array of these parameter records and passes it to during initialization. The values for each parameter are then read from the registry and can be used to configure the driver. : Multiple parameter tables can be used to parse parameters that must be stored in different memory locations. */ typedef struct PARAM_TABLE { NDIS_STRING RegVarName; // @field // Parameter name string declared as an . The registry // parameter key must match this string. UCHAR Mandantory; // @field // Set to FALSE, zero, if parameter value is optional; otherwise set to // TRUE, non-zero, if the parameter is required to exist in the registry. // If FALSE, and the parameter does not exist, the value will // be returned. If TRUE, and the parameter does not exist, an error code // is returned and no further parsing is done. UCHAR Type; // @field // This value determines how the parameter will be parsed from the // registry. The value can be one of the following values defined // by . // 0=NdisParameterInteger - Decimal integer value. // 1=NdisParameterHexInteger - Hexadecimal integer value. // 2=NdisParameterString - Single UNICODE string value. // 3=NdisParameterMultiString - Multiple UNICODE string values. // These are returned as a list of N strings, separated by NULL // terminators, the last string is followed by two NULL terminators. UCHAR Flags; // @field // This value determines how a string parameter will be translated before // it is returned to the caller. can be one of the following // values: // 0=PARAM_FLAGS_ANSISTRING - Return string value as an ANSI string. // 0=PARAM_FLAGS_ANSISTRING - Return string value as a UNICODE string. # define PARAM_FLAGS_ANSISTRING 0 # define PARAM_FLAGS_UNICODESTRING 1 UCHAR Size; // @field // This value determines how an integer parameter will be translated // before it is returned to the caller. can be one of the // following values: // 0=UINT - unsigned integer (16 or 32 bits). // 1=UCHAR - unsigned char integer (8 bits). // 2=USHORT - unsigned short integer (16 bits). // 4=ULONG - unsigned long integer (32 bits). // : The most-significant bits will be truncated in the conversion. UINT Offset; // @field // This value indicates the offset, in bytes, from the // pointer passed into . The return value for // the parameter will be saved at this offset from . // *(PUINT)((PUCHAR)BaseContext+Offset) = (UINT) Value; PVOID Default; // @field // This value is used as the default value for the parameter if it is // not found in the registry, and it is not mandatory. This only applys // to integer parameters. String parameters must provide support for // their own default values. UINT Min; // @field // If this value is non-zero, and the parameter is an integer type, the // registry value will be compared to make sure it is \>= . // If the registry value is less, the returned value will be set to // and no error is returned. UINT Max; // @field // If this value is non-zero, and the parameter is an integer type, the // registry value will be compared to make sure it is \<= . // If the registry value is greater, the returned value will be set to // and no error is returned. UINT Reserved; // @field // This field is not currently used, and it must be zero for future // compatability. } PARAM_TABLE, *PPARAM_TABLE; extern USHORT ustrlen( IN PUSHORT string ); extern NDIS_STATUS ParamParseRegistry( IN NDIS_HANDLE AdapterHandle, IN NDIS_HANDLE RegistryConfigHandle, IN PUCHAR BaseContext, IN PPARAM_TABLE Parameters ); extern VOID ParamUnicodeStringToAnsiString( OUT PANSI_STRING out, IN PUNICODE_STRING in ); extern VOID ParamUnicodeCopyString( OUT PUNICODE_STRING out, IN PUNICODE_STRING in ); #endif // _TPIPARAM_H