Changeset 6278 for trunk/src


Ignore:
Timestamp:
Jul 10, 2001, 7:18:04 AM (24 years ago)
Author:
bird
Message:

New hybrid 16-bit import proc. New import prologs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/win32k/dev32/d32init.c

    r6219 r6278  
    1 /* $Id: d32init.c,v 1.40 2001-07-08 02:56:27 bird Exp $
     1/* $Id: d32init.c,v 1.41 2001-07-10 05:18:04 bird Exp $
    22 *
    33 * d32init.c - 32-bits init routines.
     
    1818#define OVERLOAD32_ENTRY    0x14
    1919#define IMPORT16_ENTRY      0x08
     20#define IMPORTH16_ENTRY     0x08
    2021#define IMPORT32_ENTRY      0x08
    2122#define VARIMPORT_ENTRY     0x10
     
    514515    USHORT  usRc;
    515516
    516     /* VerifyImporTab32 is called before the initroutine! */
     517    /* VerifyImportTab32 is called before the initroutine! */
    517518    pulTKSSBase32 = (PULONG)_TKSSBase16;
    518519
     
    834835        (pach[0] == 0x0f &&  pach[1] == 0xb7 && pach[2] == 0xe4 && !fOverload) /* the next prolog */
    835836        ||
    836         (pach[0] == 0xe8 &&  pach[5] == 0x9d && !fOverload) /* the last prolog */
     837        (pach[0] == 0xe8 &&  pach[5] == 0x9d && !fOverload) /* the next prolog */
     838        /*      push ebx
     839         *      push edi
     840         *      push imm32
     841         */
     842        || (pach[0] == 0x53 &&  pach[1] == 0x57 &&  pach[2] == 0x68 && !fOverload)
     843        /*      push ebx
     844         *      push edi
     845         *      push esi
     846         *      mov /r
     847         */
     848        || (pach[0] == 0x53 &&  pach[1] == 0xe8 && !fOverload)
     849        /*      push ebx
     850         *      push edi
     851         *      push esi
     852         *      mov /r
     853         */
     854        || (pach[0] == 0x53 &&  pach[1] == 0x57 &&  pach[2] == 0x56 &&  pach[3] == 0x8b  && !fOverload)
     855        /*      pop  eax
     856         *      push imm8
     857         *      push eax
     858         *      jmp  imm32
     859         */
     860        ||  (pach[0] == 0x58 &&  pach[1] == 0x6a &&  pach[3] == 0x50 &&  pach[4] == 0xe9  && !fOverload)
     861        /*      push imm32
     862         *      call imm32
     863         */
     864        || (pach[0] == 0x68 && pach[5] == 0xe8 && !fOverload)
    837865        )
    838866    {
     
    874902                    break;
    875903
    876                 /* simple one byte instructions */
    877                 case 0x50:              /* push ax */
    878                 case 0x51:              /* push cx */
    879                 case 0x52:              /* push dx */
    880                 case 0x53:              /* push bx */
    881                 case 0x54:              /* push sp */
    882                 case 0x55:              /* push bp */
    883                 case 0x56:              /* push si */
    884                 case 0x57:              /* push di */
     904                /* simple one byte instructions e*/
     905                case 0x50:              /* push eax */
     906                case 0x51:              /* push ecx */
     907                case 0x52:              /* push edx */
     908                case 0x53:              /* push ebx */
     909                case 0x54:              /* push esp */
     910                case 0x55:              /* push ebp */
     911                case 0x56:              /* push esi */
     912                case 0x57:              /* push edi */
     913                case 0x58:              /* pop  eax */
     914                case 0x59:              /* pop  ecx */
     915                case 0x5a:              /* pop  edx */
     916                case 0x5b:              /* pop  ebx */
    885917                case 0x06:              /* push es */
    886918                case 0x0e:              /* push cs */
     
    917949                case 0xbe:              /* mov esi, imm32 */
    918950                case 0xbf:              /* mov edi, imm32 */
     951                case 0xe9:              /* jmp rel32 */
    919952                case 0x2d:              /* sub eax, imm32 */
    920953                case 0x35:              /* xor eax, imm32 */
     
    10131046    else
    10141047    {
    1015         kprintf(("interpretFunctionProlog32: unknown prolog start. 0x%x 0x%x 0x%x 0x%x 0x%x\n",
    1016                  pach[0], pach[1], pach[2], pach[3], pach[4]));
     1048        kprintf(("interpretFunctionProlog32: unknown prolog start. 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
     1049                 pach[0], pach[1], pach[2], pach[3], pach[4], pach[5]));
    10171050        cb = 0;
    10181051    }
     
    11811214                    break;
    11821215
     1216                case 0x9a:              /* call ptr16:16 */
     1217                    cb += cb2 = 4;
     1218                    pach += cb2;
     1219                    break;
    11831220
    11841221                default:
     
    12731310        #endif
    12741311
    1275         switch (aImportTab[i].fType & ~(EPT_BIT_MASK | EPT_NOT_REQ | EPT_WRAPPED))
     1312        switch (aImportTab[i].fType & ~(EPT_BIT_MASK | EPT_NOT_REQ | EPT_WRAPPED | EPT_PROCIMPORTH))
    12761313        {
    12771314            case EPT_PROC:
     
    15521589
    15531590            /*
     1591             * 16-bit imported hybrid procedure.
     1592             * This is called by issuing a far call to the 16-bit calltab entry.
     1593             */
     1594            case EPT_PROCIMPORTH16:
     1595            {
     1596                cb = interpretFunctionProlog16((char*)aImportTab[i].ulAddress, FALSE);
     1597                aImportTab[i].cbProlog = (char)cb;
     1598                if (cb > 0) /* Since no prolog part is copied to the function table, it's ok as long as the prolog has been recognzied. */
     1599                {
     1600                    /*
     1601                     * Create far jump from calltab to original function.
     1602                     * 0xEA <four byte target address> <two byte target selector>
     1603                     */
     1604                    pchCTEntry16[0] = 0xEA; /* jmp far ptr */
     1605                    *(unsigned short*)(void*)&pchCTEntry16[1] = aImportTab[i].offObject;
     1606                    *(unsigned short*)(void*)&pchCTEntry16[3] = aImportTab[i].usSel;
     1607                }
     1608                else
     1609                {   /* !fatal! - this should never really happen... */
     1610                    kprintf(("ImportTabInit: FATAL verify failed for procedure no.%d when importing it!\n", i));
     1611                    Int3(); /* ipe - later! */
     1612                    x86RestoreWriteProtect(flWP);
     1613                    return ERROR_D32_IPE | (i << ERROR_D32_PROC_SHIFT) | ERROR_D32_PROC_FLAG;
     1614                }
     1615                pchCTEntry16 += IMPORTH16_ENTRY;
     1616                break;
     1617            }
     1618
     1619
     1620            /*
    15541621             * 16/32-bit importe variable.
    15551622             * This is used by accessing the 32-bit flat address in the callTab.
Note: See TracChangeset for help on using the changeset viewer.