tstNtQueryStuff.cpp revision 739d6ae13d627830974df4bfba63c1d5fab987b7
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * SUP Testcase - Exploring some NT Query APIs.
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * Copyright (C) 2006-2012 Oracle Corporation
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * available from http://www.virtualbox.org. This file is free software;
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * you can redistribute it and/or modify it under the terms of the GNU
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * General Public License (GPL) as published by the Free Software
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * The contents of this file may alternatively be used under the terms
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * of the Common Development and Distribution License Version 1.0
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * VirtualBox OSE distribution, in which case the provisions of the
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * CDDL are applicable instead of those of the GPL.
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * You may elect to license modified versions of this file under the
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync * terms and conditions of either the GPL or the CDDL or both.
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync/*******************************************************************************
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync* Header Files *
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync*******************************************************************************/
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsynctypedef enum
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsynctypedef struct
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsyncNTSYSAPI NTSTATUS NTAPI NtQueryVirtualMemory(IN HANDLE hProcess,
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync/*******************************************************************************
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync* Structures and Typedefs *
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync*******************************************************************************/
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsynctypedef struct FLAGDESC
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync const char *psz;
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync/*******************************************************************************
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync* Global Variables *
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync*******************************************************************************/
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsyncstatic char *stringifyAppend(char *pszBuf, size_t *pcbBuf, const char *pszAppend, bool fWithSpace)
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsyncstatic char *stringifyAppendUnknownFlags(uint32_t fFlags, char *pszBuf, size_t *pcbBuf, bool fWithSpace)
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync RTStrPrintf(szTmp, sizeof(szTmp), "BIT(%d)", iBit);
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync pszBuf = stringifyAppend(pszBuf, pcbBuf, szTmp, fWithSpace);
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsyncstatic char *stringifyFlags(uint32_t fFlags, char *pszBuf, size_t cbBuf, PCFLAGDESC paFlagDesc, size_t cFlagDesc)
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync pszBuf = stringifyAppend(pszBuf, &cbBuf, paFlagDesc[i].psz, pszBuf != pszBufStart);
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync stringifyAppendUnknownFlags(fFlags, pszBuf, &cbBuf, pszBuf != pszBufStart);
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsyncstatic char *stringifyMemType(uint32_t fType, char *pszBuf, size_t cbBuf)
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync return stringifyFlags(fType, pszBuf, cbBuf, s_aMemTypes, RT_ELEMENTS(s_aMemTypes));
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsyncstatic char *stringifyMemState(uint32_t fState, char *pszBuf, size_t cbBuf)
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync return stringifyFlags(fState, pszBuf, cbBuf, s_aMemStates, RT_ELEMENTS(s_aMemStates));
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsyncstatic char *stringifyMemProt(uint32_t fProt, char *pszBuf, size_t cbBuf)
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync return stringifyFlags(fProt, pszBuf, cbBuf, s_aProtections, RT_ELEMENTS(s_aProtections));
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsyncstatic void tstQueryVirtualMemory(void)
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync MEMORY_BASIC_INFORMATION MemInfo = { 0, 0, 0, 0, 0, 0, 0 };
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync NTSTATUS ntRc = NtQueryVirtualMemory(GetCurrentProcess(),
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync (void const *)uPtrWhere,
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync RTTestIPrintf(RTTESTLVL_ALWAYS, "%p: ntRc=%#x\n", uPtrWhere, ntRc);
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync /* stringify the memory state. */
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync RTTestIPrintf(RTTESTLVL_ALWAYS, "%p-%p %-8s %-8s %-12s\n",
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync MemInfo.BaseAddress, (uintptr_t)MemInfo.BaseAddress + MemInfo.RegionSize - 1,
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync stringifyMemType(MemInfo.Type, szMemType, sizeof(szMemType)),
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync stringifyMemState(MemInfo.State, szMemState, sizeof(szMemState)),
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync stringifyMemProt(MemInfo.Protect, szMemProt, sizeof(szMemProt))
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync RTTestIPrintf(RTTESTLVL_ALWAYS, " !Warning! Queried %p got BaseAddress=%p!\n",
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync //cbAdvance = 0;
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync//NtQueryInformationProcess
739d6ae13d627830974df4bfba63c1d5fab987b7vboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstNtQueryStuff", &g_hTest);