擴充預存程序 (XP) 以 DLL 形式載入 SQL Server 進程位址空間,共用進程記憶體、執行緒池,安全撰寫極具挑戰。
LoadLibrary 僅增參考計數。Init 會重複配置記憶體 → 洩漏;第一次呼叫 Final 釋放資源 → 後續呼叫崩潰。HINSTANCE hInst = NULL; int nRef = 0;
RETCODE xp_part_init(SRV_PROC* p) {
if (nRef == 0) { hInst = LoadLibrary("part.dll"); /* 初始化 */ }
++nRef; return XP_NOERROR;
}
RETCODE xp_part_process(SRV_PROC* p) { /* 使用 hInst 內的函數 */ }
RETCODE xp_part_finalize(SRV_PROC* p) {
if (--nRef == 0) { /* 清理 */ FreeLibrary(hInst); hInst = NULL; }
return XP_NOERROR;
}
Final 兩次會影響使用者 B。srv_paraminfo/srv_paramsetoutput 回傳值必檢。/GS (緩衝區安全)、/DYNAMICBASE (ASLR)、/NXCOMPAT (DEP)。XP 開發屬「危險區」,參考計數解決多載入資源洩漏,但無法解決多使用者隔離。現代架構全面轉向 CLR 整合,以受控執行環境取代非受控 DLL,從根本消除進程穩定性與安全性隱憂。