Changeset 21308 for trunk/src/win16ldr
- Timestamp:
- Jun 18, 2009, 6:27:45 PM (16 years ago)
- Location:
- trunk/src/win16ldr
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/win16ldr/odin.c
r5979 r21308 1 #if ndef MSC61 #ifdef WATCOMC 2 2 #include <windows.h> 3 3 #else 4 4 #include "msc60win.h" 5 5 #endif 6 //#include <ddeml.h> 6 7 #include <stdlib.h> 7 8 #include <string.h> … … 19 20 HANDLE hModule = 0; 20 21 22 typedef void (FAR * PASCAL FUNC_SetPELdr)(LPCSTR); 23 24 #ifdef DDE_COMM 25 HDDEDATA CALLBACK MyDdeCallback(UINT wType, UINT wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2); 26 27 DWORD idInst = 0; 28 HSZ hszServer = 0, hszTopic = 0; 29 30 #define MSG_DDE_WILDCONNECT WM_USER+1 31 #define MSG_DDE_CONNECT WM_USER+2 32 #endif 21 33 22 34 //***************************************************************************************** … … 25 37 { 26 38 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 } 27 75 28 76 if (!hPrevInstance) … … 32 80 if (!InitInstance(hInstance, nCmdShow)) 33 81 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 34 99 35 100 while(*lpCmdLine == ' ') lpCmdLine++; … … 48 113 49 114 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); 51 116 DestroyWindow(hwnd); 52 117 } 53 118 119 #ifdef DDE_COMM 120 DdeNameService(idInst, hszServer, 0, DNS_UNREGISTER); 121 DdeFreeStringHandle(idInst, hszServer); 122 DdeFreeStringHandle(idInst, hszTopic); 123 DdeUninitialize(idInst); 124 #endif 54 125 FreeLibrary(hDll); 55 126 return (msg.wParam); … … 60 131 { 61 132 WNDCLASS wc; 62 63 hDll = LoadLibrary("odindll.dll");64 if(hDll == 0) {65 return 0;66 }67 133 68 134 wc.style = NULL; … … 88 154 "Win16OdinClass", 89 155 "Odin Win16 Program Launcher", 156 #if 1 157 WS_POPUP, 158 #else 90 159 WS_OVERLAPPEDWINDOW | WS_VISIBLE, 160 #endif 91 161 CW_USEDEFAULT, 92 162 CW_USEDEFAULT, … … 127 197 break; 128 198 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 129 206 default: 130 207 return (DefWindowProc(hWnd, message, wParam, lParam)); … … 132 209 return (NULL); 133 210 } 134 //***************************************************************************************** 135 //***************************************************************************************** 211 #ifdef DDE_COMM 212 //***************************************************************************************** 213 //***************************************************************************************** 214 HDDEDATA 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 MSC62 1 #include <windows.h> 3 #else4 #include "msc60win.h"5 #endif6 2 #include <string.h> 3 #include <stdlib.h> 4 #include <stdio.h> 7 5 #include "peexe.h" 8 6 … … 10 8 UINT FAR _loadds PASCAL MyWinExec(LPCSTR lpszCmdLine, UINT fuShowCmd); 11 9 10 BOOL FAR _loadds PASCAL MyPostMessage(HWND, UINT, WPARAM, LPARAM); 11 LRESULT FAR _loadds PASCAL MySendMessage(HWND, UINT, WPARAM, LPARAM); 12 12 13 BOOL GetPEFileHeader (LPVOID lpFile, PIMAGE_FILE_HEADER pHeader); 13 14 BOOL GetPEOptionalHeader (LPVOID lpFile, PIMAGE_OPTIONAL_HEADER pHeader); 14 15 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 16 typedef DWORD (FAR * PASCAL FUNC_GetVersion)(void); 17 typedef UINT (FAR * PASCAL FUNC_WinExec)(LPCSTR, UINT); 18 #ifdef PATCH_POSTSENDMSG 19 typedef BOOL (FAR * PASCAL FUNC_PostMessage)(HWND, UINT, WPARAM, LPARAM); 20 typedef LRESULT (FAR * PASCAL FUNC_SendMessage)(HWND, UINT, WPARAM, LPARAM); 21 #endif 22 23 BYTE oldcodeEXEC; 24 DWORD olddataEXEC; 25 UINT selEXEC; 26 BYTE FAR *jumpEXEC; 22 27 23 28 BYTE oldcodeVER; 24 29 DWORD olddataVER; 25 30 UINT selVER; 26 BYTE oldcodeEXEC;27 DWORD olddataEXEC;28 UINT selEXEC;29 31 BYTE FAR *jumpVER; 30 BYTE FAR *jumpEXEC; 32 33 #ifdef PATCH_POSTSENDMSG 34 BYTE oldcodeSEND; 35 DWORD olddataSEND; 36 UINT selSEND; 37 BYTE FAR *jumpSEND; 38 39 BYTE oldcodePOST; 40 DWORD olddataPOST; 41 UINT selPOST; 42 BYTE FAR *jumpPOST; 43 #endif 31 44 32 45 BOOL fUnloaded = FALSE; … … 35 48 char szPEPath[256] = {0}; 36 49 50 FUNC_GetVersion orggetver = NULL; 51 FUNC_WinExec orgwinexec = NULL; 52 #ifdef PATCH_POSTSENDMSG 53 FUNC_SendMessage orgsendmsg = NULL; 54 FUNC_PostMessage orgpostmsg = NULL; 55 #endif 56 37 57 //***************************************************************************************** 38 58 //***************************************************************************************** 39 59 int FAR _loadds CALLBACK LibMain(HINSTANCE hinst, WORD wDataSeg, WORD cbHeap, LPSTR lpszCmdLine) 40 60 { 41 FUNC_GetVersion getver;42 FUNC_WinExec winexec;43 61 DWORD FAR *addr; 44 62 45 if (fInit == FALSE) { 63 if(fInit == FALSE) 64 { 46 65 fInit = TRUE; 47 66 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; 50 70 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)); 54 74 addr = (DWORD FAR *)(jumpVER+1); 55 75 oldcodeVER = *jumpVER; 56 76 olddataVER = *addr; 57 77 *jumpVER = 0xEA; //jmp 58 *addr = (DWORD) &MyGetVersion;59 60 winexec = (FUNC_WinExec)&WinExec;78 *addr = (DWORD)MyGetVersion; 79 80 orgwinexec = (FUNC_WinExec)WinExec; 61 81 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)); 65 85 addr = (DWORD FAR *)(jumpEXEC+1); 66 86 oldcodeEXEC = *jumpEXEC; 67 87 olddataEXEC = *addr; 68 88 *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 70 114 } 71 115 return 1; … … 89 133 *jumpEXEC = oldcodeEXEC; 90 134 *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 91 145 } 92 146 return 1; … … 97 151 { 98 152 return 0x00005F0C; 153 } 154 #ifdef PATCH_POSTSENDMSG 155 //***************************************************************************************** 156 //***************************************************************************************** 157 BOOL 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 //***************************************************************************************** 182 LRESULT 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 //***************************************************************************************** 208 void FAR _loadds PASCAL SetPELdr(LPCSTR lpszPELdr) 209 { 210 strcpy(szPEPath, lpszPELdr); 99 211 } 100 212 //***************************************************************************************** … … 116 228 BOOL fFail = TRUE; 117 229 230 if(szPEPath[0] == 0) goto calloldfunc; 231 118 232 of.cBytes = sizeof(OFSTRUCT); 119 233 … … 124 238 strcpy(cmdline, lpszCmdLine); 125 239 240 //isolate path of executable 126 241 while(*cmdline == ' ') cmdline++; 127 242 tmp = cmdline; 128 243 while(*tmp != ' ' && *tmp != 0) tmp++; 129 tmp++;130 244 *tmp = 0; 131 245 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 132 248 hFile = OpenFile(cmdline, &of, OF_READ); 133 249 bytesRead = _lread(hFile, &doshdr, sizeof(doshdr)); … … 163 279 } 164 280 281 //Ok, it's a PE executable. Use the PE loader to launch it 165 282 tmp = cmdline; 166 283 hMem4 = hMem1; … … 194 311 _lclose(hFile); 195 312 313 //restore original WinExec entrypoint 196 314 addr = (DWORD FAR *)(jumpEXEC + 1); 197 315 *jumpEXEC = oldcodeEXEC; 198 316 *addr = olddataEXEC; 199 317 318 //and call it 200 319 if(fFail) { 320 //non-PE executable 201 321 ret = WinExec(lpszCmdLine, fuShowCmd); 202 322 } 203 323 else { 324 //PE executable 204 325 ret = WinExec(cmdline, fuShowCmd); 205 326 if(ret >= 32) { … … 216 337 } 217 338 339 //put back our WinExec override 218 340 *jumpEXEC = 0xEA; //jmp 219 341 *addr = (DWORD)&MyWinExec; -
trunk/src/win16ldr/odindll.def
r5954 r21308 17 17 MYGETVERSION @1 18 18 MYWINEXEC @2 19 SETPELDR @3
Note:
See TracChangeset
for help on using the changeset viewer.
