MB 操作語意
非同步交易
MB 驅動程式模型會使用 NDIS 6.x 中提供的非同步通知機制,假設 MB 服務與迷你埠驅動程式之間的非封鎖操作語意。 此機制可讓 MB 服務繼續將 OID 要求傳送至迷你埠驅動程式進行處理,而不需要等待目前的作業完成。
非同步交易是從初始要求開始的三向交握,後面接著要求狀態回應,然後完成最後的交易指示。 要求狀態回應是暫時的,因為它只會確認迷你埠驅動程式已收到要求。 後續非同步指示是交易,表示交易完成。 迷你埠驅動程式會傳回狀態碼以及交易指示中產生的資料。
非同步 設定 和 查詢 要求
MB 服務所使用的許多 集合 和 查詢 OID 要求都會以非同步方式處理。 如需 設定 和 查詢 OID 要求的詳細資訊,請參閱 NDIS_OID_REQUEST。 MB 資料模型主題中的 「WWAN 特定 OID」 資料表可識別非同步處理哪些 OID。
下圖代表 MB 服務與迷你埠驅動程式之間非同步 查詢 交易的互動順序。 粗體中的標籤代表 OID 識別碼或交易流程式控制件,而一般文字中的標籤則代表 OID 結構內的重要旗標。
查詢和設定要求的三向交握相同。
除了 OID_WWAN_DRIVER_CAPS之外,所有其他 MB 特定 OID 要求都會遵循非同步交易機制,以取得迷你埠驅動程式與 MB 服務之間資訊交換的資訊,並附注下列其他注意事項:
迷你埠驅動程式應該在任何錯誤狀況下立即失敗 OID 要求,例如不正確 OID 要求。
迷你埠驅動程式必須傳回任何 WWAN 特定的錯誤狀況 WWAN_STATUS_XXX) ,例如,在事件通知結構的 uStatus 成員中指定的錯誤碼 (。 迷你埠驅動程式也應該視需要適當地填入 遵循 uStatus 成員的成員。 例如,如果可用,迷你埠驅動程式應該填入NDIS_WWAN_CONTEXT_STATE結構的CoNtextState.uNwError成員。 不過,在處理與 PIN 相關的 OID 時發生失敗的情況,迷你埠驅動程式不一定會有目前的 PIN 狀態資訊,可在NDIS_WWAN_PIN_INFO的PinInfo.PinState成員中指定。
迷你埠驅動程式應該傳回NDIS_STATUS_INDICATION_REQUIRED作為所有非同步 OID 要求的暫時回應。
迷你埠驅動程式應該能夠區分 OID 要求與其他原因所造成的裝置狀態變更。 迷你埠驅動程式應該針對 OID 要求所產生的狀態變更傳送交易式通知,而且應該針對其他原因的狀態變更傳送未經要求的事件通知。
迷你埠驅動程式負責管理核心模式記憶體,雖然 MB 服務一開始會為要求配置記憶體。 MB 服務收到來自迷你埠驅動程式的回應之後,服務可能會釋放它為 OID 要求所配置的使用者模式記憶體。
下圖代表 MB 服務與迷你埠驅動程式之間非同步 設定 交易的互動順序。 粗體中的標籤代表 OID 識別碼或交易流程式控制件,而一般文字中的標籤則代表 OID 結構內的重要旗標。
非同步回應
Windows Vista) 發行的 NDIS 6.0 規格 (引進了新的狀態碼,NDIS_STATUS_INDICATION_REQUIRED,迷你埠驅動程式會將交易的非同步本質傳達至迷你埠驅動程式對 OID 要求的暫時回應中的 MB 服務。
如 MB 介面概觀中所述,MB 服務無法直接存取 MB 迷你埠驅動程式所配置的核心模式記憶體。 儲存在核心模式記憶體中的執行結果假設會由某些媒介複製並提供給 MB 服務,例如 WMI 或 NDIS 篩選驅動程式。 因此,迷你埠驅動程式可以在交易指示中傳回 的 NdisMIndicateStatusEx 函式呼叫之後釋放配置的核心模式記憶體。
迷你埠驅動程式和 MB 服務必須遵循的交握程式,如下列程式所述。
MB 迷你埠驅動程式程式
收到 OID 要求時,迷你埠驅動程式應該執行下列步驟:
在核心模式中配置記憶體,以複製與 OID 要求相關聯的 NDIS_OID_REQUEST 資料結構內容。
在要求的參數中,確定也會複製 OID 要求結構的 RequestId 和 RequestHandle 成員。 這些成員稍後會在交易 指示中使用。
傳回暫時NDIS_STATUS_INDICATION_REQUIRED狀態回應,通知 MB 服務迷你埠驅動程式會以非同步方式完成要求。
作業完成後,請視需要將結果儲存在本機或驅動程式配置的記憶體中。
呼叫 NdisMIndicateStatusEx 函式,以通知 MB 服務尚未完成的作業。 迷你埠驅動程式應該填入NDIS_STATUS_INDICATION結構的成員,如下所示:
- 將 StatusCode 成員設定為狀態通知的類型。 例如,NDIS_STATUS_WWAN_XXX。
- 將 DestinationHandle 成員設定為當迷你埠驅動程式收到對應 OID 要求時,在NDIS_OID_REQUEST資料結構中收到的 RequestHandle 成員。
- 當迷你埠驅動程式收到對應的 OID 要求時,請將 RequestId 成員設定為符合NDIS_OID_REQUEST狀態結構的 RequestId 成員。
- 設定 StatusBuffer 和 StatusBufferSize 成員,以分別指向迷你埠驅動程式配置的記憶體和記憶體緩衝區的大小。 此記憶體緩衝區包含已完成作業的結果。
- 如果作業成功完成,請將 uStatus 成員設定為 WWAN_STATUS_SUCCESS。 否則,請將 uStatus 成員設定為適當的WWAN_STATUS_XXX值,以指出失敗的類型。
當函式呼叫傳回時,迷你埠驅動程式應該釋放配置給 OID 要求的記憶體。
MB 服務程式
MB 服務會使用下列程式來處理非同步交易:
根據 OID 資料結構為要求配置緩衝區記憶體。 以適當的值填入資料結構成員。
使用指向 OID 要求的 OID 資料結構,並等候迷你埠驅動程式回應的 InformationBuffer成員呼叫NdisOidRequest函式。
收到迷你埠驅動程式的NDIS_STATUS_INDICATION_REQUIRED暫時回應時,MB 服務會儲存 RequestId、釋放配置的記憶體,並將交易標示為開啟。 此時,MB 服務可以免費處理後續的 OID 要求和通知。
收到NDIS_STATUS_WWAN_XXX為 StatusCode 值的通知時,請檢查 RequestId 是否符合標示為開啟之任何交易的通知。 如果有相符專案,服務會關閉交易。 如果找不到相符專案,請將通知視為未經請求的事件通知。
處理 StatusBuffer 成員中傳回的資料,並適當地對 MB 服務進行狀態變更。
跡象
迷你埠驅動程式可以產生兩種類型的 WWAN 特定 指示 :
MB 裝置中物件狀態變更所產生的事件通知。
發出非同步作業完成訊號的交易式通知。
在這兩種情況下,迷你埠驅動程式都應該呼叫 NdisMIndicateStatusEx 函式。
事件通知
事件通知在迷你埠驅動程式主動將指示傳送給 MB 服務做為狀態變更事件時,不要求。 狀態變更是由 MB 服務以外的某些實體的動作所造成。 MB 服務假設迷你埠驅動程式能夠偵測變更的原因。
對於任何 WWAN 特定事件通知,迷你埠驅動程式必須將 NDIS_STATUS_INDICATION 結構的 RequestId 成員設定為零。 StatusCode成員會指定 MB 裝置中的哪些物件已變更。 迷你埠驅動程式可以將此物件設定為下列任何值:
NDIS_STATUS_WWAN_HOME_PROVIDER
NDIS_STATUS_WWAN_PREFERRED_PROVIDERS
NDIS_STATUS_WWAN_VISIBLE_PROVIDERS
NDIS_STATUS_WWAN_REGISTER_STATE
NDIS_STATUS_WWAN_PACKET_SERVICE
NDIS_STATUS_WWAN_CONTEXT_STATE
NDIS_STATUS_WWAN_PROVISIONED_CONTEXTS
NDIS_STATUS_WWAN_SERVICE_ACTI加值稅ION
NDIS_STATUS_WWAN_SMS_CONFIGURATION
NDIS_STATUS_WWAN_VENDOR_SPECIFIC
MB 服務也可以處理來自 NDIS 的其他事件通知。 這些非 MB 事件通知不一定受限於其 RequestId 值設定為零的需求。
交易式通知
迷你埠驅動程式會使用交易通知來通知 MB 服務非同步交易已完成,而 MB 服務會使用交易通知來關閉開啟的交易,並更新其狀態機器。
MB 服務需要交易式通知,以便關閉開啟的交易。 這是 MB 服務與非同步交易中迷你埠驅動程式之間三向交握的最終交換。 任何交易式通知中NDIS_STATUS_INDICATION 的 RequestId 成員值必須是非零值,這會從相同交易中的對應要求複製。
您必須正確設定 NDIS_STATUS_INDICATION 結構的 RequestId 成員,非同步機制才能正常運作。 MB 服務可確保 RequestId 值在所有未處理的要求之間都是唯一且非零的。 迷你埠驅動程式必須在對應的指示中傳回相同的RequestId值,MB 服務才能使指示與開啟的交易相互關聯。
狀態指示結構
給定 OID 要求的非同步回應和未要求的事件通知結構都會共用下列由StatusIndication參數StatusBuffer成員指向NdisMIndicateStatusEx的結構成員:
typedef struct _NDIS_WWAN_XXX {
NDIS_OBJECT_HEADER Header;
WWAN_STATUS uStatus;
ULONG uNwError;//Optional. Only used for network operations.
WWAN_XXX XxxStruct;
} NDIS_WWAN_XXX, *PNDIS_WWAN_XXX;
NDIS_STATUS_INDICATION 結構 之 RequestId 成員中的零值表示它是未經要求的事件通知,而且可以隨時發生。
如果傳回任何集合或查詢OID 要求的指示中的 uStatus成員不等於WWAN_STATUS_SUCCESS相關聯NDIS_WWAN_XXX結構的成員就不需要有效。
如果是以網路事件為基礎的未請求事件通知,迷你埠驅動程式必須視需要填入 uNwError 成員,如果適用的話。
下表顯示以 GSM 為基礎的網路 3GPP TS 24.008 規格 中定義的註冊、封包連結和封包中斷連結造成程式碼失敗值:
3GPP 24.008 原因代碼 | 原因碼的解譯 |
---|---|
2 - HLR 中的國際行動訂閱者身分識別 (IMSI) 未知 |
SIM 卡或裝置未啟動,或訂用帳戶已過期,導致網路停用。 |
4 - VLR 中的 IMSI 未知 |
漫遊功能未訂閱。 |
6 - 我不合法 |
因為遭竊報告而遭到網路封鎖的 MS。 |
7 - 不允許 GPRS 服務 |
使用者沒有 GPRS 訂用帳戶。 使用者只有語音連線訂用帳戶。 |
8 - 不允許 GPRS 和非 GPRS 服務 |
不允許 GPRS 和非 GPRS 服務。 |
11 - 不允許 PLMN |
由於訂用帳戶已過期或其他原因,網路會封鎖服務。 |
12 - 不允許位置區域 |
使用者訂用帳戶不允許在目前的位置區域中存取。 |
13 - 此位置區域中不允許漫遊 |
訂用帳戶允許漫遊,但目前位置區域中不允許漫遊。 |
14 - 此 PLMN 中不允許 GPRS 服務 |
選取的網路提供者不會將 GPRS 服務提供給 MS。 |
15 - 位置區域中沒有適合的儲存格 |
服務沒有訂用帳戶。 |
17 - 網路失敗 |
註冊失敗。 |
22 - 壅塞 |
註冊失敗,因為網路壅塞。 |
例如,如果網路起始停用內容事件,因為位置區域中不允許漫遊,迷你埠驅動程式應該根據 3GPP TS 24.008 針對 GSM 型網路將 uNwError 成員設定為 13。
類似的邏輯也應該套用至 CDMA 型網路。 不過,CDMA 型網路錯誤碼沒有標準。 CDMA 型裝置應該使用網路特定或裝置特定的錯誤碼。
在迷你埠驅動程式對 OID 要求的非同步回應的情況下,NDIS_STATUS_INDICATION 結構的 RequestId 成員是一個非零的數位,在 集合 或 查詢 要求中傳遞至迷你埠驅動程式。 迷你埠驅動程式必須視需要填入 uStatus 成員。 例如,WWAN_STATUS_SUCCESS或下一節所列的任何適當錯誤值。 此外,迷你埠驅動程式必須在適當且可用的情況下填入 uNwError 成員。
事件通知狀態
下表列出 MB 迷你埠驅動程式可以在NDIS_WWAN_XXX事件通知結構的 uStatus 成員中指定WWAN_STATUS代碼。
值 | 意義 |
---|---|
WWAN_STATUS_SUCCESS |
作業成功。 |
WWAN_STATUS_FAILURE |
作業 (泛型失敗) 失敗。 |
WWAN_STATUS_BUSY |
作業失敗,因為裝置忙碌中。 |
WWAN_STATUS_SIM_NOT_INSERTED |
作業失敗,因為 SIM 卡未完全插入裝置中。 |
WWAN_STATUS_BAD_SIM |
作業失敗,因為 SIM 卡不正確,無法再使用。 |
WWAN_STATUS_PIN_REQUIRED |
作業失敗,因為必須輸入 PIN 才能繼續。 |
WWAN_STATUS_PIN_DISABLED |
作業失敗,因為 PIN 已停用。 |
WWAN_STATUS_NOT_REGISTERED |
作業失敗,因為裝置未向任何網路註冊。 |
WWAN_STATUS_PROVIDERS_NOT_FOUND |
作業失敗,因為找不到任何網路提供者。 |
WWAN_STATUS_NO_DEVICE_SUPPORT |
作業失敗,因為裝置不支援作業。 |
WWAN_STATUS_PROVIDER_NOT_VISIBLE |
作業失敗,因為服務提供者目前看不到。 |
WWAN_STATUS_DATA_CLASS_NOT_AVAILABLE |
作業失敗,因為要求的資料類別無法使用。 |
WWAN_STATUS_PACKET_SVC_DETACHED |
作業失敗,因為封包服務已中斷連結。 |
WWAN_STATUS_MAX_ACTI加值稅ED_CONTEXTS |
作業失敗,因為已達到啟動的內容數目上限。 |
WWAN_STATUS_NOT_INITIALIZED |
作業失敗,因為裝置正在初始化。 在裝置的就緒狀態變更為 WwanReadyStateInitialized之後重試作業。 |
WWAN_STATUS_VOICE_CALL_IN_PROGRESS |
作業失敗,因為語音通話正在進行中。 |
WWAN_STATUS_CONTEXT_NOT_ACTI加值稅ED |
作業失敗,因為內容未啟動。 |
WWAN_STATUS_SERVICE_NOT_ACTI加值稅ED |
作業失敗,因為服務未啟動。 |
WWAN_STATUS_INVALID_ACCESS_STRING |
作業失敗,因為存取字串無效。 |
WWAN_STATUS_INVALID_USER_NAME_PWD |
作業失敗,因為提供的使用者名稱和/或密碼無效。 |
WWAN_STATUS_RADIO_POWER_OFF |
作業失敗,因為無線電目前已關閉電源。 |
WWAN_STATUS_INVALID_PARAMETERS |
作業失敗,因為參數無效。 |
WWAN_STATUS_READ_FAILURE |
作業因為讀取失敗而失敗。 |
WWAN_STATUS_WRITE_FAILURE |
作業失敗,因為寫入失敗。 |
下表顯示 SMS 特定狀態值。
值 | 意義 |
---|---|
WWAN_STATUS_SMS_OPERATION_NOT_ALLOWED |
SMS 作業失敗,因為不允許此作業。 |
WWAN_STATUS_SMS_MEMORY_FAILURE |
SMS 作業因為記憶體失敗而失敗。 |
WWAN_STATUS_SMS_INVALID_MEMORY_INDEX |
SMS 作業因為記憶體索引無效而失敗-- OID_WWAN_SMS_READ的 WwanSmsFlagIndex 。 |
WWAN_STATUS_SMS_UNKNOWN_SMSC_ADDRESS |
SMS 作業失敗,因為服務中心號碼無效或未知。 |
WWAN_STATUS_SMS_NETWORK_TIMEOUT |
SMS 作業因為網路逾時而失敗。 |
WWAN_STATUS_SMS_MEMORY_FULL |
SMS 作業失敗,因為 SMS 訊息存放區已滿。 |
WWAN_STATUS_SMS_UNKNOWN_ERROR |
SMS 作業失敗,因為發生未知錯誤, (泛型錯誤) 。 |
WWAN_STATUS_SMS_FILTER_NOT_SUPPORTED |
SMS 作業失敗,因為不支援所要求的篩選類型。 |
WWAN_STATUS_SMS_MORE_DATA |
此交易尚未完成。 某些資料已傳回,而且會傳回更多資料。 |
WWAN_STATUS_SMS_LANG_NOT_SUPPORTED |
SMS 作業失敗,因為不支援 SMS 語言。 這僅適用于 CDMA 型裝置。 |
WWAN_STATUS_SMS_ENCODING_NOT_SUPPORTED |
SMS 作業失敗,因為不支援 SMS 編碼。 這僅適用于 CDMA 型裝置。 |
WWAN_STATUS_SMS_FORMAT_NOT_SUPPORTED |
SMS 作業失敗,因為不支援 SMS 格式。 |
注意 這些 WWAN 特定狀態碼僅用於NDIS_WWAN_XXX結構的 uStatus 成員中的非同步交易。
迷你埠驅動程式會使用事件通知來通知 MB 服務有關其 MB 裝置中的物件狀態變更,而不需要先收到 OID 要求。 MB 服務只會使用事件通知來更新其狀態機器。
請注意,雖然 NDIS 會序列化傳送至迷你埠驅動程式的所有要求,但迷你埠驅動程式可能不會以相同順序傳迴響應。 這是因為迷你埠驅動程式中的佇列要求可能會平行處理。 因此,MB 服務可確保如果兩個要求彼此相依,則除非迷你埠驅動程式完成第一個要求,否則不會傳送第二個要求。
狀態變更通知
一般而言,迷你埠驅動程式應該一律透過交易通知或未經請求的事件通知,通知 MB 服務其 MB 裝置的更新狀態。 下列案例是一些例外狀況,其中迷你埠驅動程式不應該回應更新的狀態資訊。 MB 服務可以從其他作業的完成狀態判斷更新狀態:
迷你埠驅動程式不需要在 PIN 狀態變更時傳送NDIS_STATUS_WWAN_PIN_LIST事件指示,因為 MB 服務要求啟用或停用 PIN。
迷你埠驅動程式不需要傳回交易式回應中已布建內容的更新清單,以OID_WWAN_PROVISIONED_CONTEXT 集 作業。
迷你埠驅動程式不需要回應交易式回應中慣用提供者的更新清單,以OID_WWAN_PREFERRED_PROVIDERS 集 作業。 MB 服務可以根據 設定 作業的初始清單和成功狀態來判斷這項資訊。
迷你埠驅動程式不需要回應OID_WWAN_SMS_CONFIGURATION 集 作業的目前WWAN_SMS_CONFIGURATION值。