Microsoft WDK 遇上 Intel Parallel Studio XE 2016 的問題

開發緣由


       開發語音處理和加解密的產品,公司打算在 kernel mode 使用 Intel® Integrated Performance Primitives (Intel® IPP) 9.0 和 Cryptography 的函式庫。因此,分別安裝微軟的 WDK (Windows Driver Kits),以及英特爾的 Parallel Studio XE 2016。雖然 Parallel Studio 本身有自帶編譯器,不過我們最終要用在 OS kernel,所以必須以 WDK 為編譯器,再將 IPP 函式庫連結進來。

遇上問題

       在 WDK 編譯代碼的過程遇上了問題,錯誤訊息如下。從訊息來看,連結時找不到 _byteswap_ulong 函式的定義,而 ComputeDigestSHA1.obj 這部分來自英特爾的 Cryptography 函式庫。

      (pcpsha1ca_n0---ComputeDigestSHA1.obj) : error LNK2001: unresolved external symbol _byteswap_ulong

      (pcpsha1ca_e9---ComputeDigestSHA1.obj) : error LNK2001: unresolved external symbol _byteswap_uint64

       我在 WDK 目錄下找到 wdm.h 有定義 _byteswap_ulong 函式,屬於內建函式,而且在 WDK 裡面已經用 RtlUlongByteSwap 來代替上述的函式,難怪我從 WDK 裡面的所有 library 中始終找不到 _byteswap_ulong symbol。基本上,要解決這個問題只要將 Cryptography 重新用 WDK 編譯一次應該就能搞定了,可惜我沒有 Crypto 代碼,必須想其他方式解決。圖一所是為函式的完整定義。

圖一:函式在 wdm.h 原始的定義


解決方式

       解決方式就是我重新定義這個函式,如下。利用 #pragma function 這個預處理指令,可參考 https://msdn.microsoft.com/zh-tw/library/sctyh01s.aspx

#pragma function( _byteswap_ulong )
ULONG __cdecl _byteswap_ulong( ULONG data )
{
return RtlUlongByteSwap( data ); // 使用 WDK 的函式
}

#pragma function( _byteswap_uint64 )
ULONGLONG __cdecl _byteswap_uint64( ULONGLONG data )
{
return RtlUlonglongByteSwap( data );
}

這個網誌中的熱門文章

Android APP 藍芽範例說明 -- BluetoothChat

Android APP BLE範例程式 -- BluetoothLeGatt

三軸重力加速計 Accelerometer