0
typedef void (WINAPI *voidfunc)(void);
typedef HMODULE (WINAPI *strfunc1)(char*);
typedef HMODULE (WINAPI *strfunc2)(void*,char*);
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    HMODULE kernel=GetModuleHandleA("kernel32.dll");
    if(!kernel)return 1;
    strfunc1 LoadLibrary16=(strfunc1)GetProcAddress(kernel,"LoadLibrary16");
    if(!LoadLibrary16){ 
        MessageBoxA(0,"LoadLibrary16 is not imported","err",0);
        return 1;
    }
    HMODULE user=LoadLibrary16("user.exe");
    if(!user){  
        MessageBoxA(0,"user.exe is not loaded","err",0);
        return 1;
    }
    strfunc2 GetProcAddress16=(strfunc2)GetProcAddress(kernel,"GetProcAddress16");
    if(!GetProcAddress16){  
        MessageBoxA(0,"GetProcAddress16 is not imported","err",0);
        return 1;
    }
    voidfunc enable=(voidfunc)GetProcAddress16(user,"EnableOemLayer");
    voidfunc disable=(voidfunc)GetProcAddress16(user,"DisableOemLayer");
    if(!(enable&&disable))return 1;
    disable();
    Sleep(5000);
    enable();

    return 0;
}

うまくいきません。

PS私のOSはWin 7です。

PPS まず、単純に LoadLibraryA を試してみましたが、エラーが発生し、少し読んで、16 ビットの文書化されていない関数が必要であることを理解しました。

4

3 に答える 3

3

残念ながら、kernel32.dll には 16 ビット関数はありません。見つけることができる機能は、

LoadLibraryA
LoadLibraryExA
LoadLibraryExW
LoadLibraryW

便利なツールは依存関係であり、 http://www.dependencywalker.com/から見つけることができます 。

于 2012-05-05T20:11:47.183 に答える
1

Windows 95/98/ME の kernel32.dll のみに LoadLibrary16 と GetProcAddress16 があり、それらは名前でエクスポートされません。

于 2015-05-07T16:11:10.553 に答える
1

LoadLibrary16 と GetProcAddress16 が kernel32.dll に存在しない

見るスナップショット

于 2012-05-06T15:53:51.377 に答える