Ignore:
Timestamp:
Feb 23, 2001, 3:57:55 AM (25 years ago)
Author:
bird
Message:

Calltable fixes. Handle event. New 14062e kernels.

File:
1 edited

Legend:

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

    r5224 r5247  
    1 /* $Id: d32init.c,v 1.37 2001-02-21 07:44:57 bird Exp $
     1/* $Id: d32init.c,v 1.38 2001-02-23 02:57:53 bird Exp $
    22 *
    33 * d32init.c - 32-bits init routines.
     
    1515 * Calltab entry sizes.
    1616 */
    17 #define OVERLOAD16_ENTRY    0x18
     17#define OVERLOAD16_ENTRY    0x18        /* This is intentionally 4 bytes larger than the one defined in calltaba.asm. */
    1818#define OVERLOAD32_ENTRY    0x14
    1919#define IMPORT16_ENTRY      0x08
     
    2424    #define kprintf2(a) kprintf
    2525#else
    26     #define kprintf2(a) {}//
     26    #define kprintf2(a) (void)0
    2727#endif
    2828
     
    5656#ifdef R3TST
    5757    #include "test.h"
     58    #define x86DisableWriteProtect() 0
     59    #define x86RestoreWriteProtect(a) (void)0
    5860#endif
    5961
     
    9698/* extern(s) located in calltab.asm */
    9799extern char     callTab[1];
     100extern char     callTab16[1];
    98101extern unsigned auFuncs[NBR_OF_KRNLIMPORTS];
    99102
     
    415418
    416419    /* callgate */
     420    #ifndef R3TST
    417421    if ((rc = InitCallGate()) != NO_ERROR)
    418422    {
     
    420424        return (USHORT)rc;
    421425    }
     426    #endif
    422427
    423428
     
    442447    if (rc != NO_ERROR)
    443448        kprintf(("data segment lock failed with with rc=%d\n", rc));
    444 
    445     /* 16-bit data segment - is this really necessary? - no!!! */
    446     #if 0 /* This should not be necessary!!! it's allocated from the kernel resident heap if I am not much mistaken. */
    447     memset(SSToDS(&lockhandle), 0, sizeof(lockhandle));
    448     rc = D32Hlp_VMLock2(&DATA16START,
    449                         &DATA16END - &DATA16START,
    450                         VMDHL_LONG | VMDHL_WRITE,
    451                         SSToDS(&lockhandle));
    452     if (rc != NO_ERROR)
    453         kprintf(("16-bit data segment lock failed with with rc=%d\n", rc));
    454     #endif
    455449
    456450    return NO_ERROR;
     
    10271021     * Check for the well known prolog (the only that is supported now)
    10281022     * which is:
    1029      *     push 2
    10301023     */
    1031     if (*pach == 0x6A)                  /* push 2 (don't check for the 2) */
     1024    if ((*pach == 0x6A && !fOverload)       /* push 2 (don't check for the 2) */
     1025        ||
     1026        *pach == 0x60                       /* pushf */
     1027        ||
     1028        (*pach == 0x53 && pach[1] == 0x51)  /* push bx, push cx */
     1029        ||
     1030        (*pach == 0x8c && pach[1] == 0xd8)  /* mov ax, ds */
     1031        ||
     1032        (*pach == 0xb8)                     /* mov ax, imm16 */
     1033        )
    10321034    {
    10331035        BOOL fForce;
    10341036        int  cOpPrefix = 0;
    10351037        cb = 0;
    1036         while (cb < 8 || fForce)        /* 8 is the size of a 66h prefixed far jump instruction. */
     1038        while (cb < 5  || fForce)       /* 5 is the size of a 16:16 far jump instruction. */
    10371039        {
    10381040            int cb2;
     
    10641066                case 0x56:              /* push si */
    10651067                case 0x57:              /* push di */
     1068                case 0x60:              /* pusha */
     1069                    break;
     1070
     1071                /* simple three byte instructions */
     1072                case 0xb8:              /* mov eax, imm16 */
     1073                case 0xb9:              /* mov ecx, imm16 */
     1074                case 0xba:              /* mov edx, imm16 */
     1075                case 0xbb:              /* mov ebx, imm16 */
     1076                case 0xbc:              /* mov esx, imm16 */
     1077                case 0xbd:              /* mov ebx, imm16 */
     1078                case 0xbe:              /* mov esi, imm16 */
     1079                case 0xbf:              /* mov edi, imm16 */
     1080                case 0x2d:              /* sub eax, imm16 */
     1081                case 0x35:              /* xor eax, imm16 */
     1082                case 0x3d:              /* cmp eax, imm16 */
     1083                case 0x68:              /* push <dword> */
     1084                case 0xa1:              /* mov eax, moffs16 */
     1085                case 0xa3:              /* mov moffs16, eax */
     1086                    if (cOpPrefix > 0)  /* FIXME see 32-bit interpreter. */
     1087                    {
     1088                        pach += 2;
     1089                        cb += 2;
     1090                    }
     1091                    pach += 2;
     1092                    cb += 2;
    10661093                    break;
    10671094
     
    10831110
    10841111                case 0x6a:              /* push <byte> */
     1112                case 0x3c:              /* mov al, imm8 */
    10851113                    pach++;
    10861114                    cb++;
    10871115                    break;
    10881116
    1089                 case 0x68:              /* push <word> */
    1090                     if (cOpPrefix > 0)
    1091                     {
    1092                         pach += 2;
    1093                         cb += 2;
    1094                     }
    1095                     pach += 2;
    1096                     cb += 2;
    1097                     break;
    1098 
    10991117                case 0x8b:              /* mov /r */
     1118                case 0x8c:              /* mov r/m16,Sreg  (= mov /r) */
     1119                case 0x8e:              /* mov Sreg, r/m16 (= mov /r) */
    11001120                    if ((pach[1] & 0xc0) == 0x80  /* ex. mov ax,bp+1114h */
    11011121                        || ((pach[1] & 0xc0) == 0 && (pach[1] & 0x7) == 6)) /* ex. mov bp,0ff23h */
     
    11501170        }
    11511171    }
     1172    else
     1173        kprintf(("interpretFunctionProlog16: unknown prolog 0x%x 0x%x 0x%x\n", pach[0], pach[1], pach[2]));
     1174
    11521175
    11531176    fOverload = fOverload;
     
    12431266                {
    12441267                    cb = interpretFunctionProlog16((char*)aImportTab[i].ulAddress, EPT16Proc(aImportTab[i]));
    1245                     cbmax = OVERLOAD16_ENTRY - 7; /* 7 = Size of the far jump instruction */
     1268                    cbmax = OVERLOAD16_ENTRY - 5; /* 5 = Size of the jump instruction */
    12461269                }
    12471270
     
    12511274                if (cb <= 0 || cb > cbmax)
    12521275                {   /* failed, too small or too large. */
    1253                     kprintf(("VerifyImportTab32: verify failed for procedure no.%d (cb=%d), %s\n", i, cb, aImportTab[i].achName));
     1276                    kprintf(("VerifyImportTab32/16: verify failed for procedure no.%d (cb=%d), %s\n", i, cb, aImportTab[i].achName));
    12541277                    return (USHORT)(ERROR_D32_TOO_INVALID_PROLOG | (i << ERROR_D32_PROC_SHIFT) | ERROR_D32_PROC_FLAG);
    12551278                }
     
    12811304    int     cb;
    12821305    int     cbmax;
    1283     char *  pchCTEntry;                 /* Pointer to current calltab entry. */
     1306    char *  pchCTEntry;                 /* Pointer to current 32-bit calltab entry. */
     1307    char *  pchCTEntry16;               /* Pointer to current 16-bit calltab entry. */
    12841308    ULONG   flWP;                       /* CR0 WP flag restore value. */
    12851309
     
    13241348        {
    13251349            cb = interpretFunctionProlog16((char*)aImportTab[i].ulAddress, EPT16Proc(aImportTab[i]));
    1326             cbmax = OVERLOAD16_ENTRY - 7; /* 7 = Size of the far jump instruction */
     1350            cbmax = OVERLOAD16_ENTRY - 5; /* 5 = Size of the jump instruction */
    13271351        }
    13281352        if (cb <= 0 || cb > cbmax)
     
    13371361     */
    13381362    pchCTEntry = &callTab[0];
     1363    pchCTEntry16 = &callTab16[0];
    13391364    flWP = x86DisableWriteProtect();
    13401365    for (i = 0; i < NBR_OF_KRNLIMPORTS; i++)
     
    13911416            case EPT_PROC16:
    13921417            {
    1393                 kprintf(("ImportTabInit: Overloading 16-bit procedures are not supported yet!!! Calltable in 32-bit segment!\n", i));
    1394                 Int3();
    1395 
    13961418                cb = interpretFunctionProlog16((char*)aImportTab[i].ulAddress, TRUE);
    13971419                aImportTab[i].cbProlog = (char)cb;
    1398                 if (cb >= 8 && cb + 7 < OVERLOAD16_ENTRY) /* 8: size of a 16:32 jump which jumps to my overloading function (prefixed with 66h in a 16-bit segment) */
    1399                 {                                         /* 7: size of a 16:32 jump which is added to the call tab */
     1420                if (cb >= 5 && cb + 5 < OVERLOAD16_ENTRY) /* 5:    size of a 16:16 jump which jumps to my overloading function */
     1421                {                                         /* cb+5: size of a 16:16 jump which is added to the call tab */
    14001422                    /*
    14011423                     * Copy function prolog which is to be overwritten.
    14021424                     */
    1403                     memcpy(pchCTEntry, (void*)aImportTab[i].ulAddress, (size_t)cb);
     1425                    memcpy(pchCTEntry16, (void*)aImportTab[i].ulAddress, (size_t)cb);
    14041426
    14051427                    /*
    14061428                     * Create far jump from calltab to original function.
    1407                      * 0xEA <four byte target address> <two byte target selector>
     1429                     * 0xEA <two byte target address> <two byte target selector>
    14081430                     */
    1409                     pchCTEntry[cb] = 0xEA; /* jmp far ptr */
    1410                     *(unsigned long*)(void*)&pchCTEntry[cb+1] = aImportTab[i].offObject;
    1411                     *(unsigned short*)(void*)&pchCTEntry[cb+5] = aImportTab[i].usSel;
     1431                    pchCTEntry16[cb] = 0xEA; /* jmp far ptr */
     1432                    *(unsigned short*)(void*)&pchCTEntry16[cb+1] = (unsigned short)aImportTab[i].offObject + cb;
     1433                    *(unsigned short*)(void*)&pchCTEntry16[cb+3] = aImportTab[i].usSel;
     1434
     1435                    /*
     1436                     * We store the far 16:16 pointer to the function in the last four
     1437                     * bytes of the entry. Set them!
     1438                     */
     1439                    *(unsigned short*)(void*)&pchCTEntry16[OVERLOAD16_ENTRY-4] = (unsigned short)aImportTab[i].offObject;
     1440                    *(unsigned short*)(void*)&pchCTEntry16[OVERLOAD16_ENTRY-2] = aImportTab[i].usSel;
    14121441
    14131442                    /*
    14141443                     * jump from original function to my function - an cli(?) could be needed here
    1415                      * 0x66 0xEA <four byte target address> <two byte target selector>
     1444                     * 0xEA <two byte target address> <two byte target selector>
    14161445                     */
    1417                     *(char*)(aImportTab[i].ulAddress    ) = 0x66;    /* operandsize prefix */
    1418                     *(char*)(aImportTab[i].ulAddress + 1) = 0xEA;    /* jmp far ptr */
    1419                     *(unsigned long*)(aImportTab[i].ulAddress + 2) = auFuncs[i];   /* FIXME? */
    1420                     *(unsigned short*)(aImportTab[i].ulAddress + 6) = _R0FlatCS16; /* FIXME */
     1446                    *(char*)(aImportTab[i].ulAddress) = 0xEA;    /* jmp far ptr */
     1447                    *(unsigned long*)(aImportTab[i].ulAddress + 1) = auFuncs[i]; /* The auFuncs entry is a far pointer. */
    14211448                }
    14221449                else
     
    14271454                    return ERROR_D32_IPE | (i << ERROR_D32_PROC_SHIFT) | ERROR_D32_PROC_FLAG;
    14281455                }
    1429                 pchCTEntry += OVERLOAD16_ENTRY;
     1456                pchCTEntry16 += OVERLOAD16_ENTRY;
    14301457                break;
    14311458            }
Note: See TracChangeset for help on using the changeset viewer.