VirtualBox

Changeset 70341 in vbox for trunk/src/VBox/Runtime/r0drv/nt


Ignore:
Timestamp:
Dec 26, 2017 2:42:28 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119941
Message:

IPRT: More NT 3.1 compatibility tweaking.

Location:
trunk/src/VBox/Runtime/r0drv/nt
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp

    r70336 r70341  
    9393/** KeSetTargetProcessorDpc - Introducted in NT 3.51. */
    9494decltype(KeSetTargetProcessorDpc)      *g_pfnrtKeSetTargetProcessorDpc;
     95/** KeInitializeTimerEx - Introduced in NT 4. */
     96decltype(KeInitializeTimerEx)          *g_pfnrtKeInitializeTimerEx;
    9597/** Pointer to the MmProtectMdlSystemAddress kernel function if it's available.
    9698 * This API was introduced in XP. */
     
    303305    GET_SYSTEM_ROUTINE(KeSetImportanceDpc);
    304306    GET_SYSTEM_ROUTINE(KeSetTargetProcessorDpc);
     307    GET_SYSTEM_ROUTINE(KeInitializeTimerEx);
    305308    GET_SYSTEM_ROUTINE(MmProtectMdlSystemAddress);
    306309    GET_SYSTEM_ROUTINE(MmAllocatePagesForMdl);
  • trunk/src/VBox/Runtime/r0drv/nt/internal-r0drv-nt.h

    r70336 r70341  
    8484extern decltype(KeSetImportanceDpc)           *g_pfnrtKeSetImportanceDpc;
    8585extern decltype(KeSetTargetProcessorDpc)      *g_pfnrtKeSetTargetProcessorDpc;
     86extern decltype(KeInitializeTimerEx)          *g_pfnrtKeInitializeTimerEx;
    8687extern decltype(MmProtectMdlSystemAddress)    *g_pfnrtMmProtectMdlSystemAddress;
    8788extern decltype(MmAllocatePagesForMdl)        *g_pfnrtMmAllocatePagesForMdl;
  • trunk/src/VBox/Runtime/r0drv/nt/nt3fakes-r0drv-nt.cpp

    r70336 r70341  
    9696decltype(KfAcquireSpinLock)                *g_pfnrtKfAcquireSpinLock;
    9797decltype(KfReleaseSpinLock)                *g_pfnrtKfReleaseSpinLock;
     98decltype(KefAcquireSpinLockAtDpcLevel)     *g_pfnrtKefAcquireSpinLockAtDpcLevel;
     99decltype(KefReleaseSpinLockFromDpcLevel)   *g_pfnrtKefReleaseSpinLockFromDpcLevel;
    98100decltype(KfLowerIrql)                      *g_pfnrtKfLowerIrql;
    99101decltype(KfRaiseIrql)                      *g_pfnrtKfRaiseIrql;
     
    104106KIRQL                           (__stdcall *g_pfnrtKeAcquireSpinLock)(PKSPIN_LOCK);
    105107VOID                            (__stdcall *g_pfnrtKeReleaseSpinLock)(PKSPIN_LOCK, KIRQL);
     108KIRQL                           (__stdcall *g_pfnrtKeAcquireSpinLockAtDpcLevel)(PKSPIN_LOCK);
     109VOID                            (__stdcall *g_pfnrtKeReleaseSpinLockFromDpcLevel)(PKSPIN_LOCK);
    106110VOID                            (__stdcall *g_pfnrtKeLowerIrql)(KIRQL);
    107111KIRQL                           (__stdcall *g_pfnrtKeRaiseIrql)(KIRQL);
     
    468472    uint32_t cbRm = 1;
    469473
    470     if (   (bRm & X86_MODRM_MOD_MASK) == 3
     474    if (   (bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT)
    471475        || (bRm & (X86_MODRM_MOD_MASK | X86_MODRM_RM_MASK)) == 5)
    472476        cbRm += 4; /* disp32 */
    473     else if ((bRm & X86_MODRM_MOD_MASK) == 1)
     477    else if ((bRm & X86_MODRM_MOD_MASK) == (1 << X86_MODRM_MOD_SHIFT))
    474478        cbRm += 1; /* disp8 */
    475     else if ((bRm & X86_MODRM_MOD_MASK) == 2)
     479    else if ((bRm & X86_MODRM_MOD_MASK) == (2 << X86_MODRM_MOD_SHIFT))
    476480        cbRm += 2; /* disp16 */
    477481
    478     if ((bRm & X86_MODRM_RM_MASK) == 4 && (bRm & X86_MODRM_MOD_MASK) != 3)
     482    if ((bRm & X86_MODRM_RM_MASK) == 4 && (bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
    479483        cbRm += 1; /* SIB */
    480484
     
    515519            AssertLogRelReturn(RT_CONCAT(g_pfnrt,a_fnFastcall) || RT_CONCAT(g_pfnrt,a_fnStdcall), VERR_INTERNAL_ERROR_3); \
    516520        } while (0)
    517     GET_FAST_CALL_SYSTEM_ROUTINE(IofCompleteRequest,   IoCompleteRequest);
    518     GET_FAST_CALL_SYSTEM_ROUTINE(ObfDereferenceObject, ObDereferenceObject);
    519     GET_FAST_CALL_SYSTEM_ROUTINE(IofCallDriver,        IofCallDriver);
    520     GET_FAST_CALL_SYSTEM_ROUTINE(KfAcquireSpinLock,    KeAcquireSpinLock);
    521     GET_FAST_CALL_SYSTEM_ROUTINE(KfReleaseSpinLock,    KeReleaseSpinLock);
    522     GET_FAST_CALL_SYSTEM_ROUTINE(KfLowerIrql,          KeLowerIrql);
    523     GET_FAST_CALL_SYSTEM_ROUTINE(KfRaiseIrql,          KeRaiseIrql);
     521    GET_FAST_CALL_SYSTEM_ROUTINE(IofCompleteRequest,                IoCompleteRequest);
     522    GET_FAST_CALL_SYSTEM_ROUTINE(ObfDereferenceObject,              ObDereferenceObject);
     523    GET_FAST_CALL_SYSTEM_ROUTINE(IofCallDriver,                     IoCallDriver);
     524    GET_FAST_CALL_SYSTEM_ROUTINE(KfAcquireSpinLock,                 KeAcquireSpinLock);
     525    GET_FAST_CALL_SYSTEM_ROUTINE(KfReleaseSpinLock,                 KeReleaseSpinLock);
     526    GET_FAST_CALL_SYSTEM_ROUTINE(KfLowerIrql,                       KeLowerIrql);
     527    GET_FAST_CALL_SYSTEM_ROUTINE(KfRaiseIrql,                       KeRaiseIrql);
     528    GET_FAST_CALL_SYSTEM_ROUTINE(KefAcquireSpinLockAtDpcLevel,      KeAcquireSpinLockAtDpcLevel);
     529    GET_FAST_CALL_SYSTEM_ROUTINE(KefReleaseSpinLockFromDpcLevel,    KeReleaseSpinLockFromDpcLevel);
    524530
    525531    /*
     
    541547    if (!_imp__KeTickCount)
    542548    {
     549        if (!g_fNt3VersionInitialized)
     550            rtR0Nt3InitVersion();
    543551        Assert(g_uNt3MajorVer == 3 && g_uNt3MinorVer < 50);
     552
    544553        uint8_t const *pbCode = (uint8_t const *)RTR0DbgKrnlInfoGetSymbol(hKrnlInfo, NULL, "KeQueryTickCount");
    545554        AssertLogRelReturn(pbCode, VERR_INTERNAL_ERROR_2);
     
    550559            switch (b1)
    551560            {
    552                 case 0x89:
    553                     /* mov reg, r/m     ; We're looking for absolute address in r/m. */
     561                case 0x8b: /* mov reg, r/m     ; We're looking for absolute address in r/m. */
    554562                    if ((pbCode[off] & (X86_MODRM_MOD_MASK | X86_MODRM_RM_MASK)) == 5 /*disp32*/)
    555563                        _imp__KeTickCount = *(KSYSTEM_TIME **)&pbCode[off + 1];
    556564                    RT_FALL_THRU();
    557                 case 0x8b:
     565                case 0x89: /* mov r/m, reg */
    558566                    off += rtR0Nt3CalcModRmLength(pbCode[off]);
    559567                    break;
  • trunk/src/VBox/Runtime/r0drv/nt/nt3fakesA-r0drv-nt.asm

    r70336 r70341  
    7777; @param 2  The stdcall name.
    7878; @param 3  Byte size of arguments.
    79 %macro FastOrStdCallWrapper 3
     79; @param 4  Zero if 1:1 mapping;
     80;           One if 2nd parameter is a byte pointer that the farcall version
     81;           instead returns in al.
     82%macro FastOrStdCallWrapper 4
    8083BEGINCODE
    8184extern _g_pfnrt %+ %1
     
    9194        push    ebp
    9295        mov     ebp, esp
     96%if %4 == 1
     97        push    dword 0
     98        push    esp
     99%else
    93100        push    edx
     101%endif
    94102        push    ecx
    95103        call    [_g_pfnrt %+ %2]
     104%if %4 == 1
     105        movzx   eax, byte [ebp - 4]
     106%endif
    96107        leave
    97108        ret
     
    107118%endmacro
    108119
    109 FastOrStdCallWrapper IofCompleteRequest, IoCompleteRequest, 8
    110 FastOrStdCallWrapper IofCallDriver, IoCallDriver, 8
    111 FastOrStdCallWrapper ObfDereferenceObject, ObDereferenceObject, 4
    112 FastOrStdCallWrapper KfAcquireSpinLock, KeAcquireSpinLock, 4
    113 FastOrStdCallWrapper KfReleaseSpinLock, KeReleaseSpinLock, 8
    114 FastOrStdCallWrapper KfLowerIrql, KeLowerIrql, 4
    115 FastOrStdCallWrapper KfRaiseIrql, KeRaiseIrql, 4
     120FastOrStdCallWrapper IofCompleteRequest,            IoCompleteRequest,              8, 0
     121FastOrStdCallWrapper IofCallDriver,                 IoCallDriver,                   8, 0
     122FastOrStdCallWrapper ObfDereferenceObject,          ObDereferenceObject,            4, 0
     123FastOrStdCallWrapper KfAcquireSpinLock,             KeAcquireSpinLock,              4, 1
     124FastOrStdCallWrapper KfReleaseSpinLock,             KeReleaseSpinLock,              8, 0
     125FastOrStdCallWrapper KfRaiseIrql,                   KeRaiseIrql,                    4, 1
     126FastOrStdCallWrapper KfLowerIrql,                   KeLowerIrql,                    4, 0
     127FastOrStdCallWrapper KefAcquireSpinLockAtDpcLevel,  KeAcquireSpinLockAtDpcLevel,    4, 0
     128FastOrStdCallWrapper KefReleaseSpinLockFromDpcLevel,KeReleaseSpinLockFromDpcLevel,  4, 0
    116129
    117130
  • trunk/src/VBox/Runtime/r0drv/nt/timer-r0drv-nt.cpp

    r70212 r70341  
    510510    pTimer->pvUser = pvUser;
    511511    pTimer->u64NanoInterval = u64NanoInterval;
    512     KeInitializeTimerEx(&pTimer->NtTimer, SynchronizationTimer);
     512    if (g_pfnrtKeInitializeTimerEx)
     513        g_pfnrtKeInitializeTimerEx(&pTimer->NtTimer, SynchronizationTimer);
     514    else
     515        KeInitializeTimer(&pTimer->NtTimer);
    513516    int rc = VINF_SUCCESS;
    514517    if (pTimer->fOmniTimer)
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette