Changeset 21308 for trunk/src/win16ldr


Ignore:
Timestamp:
Jun 18, 2009, 6:27:45 PM (16 years ago)
Author:
ydario
Message:

Minor updates, backout imm changes.

Location:
trunk/src/win16ldr
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/win16ldr/odin.c

    r5979 r21308  
    1 #ifndef MSC6
     1#ifdef WATCOMC
    22#include <windows.h>
    33#else
    44#include "msc60win.h"
    55#endif
     6//#include <ddeml.h>
    67#include <stdlib.h>
    78#include <string.h>
     
    1920HANDLE hModule = 0;
    2021
     22typedef void (FAR * PASCAL FUNC_SetPELdr)(LPCSTR);
     23
     24#ifdef DDE_COMM
     25HDDEDATA CALLBACK MyDdeCallback(UINT wType, UINT wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2);
     26
     27DWORD idInst = 0;
     28HSZ   hszServer = 0, hszTopic = 0;
     29
     30#define MSG_DDE_WILDCONNECT     WM_USER+1
     31#define MSG_DDE_CONNECT         WM_USER+2
     32#endif
    2133
    2234//*****************************************************************************************
     
    2537{
    2638    MSG msg;
     39        FUNC_SetPELdr pfnSetPELdr;
     40        char  szPEPath[260];
     41        LPSTR tmp;
     42                                       
     43        hDll = LoadLibrary("odindll.dll");
     44        if(hDll == 0) {
     45                return 0;
     46        }
     47
     48        pfnSetPELdr = (FUNC_SetPELdr)GetProcAddress(hDll, "SETPELDR");
     49        if(pfnSetPELdr == NULL) {
     50                return 0;
     51        }                 
     52        //check if the caller specified the path of the PE loader; if so, pass
     53        //it on to odindll
     54    tmp = strstr(lpCmdLine, "/PELDR=[");
     55    if(tmp) {
     56        tmp += 8;       //skip /peldr=[
     57        strcpy(szPEPath, tmp);
     58        tmp = szPEPath;
     59       
     60        while(*tmp != ']' && *tmp != 0) tmp++;
     61       
     62        if(*tmp == ']') {
     63                *tmp = 0;
     64                pfnSetPELdr(szPEPath);
     65        }               
     66       
     67        //now skip this parameter               
     68        tmp = strstr(lpCmdLine, "/PELDR=[");
     69        while(*tmp != ']' && *tmp != 0) tmp++;     
     70        if(*tmp == ']') {
     71                tmp++;
     72        }
     73                lpCmdLine = tmp;       
     74    }
    2775
    2876    if (!hPrevInstance)
     
    3280    if (!InitInstance(hInstance, nCmdShow))
    3381        return (FALSE);
     82
     83#ifdef DDE_COMM
     84    if(DdeInitialize(&idInst, MyDdeCallback, APPCLASS_STANDARD, 0) != DMLERR_NO_ERROR) {
     85        return FALSE;
     86    }
     87    hszServer = DdeCreateStringHandle(idInst, "Win16OdinServer", CP_WINANSI);
     88    if(hszServer == 0) {
     89        return FALSE;
     90    }
     91    hszTopic = DdeCreateStringHandle(idInst, "Win16Broadcast", CP_WINANSI);
     92    if(hszTopic == 0) {
     93        return FALSE;
     94    }
     95    if(DdeNameService(idInst, hszServer, 0, DNS_REGISTER) == 0) {
     96        return FALSE;
     97    }
     98#endif
    3499
    35100    while(*lpCmdLine == ' ') lpCmdLine++;
     
    48113               
    49114                sprintf(errormsg, "WinExec %s failed with error %d", lpCmdLine, hModule);
    50                 MessageBox(hwnd, errormsg, "Ïnternal Error", MB_ICONHAND);
     115                MessageBox(hwnd, errormsg, "Internal Error", MB_ICONHAND);
    51116                DestroyWindow(hwnd);
    52117        }
    53118               
     119#ifdef DDE_COMM
     120    DdeNameService(idInst, hszServer, 0, DNS_UNREGISTER);               
     121    DdeFreeStringHandle(idInst, hszServer);
     122    DdeFreeStringHandle(idInst, hszTopic);
     123    DdeUninitialize(idInst);
     124#endif
    54125        FreeLibrary(hDll);
    55126    return (msg.wParam);
     
    60131{
    61132        WNDCLASS wc;
    62        
    63         hDll = LoadLibrary("odindll.dll");
    64         if(hDll == 0) {
    65                 return 0;
    66         }
    67133       
    68134    wc.style = NULL;
     
    88154        "Win16OdinClass",
    89155        "Odin Win16 Program Launcher",
     156#if 1
     157                WS_POPUP,
     158#else       
    90159        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
     160#endif       
    91161        CW_USEDEFAULT,
    92162        CW_USEDEFAULT,
     
    127197            break;
    128198
     199#ifdef DDE_COMM
     200        case MSG_DDE_WILDCONNECT:
     201            break;
     202        case MSG_DDE_CONNECT:
     203            MessageBox(0, "MyDdeCallback", "WILDCONNECT", MB_OK);
     204            break;
     205#endif
    129206        default:
    130207            return (DefWindowProc(hWnd, message, wParam, lParam));
     
    132209    return (NULL);
    133210}
    134 //*****************************************************************************************
    135 //*****************************************************************************************
     211#ifdef DDE_COMM
     212//*****************************************************************************************
     213//*****************************************************************************************
     214HDDEDATA CALLBACK MyDdeCallback(UINT wType, UINT wFmt, HCONV hConv,
     215                                HSZ hszTopic,  HSZ hszItem,
     216                                HDDEDATA hData, DWORD dwData1, DWORD dwData2)
     217{
     218//    WORD i, j;
     219//    WORD cItems, iFmt;
     220//    HDDEDATA hDataRet;
     221
     222    char msg[128];
     223
     224////     MessageBeep(500);
     225//    sprintf(msg, "type=%x format=%x %x %x %x %x %x %x", wType, wFmt, hConv, hszTopic, hszItem, hData, dwData1, dwData2);
     226//    MessageBox(0, "MyDdeCallback", "test", MB_OK);
     227
     228    if(wType == XTYP_EXECUTE && wFmt == CF_TEXT)
     229    {
     230        char szExec[64];
     231
     232        DdeGetData(hData, (LPBYTE)szExec, 64, 0);
     233        szExec[63] = 0;
     234        MessageBox(0, "MyDdeCallback", szExec, MB_OK);
     235        return (HDDEDATA)TRUE;
     236    }
     237    /*
     238     * Process wild initiates here
     239     */
     240    if (wType == XTYP_WILDCONNECT) {
     241        HSZ ahsz[(1 + 1) * 2];
     242        /*
     243         * He wants a hsz list of all our available app/topic pairs
     244         * that conform to hszTopic and hszItem(App).
     245         */
     246
     247//        MessageBox(0, "MyDdeCallback", "WILDCONNECT", MB_OK);
     248
     249//        if (!ValidateContext((PCONVCONTEXT)lData1)) {
     250//            return(FALSE);
     251//        }
     252
     253        if (hszItem != hszServer && hszItem != 0) {
     254            // we only support the hszAppName service
     255            return(0);
     256        }
     257
     258        ahsz[0] = hszServer;
     259        ahsz[1] = hszTopic;
     260        // cap off the list with 0s
     261        ahsz[2] = ahsz[3] = 0L;
     262
     263        // send it back
     264        return(DdeCreateDataHandle(idInst, (LPBYTE)&ahsz[0], sizeof(HSZ) * 4, 0L, 0, wFmt, 0));
     265    }
     266    return 0;
     267}
     268//*****************************************************************************************
     269//*****************************************************************************************
     270#endif
  • trunk/src/win16ldr/odindll.c

    r5979 r21308  
    1 #ifndef MSC6
    21#include <windows.h>
    3 #else
    4 #include "msc60win.h"
    5 #endif
    62#include <string.h>
     3#include <stdlib.h>
     4#include <stdio.h>
    75#include "peexe.h"
    86
     
    108UINT FAR _loadds PASCAL MyWinExec(LPCSTR lpszCmdLine, UINT fuShowCmd);
    119
     10BOOL    FAR _loadds PASCAL MyPostMessage(HWND, UINT, WPARAM, LPARAM);
     11LRESULT FAR _loadds PASCAL MySendMessage(HWND, UINT, WPARAM, LPARAM);
     12
    1213BOOL GetPEFileHeader (LPVOID lpFile, PIMAGE_FILE_HEADER pHeader);
    1314BOOL GetPEOptionalHeader (LPVOID lpFile, PIMAGE_OPTIONAL_HEADER pHeader);
    1415
    15 #if defined(__WATCOMC__)
    16 typedef DWORD (FAR * WINAPI * FUNC_GetVersion)(void);
    17 typedef UINT  (FAR * WINAPI * FUNC_WinExec)(LPCSTR, UINT);
    18 #else
    19 typedef DWORD (FAR * WINAPI FUNC_GetVersion)(void);
    20 typedef UINT  (FAR * WINAPI FUNC_WinExec)(LPCSTR, UINT);
    21 #endif
     16typedef DWORD (FAR * PASCAL FUNC_GetVersion)(void);
     17typedef UINT  (FAR * PASCAL FUNC_WinExec)(LPCSTR, UINT);
     18#ifdef PATCH_POSTSENDMSG
     19typedef BOOL    (FAR * PASCAL FUNC_PostMessage)(HWND, UINT, WPARAM, LPARAM);
     20typedef LRESULT (FAR * PASCAL FUNC_SendMessage)(HWND, UINT, WPARAM, LPARAM);
     21#endif
     22
     23BYTE  oldcodeEXEC;
     24DWORD olddataEXEC;
     25UINT  selEXEC;
     26BYTE FAR *jumpEXEC;
    2227
    2328BYTE  oldcodeVER;
    2429DWORD olddataVER;
    2530UINT  selVER;
    26 BYTE  oldcodeEXEC;
    27 DWORD olddataEXEC;
    28 UINT  selEXEC;
    2931BYTE FAR *jumpVER;
    30 BYTE FAR *jumpEXEC;
     32
     33#ifdef PATCH_POSTSENDMSG
     34BYTE  oldcodeSEND;
     35DWORD olddataSEND;
     36UINT  selSEND;
     37BYTE FAR *jumpSEND;
     38
     39BYTE  oldcodePOST;
     40DWORD olddataPOST;
     41UINT  selPOST;
     42BYTE FAR *jumpPOST;
     43#endif
    3144
    3245BOOL fUnloaded = FALSE;
     
    3548char szPEPath[256] = {0};
    3649
     50FUNC_GetVersion orggetver   = NULL;
     51FUNC_WinExec    orgwinexec  = NULL;
     52#ifdef PATCH_POSTSENDMSG
     53FUNC_SendMessage orgsendmsg = NULL;
     54FUNC_PostMessage orgpostmsg = NULL;
     55#endif
     56
    3757//*****************************************************************************************
    3858//*****************************************************************************************
    3959int FAR _loadds CALLBACK LibMain(HINSTANCE hinst, WORD wDataSeg, WORD cbHeap, LPSTR lpszCmdLine)
    4060{
    41         FUNC_GetVersion getver;
    42         FUNC_WinExec winexec;
    4361        DWORD FAR *addr;
    4462       
    45     if (fInit == FALSE) {
     63    if(fInit == FALSE)
     64    {
    4665        fInit = TRUE;
    4766
    48                 GetProfileString("Odin", "PEPath", "PE.EXE", szPEPath, sizeof(szPEPath));
    49                 getver      = (FUNC_GetVersion)&GetVersion;
     67                GetProfileString("PELDR", "LdrPath", "PE.EXE", szPEPath, sizeof(szPEPath));
     68               
     69                orggetver   = (FUNC_GetVersion)GetVersion;
    5070                selVER      = AllocSelector(0);
    51                 PrestoChangoSelector(SELECTOROF(getver), selVER);
    52 
    53                 jumpVER     = MAKELP(selVER, OFFSETOF(getver));
     71                PrestoChangoSelector(SELECTOROF(orggetver), selVER);
     72
     73                jumpVER     = MAKELP(selVER, OFFSETOF(orggetver));
    5474                addr        = (DWORD FAR *)(jumpVER+1);
    5575                oldcodeVER  = *jumpVER;
    5676                olddataVER  = *addr;
    5777                *jumpVER    = 0xEA;     //jmp
    58                 *addr       = (DWORD)&MyGetVersion;
    59 
    60                 winexec     = (FUNC_WinExec)&WinExec;   
     78                *addr       = (DWORD)MyGetVersion;
     79
     80                orgwinexec  = (FUNC_WinExec)WinExec;   
    6181                selEXEC     = AllocSelector(0);
    62                 PrestoChangoSelector(SELECTOROF(winexec), selEXEC);
    63 
    64                 jumpEXEC    = MAKELP(selEXEC, OFFSETOF(winexec));
     82                PrestoChangoSelector(SELECTOROF(orgwinexec), selEXEC);
     83
     84                jumpEXEC    = MAKELP(selEXEC, OFFSETOF(orgwinexec));
    6585                addr        = (DWORD FAR *)(jumpEXEC+1);
    6686                oldcodeEXEC = *jumpEXEC;
    6787                olddataEXEC = *addr;
    6888                *jumpEXEC   = 0xEA;     //jmp
    69                 *addr       = (DWORD)&MyWinExec;
     89                *addr       = (DWORD)MyWinExec;
     90
     91#ifdef PATCH_POSTSENDMSG
     92                orgsendmsg  = (FUNC_SendMessage)SendMessage;   
     93                selSEND     = AllocSelector(0);
     94                PrestoChangoSelector(SELECTOROF(orgsendmsg), selSEND);
     95
     96                jumpSEND    = MAKELP(selSEND, OFFSETOF(orgsendmsg));
     97                addr        = (DWORD FAR *)(jumpSEND+1);
     98                oldcodeSEND = *jumpSEND;
     99                olddataSEND = *addr;
     100                *jumpSEND   = 0xEA;     //jmp
     101                *addr       = (DWORD)MySendMessage;
     102
     103                orgpostmsg  = (FUNC_PostMessage)PostMessage;   
     104                selPOST     = AllocSelector(0);
     105                PrestoChangoSelector(SELECTOROF(orgpostmsg), selPOST);
     106
     107                jumpPOST    = MAKELP(selPOST, OFFSETOF(orgpostmsg));
     108                addr        = (DWORD FAR *)(jumpPOST+1);
     109                oldcodePOST = *jumpPOST;
     110                olddataPOST = *addr;
     111                *jumpPOST   = 0xEA;     //jmp
     112                *addr       = (DWORD)MyPostMessage;
     113#endif         
    70114    }
    71115    return 1;
     
    89133            *jumpEXEC = oldcodeEXEC;
    90134            *addr     = olddataEXEC;
     135
     136#ifdef PATCH_POSTSENDMSG
     137        addr        = (DWORD FAR *)(jumpSEND + 1);
     138        *jumpSEND   = oldcodeSEND;
     139        *addr       = olddataSEND;
     140                           
     141        addr        = (DWORD FAR *)(jumpPOST + 1);
     142        *jumpPOST   = oldcodePOST;
     143        *addr       = olddataPOST;
     144#endif       
    91145    }
    92146        return 1;
     
    97151{
    98152        return 0x00005F0C;
     153}
     154#ifdef PATCH_POSTSENDMSG
     155//*****************************************************************************************
     156//*****************************************************************************************
     157BOOL FAR _loadds PASCAL MyPostMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
     158{
     159    DWORD FAR *addr;
     160    BOOL       ret;
     161    char       buffer[64];
     162
     163    addr        = (DWORD FAR *)(jumpPOST + 1);
     164    *jumpPOST   = oldcodePOST;
     165    *addr       = olddataPOST;
     166
     167#ifdef DEBUG
     168    if(hwnd == HWND_BROADCAST) {
     169        sprintf(buffer, "Broadcast %x %lx %lx", Msg, wParam, lParam);
     170        MessageBox(0, "PostMessage", buffer, MB_OK);
     171    }
     172#endif
     173    ret = PostMessage(hwnd, Msg, wParam, lParam);
     174
     175    *jumpPOST   = 0xEA; //jmp
     176    *addr       = (DWORD)&MyPostMessage;
     177
     178    return ret;
     179}
     180//*****************************************************************************************
     181//*****************************************************************************************
     182LRESULT FAR _loadds PASCAL MySendMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
     183{
     184    DWORD FAR *addr;
     185    BOOL       ret;
     186    char       buffer[64];
     187
     188    addr        = (DWORD FAR *)(jumpSEND + 1);
     189    *jumpSEND   = oldcodeSEND;
     190    *addr       = olddataSEND;
     191
     192#ifdef DEBUG
     193    if(hwnd == HWND_BROADCAST) {
     194        sprintf(buffer, "Broadcast %x %lx %lx", Msg, wParam, lParam);
     195        MessageBox(0, "SendMessage", buffer, MB_OK);
     196    }
     197#endif
     198    ret = SendMessage(hwnd, Msg, wParam, lParam);
     199
     200    *jumpSEND   = 0xEA; //jmp
     201    *addr       = (DWORD)&MySendMessage;
     202
     203    return ret;
     204}                       
     205#endif
     206//*****************************************************************************************
     207//*****************************************************************************************
     208void FAR _loadds PASCAL SetPELdr(LPCSTR lpszPELdr)
     209{                       
     210        strcpy(szPEPath, lpszPELdr);
    99211}
    100212//*****************************************************************************************
     
    116228        BOOL fFail = TRUE;
    117229
     230    if(szPEPath[0] == 0) goto calloldfunc;
     231   
    118232        of.cBytes = sizeof(OFSTRUCT);
    119233       
     
    124238        strcpy(cmdline, lpszCmdLine);
    125239       
     240        //isolate path of executable   
    126241        while(*cmdline == ' ') cmdline++;
    127242        tmp = cmdline;
    128243        while(*tmp != ' ' && *tmp != 0) tmp++;
    129         tmp++;
    130244        *tmp = 0;
    131245       
     246        //open it to check the executable type; we only care about PE (win32) executables
     247        //we'll let the original WinExec function handle everything else
    132248        hFile = OpenFile(cmdline, &of, OF_READ);
    133249        bytesRead = _lread(hFile, &doshdr, sizeof(doshdr));
     
    163279        }
    164280
     281    //Ok, it's a PE executable. Use the PE loader to launch it
    165282        tmp = cmdline;
    166283        hMem4 = hMem1;
     
    194311                _lclose(hFile);
    195312
     313    //restore original WinExec entrypoint
    196314    addr      = (DWORD FAR *)(jumpEXEC + 1);
    197315    *jumpEXEC = oldcodeEXEC;
    198316    *addr     = olddataEXEC;
    199317       
     318        //and call it   
    200319        if(fFail) {
     320                //non-PE executable
    201321                 ret = WinExec(lpszCmdLine, fuShowCmd);
    202322        }
    203323        else {
     324                //PE executable
    204325                ret = WinExec(cmdline, fuShowCmd);
    205326                if(ret >= 32) {
     
    216337        }
    217338       
     339        //put back our WinExec override                   
    218340        *jumpEXEC   = 0xEA;     //jmp
    219341        *addr       = (DWORD)&MyWinExec;
  • trunk/src/win16ldr/odindll.def

    r5954 r21308  
    1717        MYGETVERSION    @1
    1818        MYWINEXEC               @2
     19        SETPELDR        @3
Note: See TracChangeset for help on using the changeset viewer.