Skip to content

Commit

Permalink
Merge pull request #427 from processhacker/master
Browse files Browse the repository at this point in the history
[pull] master from processhacker:master
  • Loading branch information
pull[bot] authored Feb 28, 2022
2 parents 7e348ef + e5bb757 commit 54222c8
Show file tree
Hide file tree
Showing 25 changed files with 650 additions and 294 deletions.
28 changes: 14 additions & 14 deletions plugins/ExtendedTools/PresentMon/PresentMon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ static void CheckForTerminatedRealtimeProcesses(
)
{
LARGE_INTEGER performanceCounter;
PhQueryPerformanceCounter(&performanceCounter, NULL);
PhQueryPerformanceCounter(&performanceCounter, nullptr);
terminatedProcesses->emplace_back(processId, performanceCounter.QuadPart);

PhClearReference(reinterpret_cast<PVOID*>(&processInfo->ProcessItem));
Expand Down Expand Up @@ -347,14 +347,14 @@ VOID PresentMonUpdateProcessStats(

EtAddGpuFrameToHashTable(
ProcessId,
frameLatency,
framesPerSecond,
displayLatency,
displayFramesPerSecond,
msBetweenPresents,
msInPresentApi,
msUntilRenderComplete,
msUntilDisplayed,
static_cast<FLOAT>(frameLatency),
static_cast<FLOAT>(framesPerSecond),
static_cast<FLOAT>(displayLatency),
static_cast<FLOAT>(displayFramesPerSecond),
static_cast<FLOAT>(msBetweenPresents),
static_cast<FLOAT>(msInPresentApi),
static_cast<FLOAT>(msUntilRenderComplete),
static_cast<FLOAT>(msUntilDisplayed),
runtime,
presentMode
);
Expand Down Expand Up @@ -427,7 +427,7 @@ VOID StartOutputThread(
{
HANDLE threadHandle;

if (NT_SUCCESS(PhCreateThreadEx(&threadHandle, PresentMonOutputThread, NULL)))
if (NT_SUCCESS(PhCreateThreadEx(&threadHandle, PresentMonOutputThread, nullptr)))
{
PhSetThreadName(threadHandle, L"FpsEtwOutputThread");
NtClose(threadHandle);
Expand All @@ -442,7 +442,7 @@ VOID StopOutputThread(
)
{
InterlockedExchange(&QuitOutputThread, 1);
//NtWaitForSingleObject(OutputThreadHandle, FALSE, NULL);
//NtWaitForSingleObject(OutputThreadHandle, FALSE, nullptr);
}

static NTSTATUS PresentMonTraceThread(
Expand All @@ -454,7 +454,7 @@ static NTSTATUS PresentMonTraceThread(

while (TRUE)
{
while (!QuitOutputThread && (result = ProcessTrace(&traceHandle, 1, NULL, NULL)) == ERROR_SUCCESS)
while (!QuitOutputThread && (result = ProcessTrace(&traceHandle, 1, nullptr, nullptr)) == ERROR_SUCCESS)
NOTHING;

if (QuitOutputThread)
Expand All @@ -480,7 +480,7 @@ VOID StartConsumerThread(
{
HANDLE threadHandle;

if (NT_SUCCESS(PhCreateThreadEx(&threadHandle, PresentMonTraceThread, (PVOID)traceHandle)))
if (NT_SUCCESS(PhCreateThreadEx(&threadHandle, PresentMonTraceThread, reinterpret_cast<PVOID>(traceHandle))))
{
PhSetThreadName(threadHandle, L"FpsEtwConsumerThread");
NtClose(threadHandle);
Expand All @@ -495,5 +495,5 @@ VOID WaitForConsumerThreadToExit(
)
{
InterlockedExchange(&QuitOutputThread, 1);
//NtWaitForSingleObject(ConsumerThreadHandle, FALSE, NULL);
//NtWaitForSingleObject(ConsumerThreadHandle, FALSE, nullptr);
}
60 changes: 41 additions & 19 deletions plugins/ExtendedTools/etwstat.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* ETW statistics collection
*
* Copyright (C) 2010-2011 wj32
* Copyright (C) 2019-2020 dmex
* Copyright (C) 2019-2022 dmex
*
* This file is part of Process Hacker.
*
Expand Down Expand Up @@ -34,10 +34,17 @@ VOID NTAPI EtEtwNetworkItemsUpdatedCallback(
_In_opt_ PVOID Context
);

VOID EtpUpdateProcessInformation(
VOID
);

BOOLEAN EtDiskExtEnabled = FALSE;
static PH_CALLBACK_REGISTRATION EtpProcessesUpdatedCallbackRegistration;
static PH_CALLBACK_REGISTRATION EtpNetworkItemsUpdatedCallbackRegistration;

static PVOID EtpProcessInformation = NULL;
static PH_QUEUED_LOCK EtpProcessInformationLock = PH_QUEUED_LOCK_INIT;

ULONG EtpDiskReadRaw;
ULONG EtpDiskWriteRaw;
ULONG EtpNetworkReceiveRaw;
Expand Down Expand Up @@ -396,6 +403,8 @@ VOID NTAPI EtEtwProcessesUpdatedCallback(
// Since Windows 8, we no longer get the correct process/thread IDs in the
// event headers for disk events. We need to update our process information since
// etwmon uses our EtThreadIdToProcessId function. (wj32)
if (PhWindowsVersion >= WINDOWS_8)
EtpUpdateProcessInformation();

// ETW is extremely lazy when it comes to flushing buffers, so we must do it manually. (wj32)
//EtFlushEtwSession();
Expand Down Expand Up @@ -548,43 +557,56 @@ VOID NTAPI EtEtwNetworkItemsUpdatedCallback(
}
}

VOID EtpUpdateProcessInformation(
VOID
)
{
PhAcquireQueuedLockExclusive(&EtpProcessInformationLock);

if (EtpProcessInformation)
{
PhFree(EtpProcessInformation);
EtpProcessInformation = NULL;
}

PhEnumProcesses(&EtpProcessInformation);

PhReleaseQueuedLockExclusive(&EtpProcessInformationLock);
}

HANDLE EtThreadIdToProcessId(
_In_ HANDLE ThreadId
)
{
// Note: no lock is needed because we use the list on the same thread (EtpEtwMonitorThreadStart). (dmex)
static PVOID processInfo = NULL;
static ULONG64 lastTickTotal = 0;
PSYSTEM_PROCESS_INFORMATION process;
ULONG64 tickCount;
ULONG i;
HANDLE processId;

tickCount = NtGetTickCount64();
PhAcquireQueuedLockShared(&EtpProcessInformationLock);

if (tickCount - lastTickTotal >= 2 * CLOCKS_PER_SEC)
if (!EtpProcessInformation)
{
lastTickTotal = tickCount;

if (processInfo)
{
PhFree(processInfo);
processInfo = NULL;
}

PhEnumProcesses(&processInfo);
PhReleaseQueuedLockShared(&EtpProcessInformationLock);
return SYSTEM_PROCESS_ID;
}

process = PH_FIRST_PROCESS(processInfo);
process = PH_FIRST_PROCESS(EtpProcessInformation);

do
{
for (ULONG i = 0; i < process->NumberOfThreads; i++)
for (i = 0; i < process->NumberOfThreads; i++)
{
if (process->Threads[i].ClientId.UniqueThread == ThreadId)
{
return process->UniqueProcessId;
processId = process->UniqueProcessId;
PhReleaseQueuedLockShared(&EtpProcessInformationLock);

return processId;
}
}
} while (process = PH_NEXT_PROCESS(process));

PhReleaseQueuedLockShared(&EtpProcessInformationLock);

return SYSTEM_PROCESS_ID;
}
36 changes: 18 additions & 18 deletions plugins/ExtendedTools/framemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include "framemon.h"

BOOLEAN EtFramesEnabled = FALSE;
static PPH_HASHTABLE EtFramesHashTable = NULL;
static PPH_HASHTABLE EtFramesHashTable = nullptr;
static PH_QUEUED_LOCK EtFramesHashTableLock = PH_QUEUED_LOCK_INIT;

static BOOLEAN NTAPI EtFramesEqualFunction(
Expand Down Expand Up @@ -94,7 +94,7 @@ VOID EtFramesMonitorStart(
{
if (EtFramesEnabled)
{
PhQueueItemWorkQueue(PhGetGlobalWorkQueue(), EtStartFpsTraceSession, NULL);
PhQueueItemWorkQueue(PhGetGlobalWorkQueue(), EtStartFpsTraceSession, nullptr);
}
}

Expand Down Expand Up @@ -132,14 +132,14 @@ VOID EtUnlockGpuFrameHashTable(

VOID EtAddGpuFrameToHashTable(
_In_ ULONG ProcessId,
_In_ DOUBLE FrameMs,
_In_ DOUBLE FramesPerSecond,
_In_ DOUBLE DisplayLatency,
_In_ DOUBLE DisplayFramesPerSecond,
_In_ DOUBLE MsBetweenPresents,
_In_ DOUBLE MsInPresentApi,
_In_ DOUBLE MsUntilRenderComplete,
_In_ DOUBLE MsUntilDisplayed,
_In_ FLOAT FrameMs,
_In_ FLOAT FramesPerSecond,
_In_ FLOAT DisplayLatency,
_In_ FLOAT DisplayFramesPerSecond,
_In_ FLOAT MsBetweenPresents,
_In_ FLOAT MsInPresentApi,
_In_ FLOAT MsUntilRenderComplete,
_In_ FLOAT MsUntilDisplayed,
_In_ USHORT Runtime,
_In_ USHORT PresentMode
)
Expand Down Expand Up @@ -229,14 +229,14 @@ VOID EtProcessFramesUpdateProcessBlock(

if (entry = EtLookupProcessGpuFrameEntry(ProcessBlock->ProcessItem->ProcessId))
{
ProcessBlock->FramesPerSecond = (FLOAT)entry->FramesPerSecond;
ProcessBlock->FramesLatency = (FLOAT)entry->FrameMs;
ProcessBlock->FramesMsBetweenPresents = (FLOAT)entry->MsBetweenPresents;
ProcessBlock->FramesMsInPresentApi = (FLOAT)entry->MsInPresentApi;
ProcessBlock->FramesMsUntilRenderComplete = (FLOAT)entry->MsUntilRenderComplete;
ProcessBlock->FramesMsUntilDisplayed = (FLOAT)entry->MsUntilDisplayed;
ProcessBlock->FramesDisplayLatency = (FLOAT)entry->DisplayLatency;
//ProcessBlock->FramesDisplayFramesPerSecond = (FLOAT)entry->DisplayFramesPerSecond;
ProcessBlock->FramesPerSecond = entry->FramesPerSecond;
ProcessBlock->FramesLatency = entry->FrameMs;
ProcessBlock->FramesMsBetweenPresents = entry->MsBetweenPresents;
ProcessBlock->FramesMsInPresentApi = entry->MsInPresentApi;
ProcessBlock->FramesMsUntilRenderComplete = entry->MsUntilRenderComplete;
ProcessBlock->FramesMsUntilDisplayed = entry->MsUntilDisplayed;
ProcessBlock->FramesDisplayLatency = entry->DisplayLatency;
//ProcessBlock->FramesDisplayFramesPerSecond = entry->DisplayFramesPerSecond;
ProcessBlock->FramesRuntime = entry->Runtime;
ProcessBlock->FramesPresentMode = entry->PresentMode;

Expand Down
32 changes: 16 additions & 16 deletions plugins/ExtendedTools/framemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ extern "C" {
typedef struct _ET_FPS_COUNTER
{
HANDLE ProcessId;
DOUBLE FrameMs;
DOUBLE FramesPerSecond;
DOUBLE MsBetweenPresents;
DOUBLE MsInPresentApi;
DOUBLE MsUntilRenderComplete;
DOUBLE MsUntilDisplayed;
DOUBLE DisplayLatency;
//DOUBLE DisplayFramesPerSecond;
FLOAT FrameMs;
FLOAT FramesPerSecond;
FLOAT MsBetweenPresents;
FLOAT MsInPresentApi;
FLOAT MsUntilRenderComplete;
FLOAT MsUntilDisplayed;
FLOAT DisplayLatency;
//FLOAT DisplayFramesPerSecond;
USHORT Runtime;
USHORT PresentMode;
} ET_FPS_COUNTER, *PET_FPS_COUNTER;
Expand All @@ -60,14 +60,14 @@ PET_FPS_COUNTER EtLookupProcessGpuFrameEntry(

VOID EtAddGpuFrameToHashTable(
_In_ ULONG ProcessId,
_In_ DOUBLE FrameMs,
_In_ DOUBLE FramesPerSecond,
_In_ DOUBLE DisplayLatency,
_In_ DOUBLE DisplayFramesPerSecond,
_In_ DOUBLE MsBetweenPresents,
_In_ DOUBLE MsInPresentApi,
_In_ DOUBLE MsUntilRenderComplete,
_In_ DOUBLE MsUntilDisplayed,
_In_ FLOAT FrameMs,
_In_ FLOAT FramesPerSecond,
_In_ FLOAT DisplayLatency,
_In_ FLOAT DisplayFramesPerSecond,
_In_ FLOAT MsBetweenPresents,
_In_ FLOAT MsInPresentApi,
_In_ FLOAT MsUntilRenderComplete,
_In_ FLOAT MsUntilDisplayed,
_In_ USHORT Runtime,
_In_ USHORT PresentMode
);
Expand Down
2 changes: 1 addition & 1 deletion tools/peview/clrprp.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
*/

#include <peview.h>
#include "metahost.h"
#include <metahost.h>

typedef struct _PVP_PE_CLR_CONTEXT
{
Expand Down
15 changes: 15 additions & 0 deletions tools/peview/clrtableimportprp.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,21 @@ VOID PvpEnumerateClrImports(

if (importDll->Functions)
{
if (importDll->ImportName)
{
PPH_STRING importDllName;

if (importDllName = PhApiSetResolveToHost(&importDll->ImportName->sr))
{
PhMoveReference(&importDll->ImportName, PhFormatString(
L"%s (%s)",
PhGetString(importDll->ImportName),
PhGetString(importDllName))
);
PhDereferenceObject(importDllName);
}
}

for (j = 0; j < importDll->Functions->Count; j++)
{
PPV_CLR_IMAGE_IMPORT_FUNCTION importFunction = importDll->Functions->Items[j];
Expand Down
19 changes: 9 additions & 10 deletions tools/peview/expprp.c
Original file line number Diff line number Diff line change
Expand Up @@ -206,8 +206,11 @@ NTSTATUS PvpPeExportsEnumerateThread(
}
else
{
PhPrintPointer(value, exportFunction.Function);
exportNode->AddressString = PhCreateString(value);
if (exportFunction.Function)
{
PhPrintPointer(value, exportFunction.Function);
exportNode->AddressString = PhCreateString(value);
}
}

if (exportEntry.Name)
Expand Down Expand Up @@ -257,11 +260,12 @@ NTSTATUS PvpPeExportsEnumerateThread(
);
}

if (exportSymbolName)
if (!PhIsNullOrEmptyString(exportSymbolName))
{
exportNode->NameString = PhConcatStringRefZ(&exportSymbolName->sr, L" (unnamed)");
}


PhClearReference(&exportSymbolName);
PhClearReference(&exportSymbol);
}
}
Expand Down Expand Up @@ -746,12 +750,7 @@ BOOLEAN NTAPI PvExportTreeNewCallback(
getCellText->Text = PhGetStringRef(node->AddressString);
break;
case PV_EXPORT_TREE_COLUMN_ITEM_NAME:
{
if (node->NameString)
getCellText->Text = PhGetStringRef(node->NameString);
else
PhInitializeStringRefLongHint(&getCellText->Text, L"(unnamed)");
}
getCellText->Text = PhGetStringRef(node->NameString);
break;
case PV_EXPORT_TREE_COLUMN_ITEM_ORDINAL:
getCellText->Text = PhGetStringRef(node->OrdinalString);
Expand Down
Loading

0 comments on commit 54222c8

Please sign in to comment.