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;

    }
    return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
    char str[512],str2[512];
    RFIX(hInstance,LoadStringA,3,(void*)12345,str,(void*)256,0);
    RFIX(hInstance,LoadStringA,3,(void*)11111,str2,(void*)256,0);
    MessageBoxA(0,str,str2,0);
    return 0;
}

というわけで、即席でコード書いてみた
Vista の場合、 カレントフォルダの ja-jp / en-us を見に行くのだけど、仕様間違えて
カレントフォルダ → system32 の中のja-jp / en-us の順番で見に行くように作ってしまった・ω・

win2kb
この拡張で動くようになったのは Vista 用の ROBOCOPY、 メモ帳、ペイント、ワードパッド、電卓など

残念ながら、DISKPART は COMサービスによる起動を使ってるらしく Live Mail 2009 や MSN Messenger 2009 と同様 無理でした ( XP SP2以降で実装)
COM サービスを DCOM Application Launcher の代わりに起動する方法が分かれば、解決するかも…。 ・ω・

おまけ
「note pad for vista」 とメモ帳で保存。 Vista 版のメモ帳で開くと…
visnp
おお、化けない!
Windows 2000/XP/2003の notepad のバグ

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です