WinIO初始化失敗的幾個原因

來源:互聯網
上載者:User
WinIO是一個能夠開啟一些作業系統IO特權操作的一個庫,簡單的來說它載入了一些驅動。通過載入的驅動可以直接的訪問連接埠。在工控上,我們可以利用這個庫直接操作IO卡的地址。例如我最近在做的一個數控鑽銑床的IO卡和運動控制卡就是很老的一個卡,在WIN98下面工作很正常,但是在NT核心上就會出現非法指令調用的問題。這些非法指令來自於底層對IO卡和運動控制卡的直接地址訪問。在98時代,這些操作都沒有受到保護的,在NT核心下就會出現保護問題。經實驗,經過WinIO初始化載入驅動以後再進行IO卡直接存取,很成功。
但應用的時候,就出現了一些莫名其妙的問題。應用WinIO只需要調用兩個函數InitializeWinIo(),和最後的ShutdownWinIo()即可。InitializeWinIo()將會返回一個bool值指示初始化結果。就是這個函數造成了許多困擾。
第一次困擾是在一次調試中,經常初始化失敗,一旦成功以後就總是成功的。剛開始以為是InitializeWinIo()以後沒有ShutdownWinIoI()造成的,後來看了WinIO的C Example證明唯寫InitializeWinIo()一樣能夠進程一旦結束,由InitializeWinIo初始化的資源自然就結束了。所以不存在上次運行影響這次啟動並執行事情。後來突然發現,WinIO相關的dll,vxd,sys竟然是綠色的。綠色在WindowsXP系統裡面代表了檔案是被EFS加密的。我為了工程的保密,把所有的工程目錄都進行了EFS加密。EFS加密會影響磁碟效能,原因就在於其加解密過程。但是這裡很奇怪,可能是間歇性的EFS解密速度沒有跟上WinIO中載入驅動的速度,造成讀取的sys和vxd裝置驅動是混亂的,最終導致載入失敗。將EFS加密取消,問題解決。
第二次困找在我用C#寫了一個dllimport,然後進行調用,結果,總是返回false。很疑惑,WinIO相關的檔案都放到一起的,怎麼還是這樣的呢?VS2005單元測試裡也會失敗。究其原因還是路徑的問題造成。分析WinIO的原始碼,可以發現InitializeWinIo()會調用一個GetDriverPath這個函數:
bool GetDriverPath()
{
PSTR pszSlash;
if (!GetModuleFileName(GetModuleHandle(NULL), szWinIoDriverPath, sizeof(szWinIoDriverPath)))
return false;
pszSlash = strrchr(szWinIoDriverPath, ‘\\’);
if (pszSlash)
pszSlash[1] = 0;
else
return false;
strcat(szWinIoDriverPath, “winio.sys”);
return true;
}
這裡面已經很清楚的知道了什麼情況下會false了。注意winio.sys存放的位置問題就能使之初始化正常。
其實還可以更加詳細的列印出InitializeWinIo()中每步的執行過程,這樣更容易判斷是哪個地方出現了問題。
就先寫到這裡吧,WinIO是個很好很強大,很黃很暴力的一個庫~~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.