共用方式為


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

已新增 SwitchIdVPortId,以及 NDIS 6.50 旗標 成員。

HeaderSize 成員設定為 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,則這個成員的值毫無意義。 如果 InformationBufferLength 對於查詢要求上的指定OID_ XXX 而言太小,則此成員會指出滿足要求所需的緩衝區大小。

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

基礎驅動程式從緩衝區讀取的位元元組數目,InformationBuffer 集合資訊要求。

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

緩衝區中可讀取資料的大小,以位元組為單位,InformationBufferOid 的值會決定適合此成員的值。

DATA.METHOD_INFORMATION.OutputBufferLength

位於 InformationBuffer 之緩衝區中的位元元組數目, 驅動程式可以寫入。

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

基礎驅動程式從緩衝區讀取的位元元組數目,InformationBuffer 集合資訊要求。

針對方法 OID,BytesRead 應該小於或等於 inputBufferLength 成員中的值。

DATA.METHOD_INFORMATION.BytesNeeded

傳回查詢資訊或執行指定OID_ XXX 程式代碼所要求的設定作業所需的位元元組數目。

如果 NdisOidRequest 傳回NDIS_STATUS_SUCCESS,則這個成員的值毫無意義。 如果查詢上的指定OID_ XXXInformationBufferLength 太小,則此成員會指出需要多大的緩衝區才能滿足要求。 如果位於 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 要求相關聯,則發出狀態指示的驅動程式必須設定 DestinationHandle,並在 NDIS_STATUS_INDICATION 結構中 RequestId 成員。

在此情況下,驅動程式會將 DestinationHandleRequestId NDIS_OID_REQUEST 成員分別設定為來自 RequestHandleRequestId 成員的值。

例如,在無線網路中,OID 要求的處理可能需要很長的時間才能完成。 在此情況下,迷你埠驅動程式可以立即完成 OID 要求,並在稍後提供狀態指示,以提供 OID 要求的最終結果。

NdisRequestGenericn(1-4) 類型可供建立自己的內部要求的迷你埠驅動程式使用。 若要實作這類要求,迷你埠驅動程式會將內部變數指派給下列其中一個泛型類型。

要求

要求 價值
最低支援的用戶端 NDIS 6.0 和更新版本支援。
標頭 ndis/oidrequest.h (include ndis.h)

另請參閱

NDIS_OBJECT_HEADER

NDIS_REQUEST_TYPE

NDIS_STATUS_INDICATION

NdisOidRequest

OID_GEN_SUPPORTED_GUIDS