NDIS_OID_REQUEST 结构 (ndis/oidrequest.h)

为了查询或设置 OID 信息,NDIS 提交NDIS_OID_REQUEST结构来筛选驱动程序和微型端口驱动程序。

语法

typedef struct _NDIS_OID_REQUEST {
  NDIS_OBJECT_HEADER       Header;
  NDIS_REQUEST_TYPE        RequestType;
  NDIS_PORT_NUMBER         PortNumber;
  UINT                     Timeout;
  PVOID                    RequestId;
  NDIS_HANDLE              RequestHandle;
  union {
    NDIS_OID Oid;
    struct {
      NDIS_OID Oid;
      PVOID    InformationBuffer;
      UINT     InformationBufferLength;
      UINT     BytesWritten;
      UINT     BytesNeeded;
    } QUERY_INFORMATION;
    struct {
      NDIS_OID Oid;
      PVOID    InformationBuffer;
      UINT     InformationBufferLength;
      UINT     BytesRead;
      UINT     BytesNeeded;
    } SET_INFORMATION;
    struct {
      NDIS_OID Oid;
      PVOID    InformationBuffer;
      ULONG    InputBufferLength;
      ULONG    OutputBufferLength;
      ULONG    MethodId;
      UINT     BytesWritten;
      UINT     BytesRead;
      UINT     BytesNeeded;
    } METHOD_INFORMATION;
  } DATA;
  _REQUEST_DATA            _REQUEST_DATA;
  UCHAR                    *NdisReserved[NDIS_OID_REQUEST_NDIS_RESERVED_SIZE  sizeof(PVOID)];
  UCHAR                    *MiniportReserved[2  sizeof(PVOID)];
  UCHAR                    *SourceReserved[2  sizeof(PVOID)];
  UCHAR                    SupportedRevision;
  UCHAR                    Reserved1;
  USHORT                   Reserved2;
  NDIS_NIC_SWITCH_ID       SwitchId;
  NDIS_NIC_SWITCH_VPORT_ID VPortId;
  ULONG                    Flags;
} NDIS_OID_REQUEST, *PNDIS_OID_REQUEST;

成员

Header

NDIS_OID_REQUEST结构的NDIS_OBJECT_HEADER结构。 将 Type 成员设置为 NDIS_OBJECT_TYPE_OID_REQUEST。 若要指示NDIS_OID_REQUEST结构的版本,请将 Revision 成员设置为以下值之一:

NDIS_OID_REQUEST_REVISION_2

NDIS 6.50 添加了 SwitchId、VPortIdFlags 成员。

“标头大小” 成员设置为“NDIS_SIZEOF_OID_REQUEST_REVISION_2”。

NDIS_OID_REQUEST_REVISION_1

NDIS 6.0 的原始版本。

“标头大小” 成员设置为“NDIS_SIZEOF_OID_REQUEST_REVISION_1”。

RequestType

请求类型为 NDIS_REQUEST_TYPE 枚举值之一。

PortNumber

请求发送到的端口。 如果端口未知或默认,则此成员为零。

Timeout

请求的超时(以秒为单位)。 如果超时在驱动程序完成请求之前过期,NDIS 可以重置驱动程序或取消请求。

RequestId

请求的标识符。 如果微型端口驱动程序必须立即完成请求并完成状态为NDIS_STATUS_INDICATION_REQUIRED的请求,微型端口驱动程序将使用此 RequestId 值来设置关联的NDIS_STATUS_INDICATION结构的 RequestId 成员。

NDIS 或过分的驱动程序也可以使用 RequestId 来取消请求。 当微型端口驱动程序收到取消请求时,微型端口驱动程序会取消任何具有匹配 RequestId 的挂起请求。 如果 RequestId 为零,微型端口驱动程序可以忽略此成员。 有关状态指示的详细信息,请参阅以下“备注”部分。

RequestHandle

标识发出 OID 请求的源的句柄。 如果微型端口驱动程序必须立即完成请求并完成状态为NDIS_STATUS_INDICATION_REQUIRED的请求,微型端口驱动程序将使用此 RequestHandle 值来设置关联的NDIS_STATUS_INDICATION结构的 DestinationHandle 成员。 在这种情况下,NDIS 将仅将后续状态指示发送到发出 OID 请求的源。

有关状态指示的详细信息,请参阅以下“备注”部分。

DATA

定义请求数据的联合。 数据中的信息因 RequestType 成员指定的请求类型而异。 指定了以下成员结构:

DATA.Oid

DATA.QUERY_INFORMATION

此结构包含 NdisRequestQueryInformationNdisRequestQueryStatistics 请求类型的参数。 此结构指定如下:


struct _QUERY
  {
    NDIS_OID    Oid;
    PVOID       InformationBuffer;
    UINT        InformationBufferLength;
    UINT        BytesWritten;
    UINT        BytesNeeded;
  } QUERY_INFORMATION;

DATA.QUERY_INFORMATION.Oid

所请求操作的对象标识符。 该值是OID_ XXX 代码。

DATA.QUERY_INFORMATION.InformationBuffer

指向缓冲区的指针,基础驱动程序或 NDIS 在其中返回查询信息请求的请求信息。

DATA.QUERY_INFORMATION.InformationBufferLength

InformationBuffer 中缓冲区的大小(以字节为单位)。 Oid 处的值确定适合此成员的值。

DATA.QUERY_INFORMATION.BytesWritten

基础驱动程序或 NDIS 在 InformationBuffer 的缓冲区中传输的用于查询信息请求的字节数。 如果 NdisOidRequest 函数返回NDIS_STATUS_INVALID_LENGTH,则此成员的值毫无意义。

DATA.QUERY_INFORMATION.BytesNeeded

返回给定OID_ XXX 代码请求的查询信息所需的字节数。

如果 NdisOidRequest 返回NDIS_STATUS_SUCCESS,则此成员的值毫无意义。 如果对于查询请求上的给定OID_ XXX 而言,InformationBufferLength 太小,则此成员指示满足请求所需的缓冲区大小。

DATA.SET_INFORMATION

此结构包含 NdisRequestSetInformation 请求类型的参数。 此结构指定如下:


struct _SET
  {
    NDIS_OID    Oid;
    PVOID       InformationBuffer;
    UINT        InformationBufferLength;
    UINT        BytesRead;
    UINT        BytesNeeded;
  } SET_INFORMATION;

DATA.SET_INFORMATION.Oid

所请求操作的对象标识符。 该值是OID_ XXX 代码。

DATA.SET_INFORMATION.InformationBuffer

指向缓冲区的指针,基础驱动程序从该缓冲区读取调用方为集信息请求提供的信息。

DATA.SET_INFORMATION.InformationBufferLength

InformationBuffer 中缓冲区的大小(以字节为单位)。 Oid 处的值确定适合此成员的值。

DATA.SET_INFORMATION.BytesRead

基础驱动程序从 信息 缓冲区中读取集信息请求的字节数。

DATA.SET_INFORMATION.BytesNeeded

执行给定OID_ XXX 代码请求的集操作所需的字节数。

如果 NdisOidRequest 返回NDIS_STATUS_SUCCESS,则此成员的值毫无意义。 如果 InformationBuffer 中的 缓冲区在设置请求中不包含给定OID_ XXX 的足够数据,则此成员指示所需的数据量。

DATA.METHOD_INFORMATION

此结构包含 NdisRequestMethod 请求类型的参数。 此结构指定如下:


struct _METHOD
  {
    NDIS_OID            Oid;
    PVOID               InformationBuffer;
    ULONG               InputBufferLength;
    ULONG               OutputBufferLength;
    ULONG               MethodId;
    UINT                BytesWritten;
    UINT                BytesRead;
    UINT                BytesNeeded;
  } METHOD_INFORMATION;

DATA.METHOD_INFORMATION.Oid

所请求操作的对象标识符。 该值是OID_ XXX 代码。

DATA.METHOD_INFORMATION.InformationBuffer

指向缓冲区的指针,基础驱动程序或 NDIS 在其中返回查询操作的请求信息,或基础驱动程序从中读取调用方为设置操作提供的信息。 这些操作特定于正在执行的 NdisRequestMethod 请求类型。

注意 此缓冲区用于 set-information 和 query-information 请求。 因此,设置信息请求的缓冲区中的数据将被为查询信息请求返回的数据覆盖。 确切的用法取决于 Oid 成员指定的请求操作。
 

DATA.METHOD_INFORMATION.InputBufferLength

信息缓冲区中可读数据的大小(以字节为单位)。 Oid 处的值确定适合此成员的值。

DATA.METHOD_INFORMATION.OutputBufferLength

信息缓冲区中驱动程序可以写入的字节数。

DATA.METHOD_INFORMATION.MethodId

要为方法 OID 运行的方法。 方法 OID 请求可以支持 MethodId 定义的多个操作。 它可以是大于或等于零的任何值。 零表示默认方法。 NDIS 可以使用一些预定义的方法定义公共方法 OID。 微型端口驱动程序可以定义自定义方法 OID。 有关自定义 OID 的详细信息,请参阅 OID_GEN_SUPPORTED_GUIDS

DATA.METHOD_INFORMATION.BytesWritten

基础驱动程序或 NDIS 在 InformationBuffer 的缓冲区中传输的用于查询信息请求的字节数。 如果 NdisOidRequest 函数返回NDIS_STATUS_INVALID_LENGTH,则此成员的值毫无意义。

对于方法 OID,BytesWritten 应小于或等于 OutputBufferLength 成员中的值。

DATA.METHOD_INFORMATION.BytesRead

基础驱动程序从 信息 缓冲区中读取集信息请求的字节数。

对于方法 OID,BytesRead 应小于或等于 InputBufferLength 成员中的值。

DATA.METHOD_INFORMATION.BytesNeeded

返回查询信息或执行给定OID_ XXX 代码请求的设置操作所需的字节数。

如果 NdisOidRequest 返回NDIS_STATUS_SUCCESS,则此成员的值毫无意义。 如果对于查询的给定OID_ XXX 而言,InformationBufferLength 太小,则此成员指示满足请求所需的缓冲区大小。 如果 InformationBuffer 中的缓冲区不包含集上给定OID_ XXX 的足够数据,则此成员指示所需的数据量。

_REQUEST_DATA

NdisReserved[NDIS_OID_REQUEST_NDIS_RESERVED_SIZE * sizeof(PVOID)]

为 NDIS 保留的区域。

MiniportReserved[2 * sizeof(PVOID)]

为微型端口驱动程序保留的区域。

SourceReserved[2 * sizeof(PVOID)]

为原始驱动程序保留的区域。 保留给NDIS_OID_REQUEST结构的分配器。 这通常是 NDIS 协议驱动程序或 NDIS 筛选器驱动程序。

SupportedRevision

NDIS 6.0 或更高版本驱动程序在处理 OID 请求时支持的 NDIS 结构的修订。 已修订结构是任何包含 NDIS_OBJECT_HEADER 结构的 NDIS 6.0 结构。 当驱动程序成功设置 OID 时,它必须将 SupportedRevision 设置为它所支持的结构的修订号。 有关 NDIS 版本信息的详细信息,请参阅 指定 NDIS 版本信息

Reserved1

留待将来使用。

Reserved2

留待将来使用。

SwitchId

一个NDIS_NIC_SWITCH_ID值,该值标识运行 VPortId 指定的目标 VPort 的交换机。

注意

NDIS 6.50 及更高版本中支持此字段。

VPortId

一个NDIS_NIC_SWITCH_VPORT_ID值,该值标识此 OID 请求面向的 VPort。 仅当设置了 NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID 标志时,此字段才被视为有效。

注意

NDIS 6.50 及更高版本中支持此字段。

Flags

一个 ULONG 值,该值包含此 OID 请求的按位 OR 标志。 目前支持以下标志:

标志 说明
NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID 0x0001 设置此标志后, VportId 成员被视为有效,并标识 OID 的目标 VPort。 如果未设置此标志,则 OID 适用于微型端口适配器本身。

注意

NDIS 6.50 及更高版本中支持此字段。

注解

协议驱动程序或筛选器驱动程序应为 InformationBuffer 上的缓冲区和NDIS_OID_REQUEST结构分配非分页内存。 使用从分页内存中分配的数据可能会导致严重页错误,因为基础驱动程序在 IRQL = DISPATCH_LEVEL 运行以执行请求的操作。

NDIS_OID_REQUEST包含协议驱动程序可以请求基础驱动程序的每种操作类型的 DATA 子结构。 在调用 NdisOidRequest 之前,协议驱动程序会填充子结构的相关成员,该成员表示它在 Oid 成员中指定的查询或设置操作。 在将控制权返回到调用方之前,NDIS 或基础驱动程序将填充其余成员。

某些 OID 请求允许微型端口驱动程序提供带有状态指示的 OID 完成状态。 在这种情况下,微型端口驱动程序返回 OID 请求完成状态NDIS_STATUS_INDICATION_REQUIRED。 微型端口驱动程序无法返回此状态,除非特定的 OID 允许。 若要确定是否允许此状态,请参阅 OID 参考页。

如果状态指示与微型端口驱动程序返回NDIS_STATUS_INDICATION_REQUIRED的 OID 请求相关联,则状态指示的驱动程序必须在NDIS_STATUS_INDICATION结构中设置 DestinationHandleRequestId 成员。

在这种情况下,驱动程序将 DestinationHandleRequestId 成员分别设置为 NDIS_OID_REQUEST 结构中 RequestHandle 成员和 RequestId 成员的值。

例如,在无线网络中,OID 请求的处理可能需要很长时间才能完成。 在这种情况下,微型端口驱动程序可以立即完成 OID 请求,并在以后提供状态指示,以提供 OID 请求的最终结果。

NdisRequestGenericn (1-4) 类型可用于创建自己的内部请求的微型端口驱动程序。 若要实现此类请求,微型端口驱动程序会将内部变量分配给这些泛型类型之一。

要求

要求
最低受支持的客户端 在 NDIS 6.0 及更高版本中受支持。
标头 ndis/oidrequest.h (包括 ndis.h)

另请参阅

NDIS_OBJECT_HEADER

NDIS_REQUEST_TYPE

NDIS_STATUS_INDICATION

NdisOidRequest

OID_GEN_SUPPORTED_GUIDS