VirtualBox

Changeset 86102 in vbox


Ignore:
Timestamp:
Sep 13, 2020 8:26:02 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
140334
Message:

VMM/DBGFOS: Add preliminary WinNT specific interface to let the KD remote stub communicate with the OS digger plugin

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/dbgf.h

    r86098 r86102  
    21732173    /** Kernel message log - DBGFOSIDMESG. */
    21742174    DBGFOSINTERFACE_DMESG,
     2175    /** Windows NT specifics (for the communication with the KD debugger stub). */
     2176    DBGFOSINTERFACE_WINNT,
    21752177    /** The end of the valid entries. */
    21762178    DBGFOSINTERFACE_END,
     
    23612363/** Magic value for DBGFOSIDMESG::32Magic and DBGFOSIDMESG::u32EndMagic. (Kenazburo Oe) */
    23622364#define DBGFOSIDMESG_MAGIC UINT32_C(0x19350131)
     2365
     2366
     2367/**
     2368 * Interface for querying Windows NT guest specifics (DBGFOSINTERFACE_WINNT).
     2369 */
     2370typedef struct DBGFOSIWINNT
     2371{
     2372    /** Trailing magic (DBGFOSIWINNT_MAGIC). */
     2373    uint32_t    u32Magic;
     2374
     2375    /**
     2376     * Queries version information.
     2377     *
     2378     * @returns VBox status code.
     2379     * @param   pThis                           Pointer to the interface structure.
     2380     * @param   pUVM                            The user mode VM handle.
     2381     * @param   puVersMajor                     Where to store the major version part.
     2382     * @param   puVersMinor                     Where to store the minor version part.
     2383     */
     2384    DECLCALLBACKMEMBER(int, pfnQueryVersion,(struct DBGFOSIWINNT *pThis, PUVM pUVM,
     2385                                             uint32_t *puVersMajor, uint32_t *puVersMinor));
     2386
     2387    /**
     2388     * Queries some base kernel pointers.
     2389     *
     2390     * @returns VBox status code.
     2391     * @param   pThis                           Pointer to the interface structure.
     2392     * @param   pUVM                            The user mode VM handle.
     2393     * @param   pGCPtrKernBase                  Where to store the kernel base on success.
     2394     * @param   pGCPtrPsLoadedModuleList        Where to store the pointer to the laoded module list head on success.
     2395     */
     2396    DECLCALLBACKMEMBER(int, pfnQueryKernelPtrs,(struct DBGFOSIWINNT *pThis, PUVM pUVM,
     2397                                                PRTGCUINTPTR pGCPtrKernBase, PRTGCUINTPTR pGCPtrPsLoadedModuleList));
     2398
     2399    /**
     2400     * Queries KPCR and KPCRB pointers for the given vCPU.
     2401     *
     2402     * @returns VBox status code.
     2403     * @param   pThis                           Pointer to the interface structure.
     2404     * @param   pUVM                            The user mode VM handle.
     2405     * @param   idCpu                           The vCPU to query the KPCR/KPCRB for.
     2406     * @param   pKpcr                           Where to store the KPCR pointer on success, optional.
     2407     * @param   pKpcrb                          Where to store the KPCR pointer on success, optional.
     2408     */
     2409    DECLCALLBACKMEMBER(int, pfnQueryKpcrForVCpu,(struct DBGFOSIWINNT *pThis, PUVM pUVM, VMCPUID idCpu,
     2410                                                 PRTGCUINTPTR pKpcr, PRTGCUINTPTR pKpcrb));
     2411
     2412    /**
     2413     * Queries the current thread for the given vCPU.
     2414     *
     2415     * @returns VBox status code.
     2416     * @param   pThis                           Pointer to the interface structure.
     2417     * @param   pUVM                            The user mode VM handle.
     2418     * @param   idCpu                           The vCPU to query the KPCR/KPCRB for.
     2419     * @param   pCurThrd                        Where to store the CurrentThread pointer on success.
     2420     */
     2421    DECLCALLBACKMEMBER(int, pfnQueryCurThrdForVCpu,(struct DBGFOSIWINNT *pThis, PUVM pUVM, VMCPUID idCpu,
     2422                                                    PRTGCUINTPTR pCurThrd));
     2423
     2424    /** Trailing magic (DBGFOSIWINNT_MAGIC). */
     2425    uint32_t    u32EndMagic;
     2426} DBGFOSIWINNT;
     2427/** Pointer to the interface for query kernel log messages (DBGFOSINTERFACE_WINNT). */
     2428typedef DBGFOSIWINNT *PDBGFOSIWINNT;
     2429/** Magic value for DBGFOSIWINNT::32Magic and DBGFOSIWINNT::u32EndMagic. (Dave Cutler) */
     2430#define DBGFOSIWINNT_MAGIC UINT32_C(0x19420313)
    23632431
    23642432
  • trunk/src/VBox/VMM/VMMR3/DBGFOS.cpp

    r82968 r86102  
    7171        /** DBGFOSINTERFACE_DMESG.*/
    7272        PDBGFOSIDMESG           pDmesg;
     73        /** DBGFOSINTERFACE_WINNT.*/
     74        PDBGFOSIWINNT           pWinNt;
    7375    } uDigger;
    7476    /** The user mode VM handle. */
     
    7981        /** DBGFOSINTERFACE_DMESG.*/
    8082        DBGFOSIDMESG            Dmesg;
     83        /** DBGFOSINTERFACE_WINNT.*/
     84        DBGFOSIWINNT            WinNt;
    8185    } uWrapper;
    8286} DBGFOSEMTWRAPPER;
     
    528532                                    pWrapper->uDigger.pDmesg, pUVM, fFlags, cMessages, pszBuf, cbBuf, pcbActual);
    529533
     534}
     535
     536
     537/**
     538 * @interface_method_impl{DBGFOSIWINNT,pfnQueryVersion, Generic EMT wrapper.}
     539 */
     540static DECLCALLBACK(int) dbgfR3OSEmtIWinNt_QueryVersion(PDBGFOSIWINNT pThis, PUVM pUVM, uint32_t *puVersMajor, uint32_t *puVersMinor)
     541{
     542    PDBGFOSEMTWRAPPER pWrapper = RT_FROM_MEMBER(pThis, DBGFOSEMTWRAPPER, uWrapper.WinNt);
     543    UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
     544    AssertReturn(pUVM == pWrapper->pUVM, VERR_INVALID_VM_HANDLE);
     545
     546    return VMR3ReqPriorityCallWaitU(pWrapper->pUVM, 0 /*idDstCpu*/,
     547                                   (PFNRT)pWrapper->uDigger.pWinNt->pfnQueryVersion, 4,
     548                                    pWrapper->uDigger.pWinNt, pUVM, puVersMajor, puVersMinor);
     549}
     550
     551
     552/**
     553 * @interface_method_impl{DBGFOSIWINNT,pfnQueryVersion, Generic EMT wrapper.}
     554 */
     555static DECLCALLBACK(int) dbgfR3OSEmtIWinNt_QueryKernelPtrs(PDBGFOSIWINNT pThis, PUVM pUVM,
     556                                                           PRTGCUINTPTR pGCPtrKernBase, PRTGCUINTPTR pGCPtrPsLoadedModuleList)
     557{
     558    PDBGFOSEMTWRAPPER pWrapper = RT_FROM_MEMBER(pThis, DBGFOSEMTWRAPPER, uWrapper.WinNt);
     559    UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
     560    AssertReturn(pUVM == pWrapper->pUVM, VERR_INVALID_VM_HANDLE);
     561
     562    return VMR3ReqPriorityCallWaitU(pWrapper->pUVM, 0 /*idDstCpu*/,
     563                                   (PFNRT)pWrapper->uDigger.pWinNt->pfnQueryKernelPtrs, 4,
     564                                    pWrapper->uDigger.pWinNt, pUVM, pGCPtrKernBase, pGCPtrPsLoadedModuleList);
     565}
     566
     567
     568/**
     569 * @interface_method_impl{DBGFOSIWINNT,pfnQueryKpcrForVCpu, Generic EMT wrapper.}
     570 */
     571static DECLCALLBACK(int) dbgfR3OSEmtIWinNt_QueryKpcrForVCpu(struct DBGFOSIWINNT *pThis, PUVM pUVM, VMCPUID idCpu,
     572                                                            PRTGCUINTPTR pKpcr, PRTGCUINTPTR pKpcrb)
     573{
     574    PDBGFOSEMTWRAPPER pWrapper = RT_FROM_MEMBER(pThis, DBGFOSEMTWRAPPER, uWrapper.WinNt);
     575    UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
     576    AssertReturn(pUVM == pWrapper->pUVM, VERR_INVALID_VM_HANDLE);
     577
     578    return VMR3ReqPriorityCallWaitU(pWrapper->pUVM, 0 /*idDstCpu*/,
     579                                    (PFNRT)pWrapper->uDigger.pWinNt->pfnQueryKpcrForVCpu, 5,
     580                                    pWrapper->uDigger.pWinNt, pUVM, idCpu, pKpcr, pKpcrb);
     581}
     582
     583
     584/**
     585 * @interface_method_impl{DBGFOSIWINNT,pfnQueryCurThrdForVCpu, Generic EMT wrapper.}
     586 */
     587static DECLCALLBACK(int) dbgfR3OSEmtIWinNt_QueryCurThrdForVCpu(struct DBGFOSIWINNT *pThis, PUVM pUVM, VMCPUID idCpu,
     588                                                               PRTGCUINTPTR pCurThrd)
     589{
     590    PDBGFOSEMTWRAPPER pWrapper = RT_FROM_MEMBER(pThis, DBGFOSEMTWRAPPER, uWrapper.WinNt);
     591    UVM_ASSERT_VALID_EXT_RETURN(pUVM, VERR_INVALID_VM_HANDLE);
     592    AssertReturn(pUVM == pWrapper->pUVM, VERR_INVALID_VM_HANDLE);
     593
     594    return VMR3ReqPriorityCallWaitU(pWrapper->pUVM, 0 /*idDstCpu*/,
     595                                    (PFNRT)pWrapper->uDigger.pWinNt->pfnQueryCurThrdForVCpu, 4,
     596                                    pWrapper->uDigger.pWinNt, pUVM, idCpu, pCurThrd);
    530597}
    531598
     
    591658                    pWrapper->uWrapper.Dmesg.u32EndMagic       = DBGFOSIDMESG_MAGIC;
    592659                    break;
     660                case DBGFOSINTERFACE_WINNT:
     661                    pWrapper->uWrapper.WinNt.u32Magic               = DBGFOSIWINNT_MAGIC;
     662                    pWrapper->uWrapper.WinNt.pfnQueryVersion        = dbgfR3OSEmtIWinNt_QueryVersion;
     663                    pWrapper->uWrapper.WinNt.pfnQueryKernelPtrs     = dbgfR3OSEmtIWinNt_QueryKernelPtrs;
     664                    pWrapper->uWrapper.WinNt.pfnQueryKpcrForVCpu    = dbgfR3OSEmtIWinNt_QueryKpcrForVCpu;
     665                    pWrapper->uWrapper.WinNt.pfnQueryCurThrdForVCpu = dbgfR3OSEmtIWinNt_QueryCurThrdForVCpu;
     666                    pWrapper->uWrapper.WinNt.u32EndMagic            = DBGFOSIWINNT_MAGIC;
     667                    break;
    593668                default:
    594669                    AssertFailed();
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