Index: readme.txt ================================================================== --- readme.txt +++ readme.txt @@ -1,7 +1,7 @@ ---------------------------- - Quasi-Bga32.DLL 2015/05/05 + Quasi-Bga32.DLL 2015/07/03 ---------------------------- http://www.forest.impress.co.jp/article/2004/07/30/arcsecurity.html https://jvn.jp/jp/JVN78689801/ などで指摘されている脆弱性が気になるけれど、Bga32.dll は使い続けたいと @@ -26,12 +26,18 @@ * 上書き確認ダイアログが簡素なものになっています。 * コマンドラインやオプション、ワイルドカードの解釈は オリジナルと同じになるように作ったつもりです。 * ただし、突貫で作ったのでたぶんバグだらけです。 + その他のAPIおよびBga()APIにその他のコマンドを与えたときは、_Bga32.DLL の + 同名の関数に引数をそのまま丸投げします。_Bga32.DLL が見つからなかったときは、 + Bga() からはエラーコード 0x9000 を、それ以外の API もそれぞれのエラーを返します。 + ★更新履歴 + 2015/07/03 (0.06) + * _Bga32.DLL が存在しない状態で呼びされてもクラッシュしないように修正 2015/05/05 (0.05) * https://jvn.jp/vu/JVNVU78689801/ (zlib/libbz2の脆弱性) への対処 * zlib のバージョンを 1.2.8 に更新(するためにdmdのバージョンを 2.067 に更新) * libbz2 のバージョンを 1.0.6 に更新 2010/11/25 (0.04) Index: src/qbga32.d ================================================================== --- src/qbga32.d +++ src/qbga32.d @@ -1,8 +1,9 @@ import win32.windows; import std.string; import std.file; +import std.traits; import util; import windll; import bga_melter; import qbga_gui; @@ -10,28 +11,32 @@ // API霆「騾∝ヲ逅 //---------------------------------------------------------------- WinDLL g_orig_dll = null; UINT WM_ARCEXTRACT; +const ERROR_NO_BGA32DLL = 0x9000; static this() { g_orig_dll = WinDLL.load( "_Bga32.DLL" ); WM_ARCEXTRACT = RegisterWindowMessage("wm_arcextract"); } static ~this() { - g_orig_dll.close(); + if(g_orig_dll) + g_orig_dll.close(); } -template api(FnT) +FnT api(FnT, int defaultR)(string name) { - FnT api( string name ) - { - return g_orig_dll.get_api!(FnT)( name ); - } + FnT def = function(ParameterTypeTuple!(FnT) xs) { + return cast(ReturnType!(FnT))defaultR; + }; + if(g_orig_dll is null) return def; + FnT f = g_orig_dll.get_api!(FnT)(name); + return f ? f : def; } //---------------------------------------------------------------- // 邨ア蜷医い繝シ繧ォ繧、繝植PIシ夊サ「騾 //---------------------------------------------------------------- @@ -40,124 +45,124 @@ { int Bga( HWND a, immutable char* b, char* c, DWORD d ) { int r = Bga_impl( a, b.fromStringz() ); if( r < 0 ) // 縺薙ョ繝繝溘シDLL縺ァ縺ッ蜃ヲ逅縺ァ縺阪↑縺繧ウ繝槭Φ繝峨□縺」縺滓凾 - return api!(typeof(&Bga))("Bga")(a,b,c,d); + return api!(typeof(&Bga), ERROR_NO_BGA32DLL)("Bga")(a,b,c,d); return r; } WORD QBgaGetVersion() { - return 5; + return 6; } WORD BgaGetVersion() { - return api!(typeof(&BgaGetVersion))("BgaGetVersion")(); + return api!(typeof(&BgaGetVersion), 0)("BgaGetVersion")(); } BOOL BgaGetRunning() { - return api!(typeof(&BgaGetRunning))("BgaGetRunning")(); + return api!(typeof(&BgaGetRunning), FALSE)("BgaGetRunning")(); } BOOL BgaCheckArchive( char* a, int b ) { - return api!(typeof(&BgaCheckArchive))("BgaCheckArchive")(a,b); + return api!(typeof(&BgaCheckArchive), FALSE)("BgaCheckArchive")(a,b); } BOOL BgaConfigDialog( HWND a, char* b, int c ) { - return api!(typeof(&BgaConfigDialog))("BgaConfigDialog")(a,b,c); + return api!(typeof(&BgaConfigDialog), ERROR_NO_BGA32DLL)("BgaConfigDialog")(a,b,c); } int BgaGetFileCount( char* a ) { - return api!(typeof(&BgaGetFileCount))("BgaGetFileCount")(a); + return api!(typeof(&BgaGetFileCount), -1)("BgaGetFileCount")(a); } BOOL BgaQueryFunctionList( int a ) { - return api!(typeof(&BgaQueryFunctionList))("BgaQueryFunctionList")(a); + return api!(typeof(&BgaQueryFunctionList), FALSE)("BgaQueryFunctionList")(a); } alias void* HARC; HARC BgaOpenArchive( HWND a, char* b, DWORD c ) { - return api!(typeof(&BgaOpenArchive))("BgaOpenArchive")(a,b,c); + return api!(typeof(&BgaOpenArchive), 0)("BgaOpenArchive")(a,b,c); } int BgaCloseArchive( HARC a ) { - return api!(typeof(&BgaCloseArchive))("BgaCloseArchive")(a); + return api!(typeof(&BgaCloseArchive), 0)("BgaCloseArchive")(a); } alias void* LPINDIVIDUALINFO; int BgaFindFirst( HARC a, char* b, LPINDIVIDUALINFO c ) { - return api!(typeof(&BgaFindFirst))("BgaFindFirst")(a,b,c); + return api!(typeof(&BgaFindFirst), -1)("BgaFindFirst")(a,b,c); } int BgaFindNext( HARC a, LPINDIVIDUALINFO b ) { - return api!(typeof(&BgaFindNext))("BgaFindNext")(a,b); + return api!(typeof(&BgaFindNext), -1)("BgaFindNext")(a,b); } DWORD BgaGetArcOriginalSize( HARC a ) { - return api!(typeof(&BgaGetArcOriginalSize))("BgaGetArcOriginalSize")(a); + return api!(typeof(&BgaGetArcOriginalSize), -1)("BgaGetArcOriginalSize")(a); } DWORD BgaGetArcCompressedSize( HARC a ) { - return api!(typeof(&BgaGetArcCompressedSize))("BgaGetArcCompressedSize")(a); + return api!(typeof(&BgaGetArcCompressedSize), -1)("BgaGetArcCompressedSize")(a); } WORD BgaGetArcRatio( HARC a ) { - return api!(typeof(&BgaGetArcRatio))("BgaGetArcRatio")(a); + return api!(typeof(&BgaGetArcRatio), -1)("BgaGetArcRatio")(a); } BOOL BgaSetOwnerWindow( HWND a ) { - BOOL r = api!(typeof(&BgaSetOwnerWindow))("BgaSetOwnerWindow")(a); + BOOL r = api!(typeof(&BgaSetOwnerWindow), FALSE)("BgaSetOwnerWindow")(a); if( r ) BgaSetOwnerWindow_impl(a); return r; } BOOL BgaClearOwnerWindow() { - BOOL r = api!(typeof(&BgaClearOwnerWindow))("BgaClearOwnerWindow")(); + BOOL r = api!(typeof(&BgaClearOwnerWindow), FALSE)("BgaClearOwnerWindow")(); BgaClearOwnerWindow_impl(); return r; } alias BOOL function(HWND,UINT,UINT,EXTRACTINGINFOEX*) ARCHIVERPROC; BOOL BgaSetOwnerWindowEx( HWND a, ARCHIVERPROC* b ) { - BOOL r = api!(typeof(&BgaSetOwnerWindowEx))("BgaSetOwnerWindowEx")(a,b); + BOOL r = api!(typeof(&BgaSetOwnerWindowEx), FALSE)("BgaSetOwnerWindowEx")(a,b); if( r ) BgaSetOwnerWindowEx_impl(a,b); return r; } BOOL BgaKillOwnerWindowEx( HWND a ) { - BOOL r = api!(typeof(&BgaKillOwnerWindowEx))("BgaKillOwnerWindowEx")(a); + BOOL r = api!(typeof(&BgaKillOwnerWindowEx), FALSE)("BgaKillOwnerWindowEx")(a); BgaClearOwnerWindow_impl(); return r; } alias void* UNLHA_WND_ENUMMEMBPROC; BOOL BgaSetEnumMembersProc( UNLHA_WND_ENUMMEMBPROC a ) { - return api!(typeof(&BgaSetEnumMembersProc))("BgaSetEnumMembersProc")(a); + return api!(typeof(&BgaSetEnumMembersProc), FALSE)("BgaSetEnumMembersProc")(a); } BOOL BgaClearEnumMembersProc() { - return api!(typeof(&BgaClearEnumMembersProc))("BgaClearEnumMembersProc")(); + return api!(typeof(&BgaClearEnumMembersProc), FALSE)("BgaClearEnumMembersProc")(); } } //---------------------------------------------------------------- // 邨ア蜷医い繝シ繧ォ繧、繝植PIシ壼ョ溯」( Bga )