Changeset 2678 for trunk/src


Ignore:
Timestamp:
Feb 7, 2000, 11:36:16 PM (26 years ago)
Author:
sandervl
Message:

CB: Ported Wine thunk apis

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:28 sandervl Exp $
     1; $Id: KERNEL32.DEF,v 1.70 2000-02-07 22:36:15 sandervl Exp $
    22
    33;Created by BLAST for IBM's compiler
     
    142142
    143143;;Not supported; just present
    144      LoadLibrary16              = _LoadLibrary16@4                @35
    145      FreeLibrary16              = _FreeLibrary16@4                @36
     144     LoadLibrary16              = _LoadLibrary16@4                @35
     145     FreeLibrary16              = _FreeLibrary16@4                @36
    146146     GetProcAddress16           = _GetProcAddress16@8             @37
    147147
     
    284284;    ExpungeConsoleCommandHistoryW = _ExpungeConsoleCommandHistoryW@??   ;NT
    285285;    ExtendVirtualBuffer        = _ExtendVirtualBuffer@??                ;NT
    286 ;    FT_Exit0                   = _FT_Exit0@??                    @218   ;W95
    287 ;    FT_Exit12                  = _FT_Exit12@??                   @219   ;W95
    288 ;    FT_Exit16                  = _FT_Exit16@??                   @220   ;W95
    289 ;    FT_Exit20                  = _FT_Exit20@??                   @221   ;W95
    290 ;    FT_Exit24                  = _FT_Exit24@??                   @222   ;W95
    291 ;    FT_Exit28                  = _FT_Exit28@??                   @223   ;W95
    292 ;    FT_Exit32                  = _FT_Exit32@??                   @224   ;W95
    293 ;    FT_Exit36                  = _FT_Exit36@??                   @225   ;W95
    294 ;    FT_Exit4                   = _FT_Exit4@??                    @226   ;W95
    295 ;    FT_Exit40                  = _FT_Exit40@??                   @227   ;W95
    296 ;    FT_Exit44                  = _FT_Exit44@??                   @228   ;W95
    297 ;    FT_Exit48                  = _FT_Exit48@??                   @229   ;W95
    298 ;    FT_Exit52                  = _FT_Exit52@??                   @230   ;W95
    299 ;    FT_Exit56                  = _FT_Exit56@??                   @231   ;W95
    300 ;    FT_Exit8                   = _FT_Exit8@??                    @232   ;W95
    301 ;    FT_Prolog                  = _FT_Prolog@??                   @233   ;W95
    302 ;    FT_Thunk                   = _FT_Thunk@??                    @234   ;W95
     286     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
    303303     FatalAppExitA              = _FatalAppExitA@8                @235
    304304     FatalAppExitW              = _FatalAppExitW@8                @236
     
    716716    RtlUnwind                  = RtlUnwindAsm                   @590
    717717    RtlZeroMemory              = _RtlZeroMemory@8            @591
    718 ;   SMapLS                     = _SMapLS@4                   @592       ;W95
    719 ;   SMapLS_IP_EBP_12           = _SMapLS_IP_EBP_12@??        @593       ;W95
    720 ;   SMapLS_IP_EBP_16           = _SMapLS_IP_EBP_16@??        @594       ;W95
    721 ;   SMapLS_IP_EBP_20           = _SMapLS_IP_EBP_20@??        @595       ;W95
    722 ;   SMapLS_IP_EBP_24           = _SMapLS_IP_EBP_24@??        @596       ;W95
    723 ;   SMapLS_IP_EBP_28           = _SMapLS_IP_EBP_28@??        @597       ;W95
    724 ;   SMapLS_IP_EBP_32           = _SMapLS_IP_EBP_32@??        @598       ;W95
    725 ;   SMapLS_IP_EBP_36           = _SMapLS_IP_EBP_36@??        @599       ;W95
    726 ;   SMapLS_IP_EBP_40           = _SMapLS_IP_EBP_40@??        @600       ;W95
    727 ;   SMapLS_IP_EBP_8            = _SMapLS_IP_EBP_8@??         @601       ;W95
    728 ;   SUnMapLS                   = _SUnMapLS@??                @602       ;W95
    729 ;   SUnMapLS_IP_EBP_12         = _SUnMapLS_IP_EBP_12@??      @603       ;W95
    730 ;   SUnMapLS_IP_EBP_16         = _SUnMapLS_IP_EBP_16@??      @604       ;W95
    731 ;   SUnMapLS_IP_EBP_20         = _SUnMapLS_IP_EBP_20@??      @605       ;W95
    732 ;   SUnMapLS_IP_EBP_24         = _SUnMapLS_IP_EBP_24@??      @606       ;W95
    733 ;   SUnMapLS_IP_EBP_28         = _SUnMapLS_IP_EBP_28@??      @607       ;W95
    734 ;   SUnMapLS_IP_EBP_32         = _SUnMapLS_IP_EBP_32@??      @608       ;W95
    735 ;   SUnMapLS_IP_EBP_36         = _SUnMapLS_IP_EBP_36@??      @609       ;W95
    736 ;   SUnMapLS_IP_EBP_40         = _SUnMapLS_IP_EBP_40@??      @610       ;W95
    737 ;   SUnMapLS_IP_EBP_8          = _SUnMapLS_IP_EBP_8@??       @611       ;W95
     718    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
    738738    ScrollConsoleScreenBufferA  = _ScrollConsoleScreenBufferA@20 @612
    739739    ScrollConsoleScreenBufferW  = _ScrollConsoleScreenBufferW@20 @613
     
    853853;   UTRegister                 = _UTRegister@??              @698       ;W95
    854854;   UTUnRegister               = _UTUnRegister@??            @699       ;W95
    855 ;   UnMapLS                    = _UnMapLS@??                 @700       ;W95
    856 ;   UnMapSLFixArray            = _UnMapSLFixArray@??         @701       ;W95
     855    UnMapLS                    = _UnMapLS@4                  @700       ;W95
     856    UnMapSLFixArray            = _UnMapSLFixArray@12         @701       ;W95
    857857    UnhandledExceptionFilter   = _UnhandledExceptionFilter@4 @702
    858858    UninitializeCriticalSection  = _UninitializeCriticalSection@4 @703  ;W95
     
    10261026   HMHandleGetUserData__FUl                                       @1263
    10271027
    1028    _GetThreadTEB@0                                                @1234
    1029    _GetThreadTHDB@0                                               @1235
    1030    _GetTHDBFromThreadId@4                                         @1255
     1028   _GetThreadTEB@0                                                @1234
     1029   _GetThreadTHDB@0                                               @1235
     1030   _GetTHDBFromThreadId@4                                         @1255
    10311031   _GetTHDBFromThreadHandle@4                                     @1256
    10321032
     
    10791079    GetDisplayCodepage__Fv                  @3000
    10801080    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
    83/*
    94 * Win32 thunking API functions (mostly stubs)
     
    1712 * Copyright 1997-1998 Marcus Meissner
    1813 * Copyright 1998      Ulrich Weigand
     14 * Copyright 1995 Alexandre Julliard
     15 *
     16 * Project Odin Software License can be found in LICENSE.TXT
     17 *
    1918 */
    2019#include <os2win.h>
     
    3130  return((DWORD)address);
    3231}
     32/***********************************************************************
     33 *           UnMapLS   (KERNEL32.700)
     34 *
     35 * Free mapped selector.
     36 */
     37void 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}
    3345//******************************************************************************
    3446//******************************************************************************
     
    4456  dprintf(("FT_Prolog - stub\n"));
    4557}
    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 */
     78void 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
     133static 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
     156void WINAPI FT_Exit0 (CONTEXT86 *context) { FT_Exit(context,  0); }
     157void WINAPI FT_Exit4 (CONTEXT86 *context) { FT_Exit(context,  4); }
     158void WINAPI FT_Exit8 (CONTEXT86 *context) { FT_Exit(context,  8); }
     159void WINAPI FT_Exit12(CONTEXT86 *context) { FT_Exit(context, 12); }
     160void WINAPI FT_Exit16(CONTEXT86 *context) { FT_Exit(context, 16); }
     161void WINAPI FT_Exit20(CONTEXT86 *context) { FT_Exit(context, 20); }
     162void WINAPI FT_Exit24(CONTEXT86 *context) { FT_Exit(context, 24); }
     163void WINAPI FT_Exit28(CONTEXT86 *context) { FT_Exit(context, 28); }
     164void WINAPI FT_Exit32(CONTEXT86 *context) { FT_Exit(context, 32); }
     165void WINAPI FT_Exit36(CONTEXT86 *context) { FT_Exit(context, 36); }
     166void WINAPI FT_Exit40(CONTEXT86 *context) { FT_Exit(context, 40); }
     167void WINAPI FT_Exit44(CONTEXT86 *context) { FT_Exit(context, 44); }
     168void WINAPI FT_Exit48(CONTEXT86 *context) { FT_Exit(context, 48); }
     169void WINAPI FT_Exit52(CONTEXT86 *context) { FT_Exit(context, 52); }
     170void WINAPI FT_Exit56(CONTEXT86 *context) { FT_Exit(context, 56); }
    48171/**********************************************************************
    49172 *      QT_Thunk            (KERNEL32)
     
    177300  return(0);
    178301}
    179 //******************************************************************************
    180 //******************************************************************************
     302/***********************************************************************
     303 *           UnMapSLFixArray   (KERNEL32.701)
     304 */
     305void 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 */
     316static void
     317x_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
     331void WINAPI SMapLS_IP_EBP_8 (CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context, 8);}
     332void WINAPI SMapLS_IP_EBP_12(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,12);}
     333void WINAPI SMapLS_IP_EBP_16(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,16);}
     334void WINAPI SMapLS_IP_EBP_20(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,20);}
     335void WINAPI SMapLS_IP_EBP_24(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,24);}
     336void WINAPI SMapLS_IP_EBP_28(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,28);}
     337void WINAPI SMapLS_IP_EBP_32(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,32);}
     338void WINAPI SMapLS_IP_EBP_36(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,36);}
     339void WINAPI SMapLS_IP_EBP_40(CONTEXT86 *context) {x_SMapLS_IP_EBP_x(context,40);}
     340
     341void 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
     351void WINAPI SUnMapLS( CONTEXT86 *context )
     352{
     353    if (EAX_reg(context)>=0x10000)
     354        UnMapLS((SEGPTR)EAX_reg(context));
     355}
     356
     357static void
     358x_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}
     363void WINAPI SUnMapLS_IP_EBP_8 (CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context, 8); }
     364void WINAPI SUnMapLS_IP_EBP_12(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,12); }
     365void WINAPI SUnMapLS_IP_EBP_16(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,16); }
     366void WINAPI SUnMapLS_IP_EBP_20(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,20); }
     367void WINAPI SUnMapLS_IP_EBP_24(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,24); }
     368void WINAPI SUnMapLS_IP_EBP_28(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,28); }
     369void WINAPI SUnMapLS_IP_EBP_32(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,32); }
     370void WINAPI SUnMapLS_IP_EBP_36(CONTEXT86 *context) { x_SUnMapLS_IP_EBP_x(context,36); }
     371void 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.