Windows 2000に Vista で実装された MUI拡張を導入してみる実験
__declspec(naked) int WINAPI PRFIX(HINSTANCE hInstance,void *fnc,int k,void *p1,void*p2,void*p3,void*p4){ _asm{ cmp k,1 jb L3 jz L2 cmp k,3 jb L1 jz L0 push p4 L0: push p3 L1: push p2 L2: push p1 L3: push hInstance call fnc retn 1ch } } int WINAPI RFIX(HINSTANCE hInstance,void *fnc,int k,void *p1,void*p2,void*p3,void*p4){ int i,x; wchar_t fn[640]; i=PRFIX(hInstance,fnc,k,p1,p2,p3,p4); if(i){ return i; } ExpandEnvironmentStringsW(L"%systemroot%\\system32\\en-us\\",fn,640); x=lstrlenW(fn); GetModuleFileNameW(hInstance,fn+x,640); lstrcatW(fn+x,L".mui"); hInstance=LoadLibraryW(fn+x); if(!hInstance){ i=lstrlenW(fn+x); while(fn[x+i]!=L'\\'&&i>0)i--; if(i>0){ lstrcpyW(fn+x,fn+x+i+1); } hInstance=LoadLibraryW(fn); if(!hInstance){ memcpy(fn+x-6,L"ja-jp",5*2); hInstance=LoadLibraryW(fn); } } if(hInstance){ i=PRFIX(hInstance,fnc,k,p1,p2,p3,p4); FreeLibrary(hInstance); return i; } int APIENTRY WinMain(HINSTANCE hInstance, |
というわけで、即席でコード書いてみた
Vista の場合、 カレントフォルダの ja-jp / en-us を見に行くのだけど、仕様間違えて
カレントフォルダ → system32 の中のja-jp / en-us の順番で見に行くように作ってしまった・ω・
この拡張で動くようになったのは Vista 用の ROBOCOPY、 メモ帳、ペイント、ワードパッド、電卓など
残念ながら、DISKPART は COMサービスによる起動を使ってるらしく Live Mail 2009 や MSN Messenger 2009 と同様 無理でした ( XP SP2以降で実装)
COM サービスを DCOM Application Launcher の代わりに起動する方法が分かれば、解決するかも…。 ・ω・
おまけ
「note pad for vista」 とメモ帳で保存。 Vista 版のメモ帳で開くと…
おお、化けない!
Windows 2000/XP/2003の notepad のバグ
Comments