Check-in [9f9e8588d4]

Not logged in
Overview
SHA1 Hash:9f9e8588d40ced798feb247d4b6dbab89bfe8e7f
Date: 2015-07-02 16:22:43
User: kinaba
Comment:0.06: avoid crash when _Bga32.dll does not exist.
Timelines: family | ancestors | trunk
Downloads: Tarball | ZIP archive
Other Links: files | file ages | manifest
Tags And Properties
Changes
hide diffs side-by-side diffs patch

Modified readme.txt from [eccd2f6b41af12e3] to [5bf9c42ae0210e1e].

1 1 ---------------------------- 2 - Quasi-Bga32.DLL 2015/05/05 2 + Quasi-Bga32.DLL 2015/07/03 3 3 ---------------------------- 4 4 5 5 http://www.forest.impress.co.jp/article/2004/07/30/arcsecurity.html 6 6 https://jvn.jp/jp/JVN78689801/ 7 7 などで指摘されている脆弱性が気になるけれど、Bga32.dll は使い続けたいと 8 8 いう人のための回避策です。QBga32.DLL では、展開処理はこれらの問題に 9 9 対処しつつ内部で行い、圧縮などの他の処理は全てオリジナルのBga32.dllに ................................................................................ 24 24 * 今のところ、レジストリの設定を読み込みません。 25 25 * エラー時の返値が非常にいい加減です。 26 26 * 上書き確認ダイアログが簡素なものになっています。 27 27 * コマンドラインやオプション、ワイルドカードの解釈は 28 28 オリジナルと同じになるように作ったつもりです。 29 29 * ただし、突貫で作ったのでたぶんバグだらけです。 30 30 31 + その他のAPIおよびBga()APIにその他のコマンドを与えたときは、_Bga32.DLL の 32 + 同名の関数に引数をそのまま丸投げします。_Bga32.DLL が見つからなかったときは、 33 + Bga() からはエラーコード 0x9000 を、それ以外の API もそれぞれのエラーを返します。 34 + 31 35 ★更新履歴 32 36 37 + 2015/07/03 (0.06) 38 + * _Bga32.DLL が存在しない状態で呼びされてもクラッシュしないように修正 33 39 2015/05/05 (0.05) 34 40 * https://jvn.jp/vu/JVNVU78689801/ (zlib/libbz2の脆弱性) への対処 35 41 * zlib のバージョンを 1.2.8 に更新(するためにdmdのバージョンを 2.067 に更新) 36 42 * libbz2 のバージョンを 1.0.6 に更新 37 43 2010/11/25 (0.04) 38 44 * _Bga32.dll を探す対象パスからカレントディレクトリを外しました 39 45 2004/8/31 (0.03)

Modified src/qbga32.d from [1c734ac63ab48040] to [55bc981232a3491c].

1 1 import win32.windows; 2 2 import std.string; 3 3 import std.file; 4 +import std.traits; 4 5 import util; 5 6 import windll; 6 7 import bga_melter; 7 8 import qbga_gui; 8 9 9 10 //---------------------------------------------------------------- 10 11 // API霆「騾∝ヲ逅 11 12 //---------------------------------------------------------------- 12 13 13 14 WinDLL g_orig_dll = null; 14 15 UINT WM_ARCEXTRACT; 16 +const ERROR_NO_BGA32DLL = 0x9000; 15 17 16 18 static this() 17 19 { 18 20 g_orig_dll = WinDLL.load( "_Bga32.DLL" ); 19 21 WM_ARCEXTRACT = RegisterWindowMessage("wm_arcextract"); 20 22 } 21 23 22 24 static ~this() 23 25 { 24 - g_orig_dll.close(); 26 + if(g_orig_dll) 27 + g_orig_dll.close(); 25 28 } 26 29 27 -template api(FnT) 30 +FnT api(FnT, int defaultR)(string name) 28 31 { 29 - FnT api( string name ) 30 - { 31 - return g_orig_dll.get_api!(FnT)( name ); 32 - } 32 + FnT def = function(ParameterTypeTuple!(FnT) xs) { 33 + return cast(ReturnType!(FnT))defaultR; 34 + }; 35 + if(g_orig_dll is null) return def; 36 + FnT f = g_orig_dll.get_api!(FnT)(name); 37 + return f ? f : def; 33 38 } 34 39 35 40 //---------------------------------------------------------------- 36 41 // 邨ア蜷医い繝シ繧ォ繧、繝植PIシ夊サ「騾 37 42 //---------------------------------------------------------------- 38 43 39 44 extern(Windows) 40 45 { 41 46 int Bga( HWND a, immutable char* b, char* c, DWORD d ) 42 47 { 43 48 int r = Bga_impl( a, b.fromStringz() ); 44 49 if( r < 0 ) // 縺薙ョ繝繝溘シDLL縺ァ縺ッ蜃ヲ逅縺ァ縺阪↑縺繧ウ繝槭Φ繝峨□縺」縺滓凾 45 - return api!(typeof(&Bga))("Bga")(a,b,c,d); 50 + return api!(typeof(&Bga), ERROR_NO_BGA32DLL)("Bga")(a,b,c,d); 46 51 return r; 47 52 } 48 53 49 54 WORD QBgaGetVersion() 50 55 { 51 - return 5; 56 + return 6; 52 57 } 53 58 54 59 WORD BgaGetVersion() 55 60 { 56 - return api!(typeof(&BgaGetVersion))("BgaGetVersion")(); 61 + return api!(typeof(&BgaGetVersion), 0)("BgaGetVersion")(); 57 62 } 58 63 59 64 BOOL BgaGetRunning() 60 65 { 61 - return api!(typeof(&BgaGetRunning))("BgaGetRunning")(); 66 + return api!(typeof(&BgaGetRunning), FALSE)("BgaGetRunning")(); 62 67 } 63 68 64 69 BOOL BgaCheckArchive( char* a, int b ) 65 70 { 66 - return api!(typeof(&BgaCheckArchive))("BgaCheckArchive")(a,b); 71 + return api!(typeof(&BgaCheckArchive), FALSE)("BgaCheckArchive")(a,b); 67 72 } 68 73 69 74 BOOL BgaConfigDialog( HWND a, char* b, int c ) 70 75 { 71 - return api!(typeof(&BgaConfigDialog))("BgaConfigDialog")(a,b,c); 76 + return api!(typeof(&BgaConfigDialog), ERROR_NO_BGA32DLL)("BgaConfigDialog")(a,b,c); 72 77 } 73 78 74 79 int BgaGetFileCount( char* a ) 75 80 { 76 - return api!(typeof(&BgaGetFileCount))("BgaGetFileCount")(a); 81 + return api!(typeof(&BgaGetFileCount), -1)("BgaGetFileCount")(a); 77 82 } 78 83 79 84 BOOL BgaQueryFunctionList( int a ) 80 85 { 81 - return api!(typeof(&BgaQueryFunctionList))("BgaQueryFunctionList")(a); 86 + return api!(typeof(&BgaQueryFunctionList), FALSE)("BgaQueryFunctionList")(a); 82 87 } 83 88 84 89 alias void* HARC; 85 90 HARC BgaOpenArchive( HWND a, char* b, DWORD c ) 86 91 { 87 - return api!(typeof(&BgaOpenArchive))("BgaOpenArchive")(a,b,c); 92 + return api!(typeof(&BgaOpenArchive), 0)("BgaOpenArchive")(a,b,c); 88 93 } 89 94 90 95 int BgaCloseArchive( HARC a ) 91 96 { 92 - return api!(typeof(&BgaCloseArchive))("BgaCloseArchive")(a); 97 + return api!(typeof(&BgaCloseArchive), 0)("BgaCloseArchive")(a); 93 98 } 94 99 95 100 alias void* LPINDIVIDUALINFO; 96 101 int BgaFindFirst( HARC a, char* b, LPINDIVIDUALINFO c ) 97 102 { 98 - return api!(typeof(&BgaFindFirst))("BgaFindFirst")(a,b,c); 103 + return api!(typeof(&BgaFindFirst), -1)("BgaFindFirst")(a,b,c); 99 104 } 100 105 101 106 int BgaFindNext( HARC a, LPINDIVIDUALINFO b ) 102 107 { 103 - return api!(typeof(&BgaFindNext))("BgaFindNext")(a,b); 108 + return api!(typeof(&BgaFindNext), -1)("BgaFindNext")(a,b); 104 109 } 105 110 106 111 DWORD BgaGetArcOriginalSize( HARC a ) 107 112 { 108 - return api!(typeof(&BgaGetArcOriginalSize))("BgaGetArcOriginalSize")(a); 113 + return api!(typeof(&BgaGetArcOriginalSize), -1)("BgaGetArcOriginalSize")(a); 109 114 } 110 115 111 116 DWORD BgaGetArcCompressedSize( HARC a ) 112 117 { 113 - return api!(typeof(&BgaGetArcCompressedSize))("BgaGetArcCompressedSize")(a); 118 + return api!(typeof(&BgaGetArcCompressedSize), -1)("BgaGetArcCompressedSize")(a); 114 119 } 115 120 116 121 WORD BgaGetArcRatio( HARC a ) 117 122 { 118 - return api!(typeof(&BgaGetArcRatio))("BgaGetArcRatio")(a); 123 + return api!(typeof(&BgaGetArcRatio), -1)("BgaGetArcRatio")(a); 119 124 } 120 125 121 126 BOOL BgaSetOwnerWindow( HWND a ) 122 127 { 123 - BOOL r = api!(typeof(&BgaSetOwnerWindow))("BgaSetOwnerWindow")(a); 128 + BOOL r = api!(typeof(&BgaSetOwnerWindow), FALSE)("BgaSetOwnerWindow")(a); 124 129 if( r ) BgaSetOwnerWindow_impl(a); 125 130 return r; 126 131 } 127 132 128 133 BOOL BgaClearOwnerWindow() 129 134 { 130 - BOOL r = api!(typeof(&BgaClearOwnerWindow))("BgaClearOwnerWindow")(); 135 + BOOL r = api!(typeof(&BgaClearOwnerWindow), FALSE)("BgaClearOwnerWindow")(); 131 136 BgaClearOwnerWindow_impl(); 132 137 return r; 133 138 } 134 139 135 140 alias BOOL function(HWND,UINT,UINT,EXTRACTINGINFOEX*) ARCHIVERPROC; 136 141 BOOL BgaSetOwnerWindowEx( HWND a, ARCHIVERPROC* b ) 137 142 { 138 - BOOL r = api!(typeof(&BgaSetOwnerWindowEx))("BgaSetOwnerWindowEx")(a,b); 143 + BOOL r = api!(typeof(&BgaSetOwnerWindowEx), FALSE)("BgaSetOwnerWindowEx")(a,b); 139 144 if( r ) BgaSetOwnerWindowEx_impl(a,b); 140 145 return r; 141 146 } 142 147 143 148 BOOL BgaKillOwnerWindowEx( HWND a ) 144 149 { 145 - BOOL r = api!(typeof(&BgaKillOwnerWindowEx))("BgaKillOwnerWindowEx")(a); 150 + BOOL r = api!(typeof(&BgaKillOwnerWindowEx), FALSE)("BgaKillOwnerWindowEx")(a); 146 151 BgaClearOwnerWindow_impl(); 147 152 return r; 148 153 } 149 154 150 155 alias void* UNLHA_WND_ENUMMEMBPROC; 151 156 BOOL BgaSetEnumMembersProc( UNLHA_WND_ENUMMEMBPROC a ) 152 157 { 153 - return api!(typeof(&BgaSetEnumMembersProc))("BgaSetEnumMembersProc")(a); 158 + return api!(typeof(&BgaSetEnumMembersProc), FALSE)("BgaSetEnumMembersProc")(a); 154 159 } 155 160 156 161 BOOL BgaClearEnumMembersProc() 157 162 { 158 - return api!(typeof(&BgaClearEnumMembersProc))("BgaClearEnumMembersProc")(); 163 + return api!(typeof(&BgaClearEnumMembersProc), FALSE)("BgaClearEnumMembersProc")(); 159 164 } 160 165 } 161 166 162 167 //---------------------------------------------------------------- 163 168 // 邨ア蜷医い繝シ繧ォ繧、繝植PIシ壼ョ溯」( Bga ) 164 169 //---------------------------------------------------------------- 165 170