拡張カーネルに新しい機能を追加しようとして失敗した話
COMCTL32.DLL をラッパーにして、実行ファイルのマニフェストをスキャンして、Version 6.0 か 5.8x を動的にロードする仕組みを作ってみました。
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { int *p,q,r; DWORD pr,md; char fn[640]={0}; char cmct[] = "cmctl600.dll"; switch(dwReason) { case DLL_PROCESS_ATTACH: if(_KdwExeInfo&2){ *(int*)(cmct+5) = '.006'; md=6; } else if( (_KdwExeInfo>>16)<5 ){ *(int*)(cmct+5) = '.185'; md=4; } else { *(int*)(cmct+5) = '.285'; md=5; } h_original = LoadLibraryA(cmct); |
結果。
WINLOGON.DLL のロードでタイムアウトするようになってしまった(・ω・) ガーン!
ちゃんとロードはできてるのに…どうしてどうして‥‥
禁断のDllMainでLoadLibraryしたから?
>>1
LoadLibrary を DllMain でよんではいけない理由が、再帰的ループが発生する可能性が
あるから、なので再帰的ループが発生しないなら問題ないのです。
(ログでもループは発生していないのです)
ちょっとWin10のWinSxSで試してみたら、5.82/6.0は共にLoadLibrary/FreeLibraryは正常だしプロセスにロード/アンロードもされてることは確認できたけど、6.0はGetProcAddress(“comctl32.dll”)がNULLで返ってきたのでWin32APIにWinSxSの細工がされてるのかも?