FltRegisterFilter 呼叫失敗的處理

2021-08-31 08:53:17 字數 1576 閱讀 1060

今天準備除錯昨天的乙個mini filter 的時候,突然系統藍屏了,感覺很奇怪,因為在以前是沒有問題,而且這幾天也沒有改過**,怎麼突然有問題了呢?於是啟動 winddbg 進行除錯。

一 除錯 

在driverentry 裡下了斷點,執行到 fltregisterfilter 時,返回值 status 給出了錯誤,是乙個負數,但是這個數值是十進位制的,顯示的格式是 on-1********* 。不知道這樣格式的資料代表什麼樣的錯誤。

在wdk 的文件中,我查了一下, fltregisterfilter 的返回值錯誤有如下的:

1.status_insufficient_resources 

記憶體分配失敗

2. status_invalid_parameter 

有兩種情況,乙個是傳入的第二個引數中的version 沒有設定成 flt_registration_version ,乙個是傳入的第二個引數中的命名提供者函式是乙個非法的非 null 值。

3. status_flt_not_initialized 

filter管理器還沒有初始化就呼叫註冊函式。需要確保 filter 管理器已經作為乙個驅動啟動了。

二 獲取返回值

由於在偵錯程式中返回值是比較奇怪的格式:on-1********* 。把後邊的數當作十進位制的數換算成 16 進製的,沒有找到這個錯誤。在 ntstatus.h 中我找到了 status_flt_not_initialized 的值,定義是:

#define status_flt_not_initialized       ((ntstatus)0xc01c0007l)

在wdk 文件中說過的其他值也找到了定義,但就是沒有辦法找到除錯中返回的這個 status 值。

既然在windbg 中是顯示成十進位制的,那麼聯絡到 visual studiao 可以讓變數按照 16 進製方式顯示,是不是也可以讓 windbg 顯示 16 進製格式的值?我查了一下 windbg 的文件,介紹了 n 可以用來設定。但是試了一下發現沒有效果,返回的 status 值還是那樣的格式,沒有變化。

這樣的辦法不行,又想了乙個辦法:看記憶體。把status 的記憶體顯示出來,那麼就能獲取返回值的 16 進製表示。於是在 windbg 的幫助檔案中查了一下 d 的用法,感覺 dyd 符合我的要求,顯示了一下 status ,出來乙個二進位制的顯示列表。粗看一下,沒有搞明白。接著用 dd ,終於露出了 status 的廬山真面目,是 c0000034 。

三 理解返回的錯誤值

在知道了錯誤返回值後,終於找到了它的定義:

#define status_object_name_not_found     ((ntstatus)0xc0000034l)

不過這個返回值如果表示物件的名字沒有發現,那麼還是很令人很困惑的,因為在這裡沒有涉及到什麼物件,不明白返回值裡說的物件是指哪個物件。立即上google 搜尋了一把,嘿嘿,出來了,有個人在郵件列表中問到了跟我現在一模一樣的問題,後邊有人回答他了,說是在

minifilter

裝載的時候,預設例項的名字設定不對,沒有找到 。

難道是我修改的filter 的安裝 inf 檔案中設定有誤,馬上檢視,確實是。改之,問題解決。

file get contents請求失敗處理

注釋掉除用於處理解密的filter 此filter無法注釋掉,因為客戶端正常請求必須要經過此filter處理,否則將出現無法訪問的閘道器內部異常錯誤 之外的所有自定義filter,目的是排除法查詢是否由於某乙個filter寫法存在問題所導致。結論 仍出現400,定位問題失敗!回顧問題描述,因為不是每...

LoadLibrary呼叫失敗原因

利用loadlibrary顯示裝載動態庫 hinstance hdll dll控制代碼 hdll loadlibrary user32.dll if hdll null 結果總是直接跳出if,dll載入失敗 排除了其它問題後,通過以下語句呼叫成功 hdll loadlibrary text user...

crontab呼叫sqoop失敗

背景 由於業務需求,資料需要每天從mysql hive同步,考慮到資源占用情況,暫定凌晨業務空閒時執行定時任務 2 通過kettle先查訊hive資料表中max id 值,查詢mysql中hive的max id 以後的值,從mysql插入到hive中 暫時pass掉,由於是一條一條寫入而不是批量,太...