- Timestamp:
- Feb 7, 2000, 11:36:16 PM (26 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/KERNEL32.DEF
r2669 r2678 1 ; $Id: KERNEL32.DEF,v 1. 69 2000-02-06 20:50:28sandervl Exp $1 ; $Id: KERNEL32.DEF,v 1.70 2000-02-07 22:36:15 sandervl Exp $ 2 2 3 3 ;Created by BLAST for IBM's compiler … … 142 142 143 143 ;;Not supported; just present 144 LoadLibrary16 = _LoadLibrary16@4 145 FreeLibrary16 = _FreeLibrary16@4 144 LoadLibrary16 = _LoadLibrary16@4 @35 145 FreeLibrary16 = _FreeLibrary16@4 @36 146 146 GetProcAddress16 = _GetProcAddress16@8 @37 147 147 … … 284 284 ; ExpungeConsoleCommandHistoryW = _ExpungeConsoleCommandHistoryW@?? ;NT 285 285 ; ExtendVirtualBuffer = _ExtendVirtualBuffer@?? ;NT 286 ; FT_Exit0 = _FT_Exit0@??@218 ;W95287 ; FT_Exit12 = _FT_Exit12@??@219 ;W95288 ; FT_Exit16 = _FT_Exit16@??@220 ;W95289 ; FT_Exit20 = _FT_Exit20@??@221 ;W95290 ; FT_Exit24 = _FT_Exit24@??@222 ;W95291 ; FT_Exit28 = _FT_Exit28@??@223 ;W95292 ; FT_Exit32 = _FT_Exit32@??@224 ;W95293 ; FT_Exit36 = _FT_Exit36@??@225 ;W95294 ; FT_Exit4 = _FT_Exit4@??@226 ;W95295 ; FT_Exit40 = _FT_Exit40@??@227 ;W95296 ; FT_Exit44 = _FT_Exit44@??@228 ;W95297 ; FT_Exit48 = _FT_Exit48@??@229 ;W95298 ; FT_Exit52 = _FT_Exit52@??@230 ;W95299 ; FT_Exit56 = _FT_Exit56@??@231 ;W95300 ; FT_Exit8 = _FT_Exit8@??@232 ;W95301 ; FT_Prolog = _FT_Prolog@??@233 ;W95302 ; FT_Thunk = _FT_Thunk@??@234 ;W95286 FT_Exit0 = _FT_Exit0@4 @218 ;W95 287 FT_Exit12 = _FT_Exit12@4 @219 ;W95 288 FT_Exit16 = _FT_Exit16@4 @220 ;W95 289 FT_Exit20 = _FT_Exit20@4 @221 ;W95 290 FT_Exit24 = _FT_Exit24@4 @222 ;W95 291 FT_Exit28 = _FT_Exit28@4 @223 ;W95 292 FT_Exit32 = _FT_Exit32@4 @224 ;W95 293 FT_Exit36 = _FT_Exit36@4 @225 ;W95 294 FT_Exit4 = _FT_Exit4@4 @226 ;W95 295 FT_Exit40 = _FT_Exit40@4 @227 ;W95 296 FT_Exit44 = _FT_Exit44@4 @228 ;W95 297 FT_Exit48 = _FT_Exit48@4 @229 ;W95 298 FT_Exit52 = _FT_Exit52@4 @230 ;W95 299 FT_Exit56 = _FT_Exit56@4 @231 ;W95 300 FT_Exit8 = _FT_Exit8@4 @232 ;W95 301 FT_Prolog = _FT_Prolog@4 @233 ;W95 302 FT_Thunk = _FT_Thunk@4 @234 ;W95 303 303 FatalAppExitA = _FatalAppExitA@8 @235 304 304 FatalAppExitW = _FatalAppExitW@8 @236 … … 716 716 RtlUnwind = RtlUnwindAsm @590 717 717 RtlZeroMemory = _RtlZeroMemory@8 @591 718 ;SMapLS = _SMapLS@4 @592 ;W95719 ; SMapLS_IP_EBP_12 = _SMapLS_IP_EBP_12@??@593 ;W95720 ; SMapLS_IP_EBP_16 = _SMapLS_IP_EBP_16@??@594 ;W95721 ; SMapLS_IP_EBP_20 = _SMapLS_IP_EBP_20@??@595 ;W95722 ; SMapLS_IP_EBP_24 = _SMapLS_IP_EBP_24@??@596 ;W95723 ; SMapLS_IP_EBP_28 = _SMapLS_IP_EBP_28@??@597 ;W95724 ; SMapLS_IP_EBP_32 = _SMapLS_IP_EBP_32@??@598 ;W95725 ; SMapLS_IP_EBP_36 = _SMapLS_IP_EBP_36@??@599 ;W95726 ; SMapLS_IP_EBP_40 = _SMapLS_IP_EBP_40@??@600 ;W95727 ; SMapLS_IP_EBP_8 = _SMapLS_IP_EBP_8@??@601 ;W95728 ; SUnMapLS = _SUnMapLS@??@602 ;W95729 ; SUnMapLS_IP_EBP_12 = _SUnMapLS_IP_EBP_12@??@603 ;W95730 ; SUnMapLS_IP_EBP_16 = _SUnMapLS_IP_EBP_16@??@604 ;W95731 ; SUnMapLS_IP_EBP_20 = _SUnMapLS_IP_EBP_20@??@605 ;W95732 ; SUnMapLS_IP_EBP_24 = _SUnMapLS_IP_EBP_24@??@606 ;W95733 ; SUnMapLS_IP_EBP_28 = _SUnMapLS_IP_EBP_28@??@607 ;W95734 ; SUnMapLS_IP_EBP_32 = _SUnMapLS_IP_EBP_32@??@608 ;W95735 ; SUnMapLS_IP_EBP_36 = _SUnMapLS_IP_EBP_36@??@609 ;W95736 ; SUnMapLS_IP_EBP_40 = _SUnMapLS_IP_EBP_40@??@610 ;W95737 ; SUnMapLS_IP_EBP_8 = _SUnMapLS_IP_EBP_8@??@611 ;W95718 SMapLS = _SMapLS@4 @592 ;W95 719 SMapLS_IP_EBP_12 = _SMapLS_IP_EBP_12@4 @593 ;W95 720 SMapLS_IP_EBP_16 = _SMapLS_IP_EBP_16@4 @594 ;W95 721 SMapLS_IP_EBP_20 = _SMapLS_IP_EBP_20@4 @595 ;W95 722 SMapLS_IP_EBP_24 = _SMapLS_IP_EBP_24@4 @596 ;W95 723 SMapLS_IP_EBP_28 = _SMapLS_IP_EBP_28@4 @597 ;W95 724 SMapLS_IP_EBP_32 = _SMapLS_IP_EBP_32@4 @598 ;W95 725 SMapLS_IP_EBP_36 = _SMapLS_IP_EBP_36@4 @599 ;W95 726 SMapLS_IP_EBP_40 = _SMapLS_IP_EBP_40@4 @600 ;W95 727 SMapLS_IP_EBP_8 = _SMapLS_IP_EBP_8@4 @601 ;W95 728 SUnMapLS = _SUnMapLS@4 @602 ;W95 729 SUnMapLS_IP_EBP_12 = _SUnMapLS_IP_EBP_12@4 @603 ;W95 730 SUnMapLS_IP_EBP_16 = _SUnMapLS_IP_EBP_16@4 @604 ;W95 731 SUnMapLS_IP_EBP_20 = _SUnMapLS_IP_EBP_20@4 @605 ;W95 732 SUnMapLS_IP_EBP_24 = _SUnMapLS_IP_EBP_24@4 @606 ;W95 733 SUnMapLS_IP_EBP_28 = _SUnMapLS_IP_EBP_28@4 @607 ;W95 734 SUnMapLS_IP_EBP_32 = _SUnMapLS_IP_EBP_32@4 @608 ;W95 735 SUnMapLS_IP_EBP_36 = _SUnMapLS_IP_EBP_36@4 @609 ;W95 736 SUnMapLS_IP_EBP_40 = _SUnMapLS_IP_EBP_40@4 @610 ;W95 737 SUnMapLS_IP_EBP_8 = _SUnMapLS_IP_EBP_8@4 @611 ;W95 738 738 ScrollConsoleScreenBufferA = _ScrollConsoleScreenBufferA@20 @612 739 739 ScrollConsoleScreenBufferW = _ScrollConsoleScreenBufferW@20 @613 … … 853 853 ; UTRegister = _UTRegister@?? @698 ;W95 854 854 ; UTUnRegister = _UTUnRegister@?? @699 ;W95 855 ; UnMapLS = _UnMapLS@??@700 ;W95856 ; UnMapSLFixArray = _UnMapSLFixArray@??@701 ;W95855 UnMapLS = _UnMapLS@4 @700 ;W95 856 UnMapSLFixArray = _UnMapSLFixArray@12 @701 ;W95 857 857 UnhandledExceptionFilter = _UnhandledExceptionFilter@4 @702 858 858 UninitializeCriticalSection = _UninitializeCriticalSection@4 @703 ;W95 … … 1026 1026 HMHandleGetUserData__FUl @1263 1027 1027 1028 _GetThreadTEB@0 1029 _GetThreadTHDB@0 1030 _GetTHDBFromThreadId@4 1028 _GetThreadTEB@0 @1234 1029 _GetThreadTHDB@0 @1235 1030 _GetTHDBFromThreadId@4 @1255 1031 1031 _GetTHDBFromThreadHandle@4 @1256 1032 1032 … … 1079 1079 GetDisplayCodepage__Fv @3000 1080 1080 GetWindowsCodepage__Fv @3001 1081 1082 1081 1082 -
trunk/src/kernel32/thunk.cpp
r100 r2678 1 /* $Id: thunk.cpp,v 1.2 1999-06-10 20:48:02 phaller Exp $ */ 2 3 /* 4 * 5 * Project Odin Software License can be found in LICENSE.TXT 6 * 7 */ 1 /* $Id: thunk.cpp,v 1.3 2000-02-07 22:36:16 sandervl Exp $ */ 2 8 3 /* 9 4 * Win32 thunking API functions (mostly stubs) … … 17 12 * Copyright 1997-1998 Marcus Meissner 18 13 * Copyright 1998 Ulrich Weigand 14 * Copyright 1995 Alexandre Julliard 15 * 16 * Project Odin Software License can be found in LICENSE.TXT 17 * 19 18 */ 20 19 #include <os2win.h> … … 31 30 return((DWORD)address); 32 31 } 32 /*********************************************************************** 33 * UnMapLS (KERNEL32.700) 34 * 35 * Free mapped selector. 36 */ 37 void WIN32API UnMapLS( SEGPTR sptr ) 38 { 39 dprintf(("UnMapLS - stub\n")); 40 #if 0 41 if (SELECTOROF(sptr)) 42 SELECTOR_FreeBlock( SELECTOROF(sptr), 1 ); 43 #endif 44 } 33 45 //****************************************************************************** 34 46 //****************************************************************************** … … 44 56 dprintf(("FT_Prolog - stub\n")); 45 57 } 46 //****************************************************************************** 47 //****************************************************************************** 58 /********************************************************************** 59 * FT_Thunk (KERNEL32.234) 60 * 61 * This routine performs the actual call to 16-bit code, 62 * similar to QT_Thunk. The differences are: 63 * - The call target is taken from the buffer created by FT_Prolog 64 * - Those arguments requested by the thunk code (by setting the 65 * corresponding bit in the bitmap at EBP-20) are converted 66 * from 32-bit pointers to segmented pointers (those pointers 67 * are guaranteed to point to structures copied to the stack 68 * by the thunk code, so we always use the 16-bit stack selector 69 * for those addresses). 70 * 71 * The bit #i of EBP-20 corresponds here to the DWORD starting at 72 * ESP+4 + 2*i. 73 * 74 * FIXME: It is unclear what happens if there are more than 32 WORDs 75 * of arguments, so that the single DWORD bitmap is no longer 76 * sufficient ... 77 */ 78 void WINAPI FT_Thunk( CONTEXT86 *context ) 79 { 80 DWORD mapESPrelative = *(DWORD *)(EBP_reg(context) - 20); 81 DWORD callTarget = *(DWORD *)(EBP_reg(context) - 52); 82 83 CONTEXT86 context16; 84 DWORD i, argsize; 85 LPBYTE newstack, oldstack; 86 87 dprintf(("FT_Thunk - stub\n")); 88 89 #if 0 90 memcpy(&context16,context,sizeof(context16)); 91 92 CS_reg(&context16) = HIWORD(callTarget); 93 EIP_reg(&context16) = LOWORD(callTarget); 94 EBP_reg(&context16) = OFFSETOF( NtCurrentTeb()->cur_stack ) 95 + (WORD)&((STACK16FRAME*)0)->bp; 96 97 argsize = EBP_reg(context)-ESP_reg(context)-0x40; 98 newstack = (LPBYTE)CURRENT_STACK16 - argsize; 99 oldstack = (LPBYTE)ESP_reg(context); 100 101 memcpy( newstack, oldstack, argsize ); 102 103 for (i = 0; i < 32; i++) /* NOTE: What about > 32 arguments? */ 104 if (mapESPrelative & (1 << i)) 105 { 106 SEGPTR *arg = (SEGPTR *)(newstack + 2*i); 107 *arg = PTR_SEG_OFF_TO_SEGPTR(SELECTOROF(NtCurrentTeb()->cur_stack), 108 OFFSETOF(NtCurrentTeb()->cur_stack) - argsize 109 + (*(LPBYTE *)arg - oldstack)); 110 } 111 112 EAX_reg(context) = Callbacks->CallRegisterShortProc( &context16, argsize ); 113 EDX_reg(context) = HIWORD(EAX_reg(context)); 114 EAX_reg(context) = LOWORD(EAX_reg(context)); 115 116 /* Copy modified buffers back to 32-bit stack */ 117 memcpy( oldstack, newstack, argsize ); 118 #endif 119 } 120 121 /********************************************************************** 122 * FT_ExitNN (KERNEL32.218 - 232) 123 * 124 * One of the FT_ExitNN functions is called at the end of the thunk code. 125 * It removes the stack frame created by FT_Prolog, moves the function 126 * return from EBX to EAX (yes, FT_Thunk did use EAX for the return 127 * value, but the thunk code has moved it from EAX to EBX in the 128 * meantime ... :-), restores the caller's EBX, ESI, and EDI registers, 129 * and perform a return to the CALLER of the thunk code (while removing 130 * the given number of arguments from the caller's stack). 131 */ 132 133 static void FT_Exit(CONTEXT86 *context, int nPopArgs) 134 { 135 dprintf(("FT_Exit - stub\n")); 136 #if 0 137 /* Return value is in EBX */ 138 EAX_reg(context) = EBX_reg(context); 139 140 /* Restore EBX, ESI, and EDI registers */ 141 EBX_reg(context) = *(DWORD *)(EBP_reg(context) - 4); 142 ESI_reg(context) = *(DWORD *)(EBP_reg(context) - 8); 143 EDI_reg(context) = *(DWORD *)(EBP_reg(context) - 12); 144 145 /* Clean up stack frame */ 146 ESP_reg(context) = EBP_reg(context); 147 EBP_reg(context) = stack32_pop(context); 148 149 /* Pop return address to CALLER of thunk code */ 150 EIP_reg(context) = stack32_pop(context); 151 /* Remove arguments */ 152 ESP_reg(context) += nPopArgs; 153 #endif 154 } 155 156 void WINAPI FT_Exit0 (CONTEXT86 *context) { FT_Exit(context, 0); } 157 void WINAPI FT_Exit4 (CONTEXT86 *context) { FT_Exit(context, 4); } 158 void WINAPI FT_Exit8 (CONTEXT86 *context) { FT_Exit(context, 8); } 159 void WINAPI FT_Exit12(CONTEXT86 *context) { FT_Exit(context, 12); } 160 void WINAPI FT_Exit16(CONTEXT86 *context) { FT_Exit(context, 16); } 161 void WINAPI FT_Exit20(CONTEXT86 *context) { FT_Exit(context, 20); } 162 void WINAPI FT_Exit24(CONTEXT86 *context) { FT_Exit(context, 24); } 163 void WINAPI FT_Exit28(CONTEXT86 *context) { FT_Exit(context, 28); } 164 void WINAPI FT_Exit32(CONTEXT86 *context) { FT_Exit(context, 32); } 165 void WINAPI FT_Exit36(CONTEXT86 *context) { FT_Exit(context, 36); } 166 void WINAPI FT_Exit40(CONTEXT86 *context) { FT_Exit(context, 40); } 167 void WINAPI FT_Exit44(CONTEXT86 *context) { FT_Exit(context, 44); } 168 void WINAPI FT_Exit48(CONTEXT86 *context) { FT_Exit(context, 48); } 169 void WINAPI FT_Exit52(CONTEXT86 *context) { FT_Exit(context, 52); } 170 void WINAPI FT_Exit56(CONTEXT86 *context) { FT_Exit(context, 56); } 48 171 /********************************************************************** 49 172 * QT_Thunk (KERNEL32) … … 177 300 return(0); 178 301 } 179 //****************************************************************************** 180 //****************************************************************************** 302 /*********************************************************************** 303 * UnMapSLFixArray (KERNEL32.701) 304 */ 305 void WIN32API UnMapSLFixArray( SEGPTR sptr[], INT length, CONTEXT86 *context ) 306 { 307 /* Must not change EAX, hence defined as 'register' function */ 308 } 309 /********************************************************************** 310 * SMapLS* (KERNEL32) 311 * These functions map linear pointers at [EBP+xxx] to segmented pointers 312 * and return them. 313 * Win95 uses some kind of alias structs, which it stores in [EBP+x] to 314 * unravel them at SUnMapLS. We just store the segmented pointer there. 315 */ 316 static void 317 x_SMapLS_IP_EBP_x(CONTEXT86 *context,int argoff) { 318 DWORD val,ptr; 319 320 val =*(DWORD*)(EBP_reg(context)+argoff); 321 if (val<0x10000) { 322 ptr=val; 323 *(DWORD*)(EBP_reg(context)+argoff) = 0; 324 } else { 325 ptr = MapLS((LPVOID)val); 326 *(DWORD*)(EBP_reg(context)+argoff) = ptr; 327 } 328 EAX_reg(context) = ptr; 329 } 330 331 void WINAPI SMapLS_IP_EBP_8 (CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context, 8);} 332 void WINAPI SMapLS_IP_EBP_12(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,12);} 333 void WINAPI SMapLS_IP_EBP_16(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,16);} 334 void WINAPI SMapLS_IP_EBP_20(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,20);} 335 void WINAPI SMapLS_IP_EBP_24(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,24);} 336 void WINAPI SMapLS_IP_EBP_28(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,28);} 337 void WINAPI SMapLS_IP_EBP_32(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,32);} 338 void WINAPI SMapLS_IP_EBP_36(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,36);} 339 void WINAPI SMapLS_IP_EBP_40(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,40);} 340 341 void WINAPI SMapLS( CONTEXT86 *context ) 342 { 343 if (EAX_reg(context)>=0x10000) { 344 EAX_reg(context) = MapLS((LPVOID)EAX_reg(context)); 345 EDX_reg(context) = EAX_reg(context); 346 } else { 347 EDX_reg(context) = 0; 348 } 349 } 350 351 void WINAPI SUnMapLS( CONTEXT86 *context ) 352 { 353 if (EAX_reg(context)>=0x10000) 354 UnMapLS((SEGPTR)EAX_reg(context)); 355 } 356 357 static void 358 x_SUnMapLS_IP_EBP_x(CONTEXT86 *context,int argoff) { 359 if (*(DWORD*)(EBP_reg(context)+argoff)) 360 UnMapLS(*(DWORD*)(EBP_reg(context)+argoff)); 361 *(DWORD*)(EBP_reg(context)+argoff)=0; 362 } 363 void WINAPI SUnMapLS_IP_EBP_8 (CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context, 8); } 364 void WINAPI SUnMapLS_IP_EBP_12(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,12); } 365 void WINAPI SUnMapLS_IP_EBP_16(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,16); } 366 void WINAPI SUnMapLS_IP_EBP_20(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,20); } 367 void WINAPI SUnMapLS_IP_EBP_24(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,24); } 368 void WINAPI SUnMapLS_IP_EBP_28(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,28); } 369 void WINAPI SUnMapLS_IP_EBP_32(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,32); } 370 void WINAPI SUnMapLS_IP_EBP_36(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,36); } 371 void WINAPI SUnMapLS_IP_EBP_40(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,40); } 372
Note:
See TracChangeset
for help on using the changeset viewer.