QueryAllTracesW 函式 (evntrace.h)
QueryAllTraces 函式會擷取呼叫端具有查詢許可權之所有事件追蹤會話的屬性和統計數據。
語法
ULONG WMIAPI QueryAllTracesW(
[out] PEVENT_TRACE_PROPERTIES *PropertyArray,
[in] ULONG PropertyArrayCount,
[out] PULONG LoggerCount
);
參數
[out] PropertyArray
EVENT_TRACE_PROPERTIES 結構的指標數位,可接收事件追蹤會話的會話屬性和統計數據。
您只需要設定 Wnode.BufferSize、LoggerNameOffset 和 LogFileNameOffsetEVENT_TRACE_PROPERTIES 結構的成員。 其他成員應該全部設定為零。
[in] PropertyArrayCount
PropertyArray 陣列中的結構數目。 此值必須小於或等於 64,ETW 支援的事件追蹤會話數目上限。
Windows 10:PropertyArrayCount 可能大於 64,有些系統可能支援 64 個以上的追蹤會話。
[out] LoggerCount
計算機上啟動的實際事件追蹤會話數目。
傳回值
如果函式成功,則傳回值會ERROR_SUCCESS。
如果函式失敗,傳回值是
ERROR_INVALID_PARAMETER
下列其中一項成立:
- PropertyArrayCount 為零或大於支援會話數目上限
- PropertyArrayNULL
ERROR_MORE_DATA
屬性陣列太小,無法接收所有工作階段的資訊(SessionCount 大於 PropertyArrayCount)。 函式會填入屬性陣列,其中包含在 PropertyArrayCount 中指定的屬性結構數目,。
言論
事件追蹤控制器會呼叫此函式。
此函式會擷取呼叫端具有查詢許可權的追蹤會話。 以提升的系統管理許可權執行的使用者、效能記錄使用者群組中的使用者,以及以 LocalSystem、LocalService、NetworkService 身分執行的服務,都可以檢視所有追蹤會話。
此函式不會傳回私人記錄會話。
若要擷取單一會話的資訊,請使用 ControlTrace 函式,並將 ControlCode 參數設定為 EVENT_TRACE_CONTROL_QUERY。
例子
下列範例示範如何呼叫此函式。
#include <windows.h>
#include <evntrace.h>
#include <vector>
const unsigned MAX_SESSION_NAME_LEN = 1024;
const unsigned MAX_LOGFILE_PATH_LEN = 1024;
const unsigned PropertiesSize =
sizeof(EVENT_TRACE_PROPERTIES) +
(MAX_SESSION_NAME_LEN * sizeof(CHAR)) +
(MAX_LOGFILE_PATH_LEN * sizeof(CHAR));
int main()
{
ULONG status;
std::vector<EVENT_TRACE_PROPERTIES*> sessions; // Array of pointers to property structures
std::vector<BYTE> buffer; // Buffer that contains all the property structures
ULONG sessionCount; // Actual number of sessions started on the computer
// The size of the session name and log file name used by the
// controllers are not known, therefore create a properties structure that allows
// for the maximum size of both.
try
{
sessionCount = 64; // Start with room for 64 sessions.
do
{
sessions.resize(sessionCount);
buffer.resize(PropertiesSize * sessionCount);
for (size_t i = 0; i != sessions.size(); i += 1)
{
sessions[i] = (EVENT_TRACE_PROPERTIES*)&buffer[i * PropertiesSize];
sessions[i]->Wnode.BufferSize = PropertiesSize;
sessions[i]->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
sessions[i]->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + (MAX_SESSION_NAME_LEN * sizeof(CHAR));
}
status = QueryAllTracesA(&sessions[0], sessionCount, &sessionCount);
} while (status == ERROR_MORE_DATA);
if (status != ERROR_SUCCESS)
{
printf("Error calling QueryAllTraces: %u\n", status);
}
else
{
printf("Actual session count: %u.\n\n", sessionCount);
for (ULONG i = 0; i < sessionCount; i++)
{
WCHAR sessionGuid[50];
(void)StringFromGUID2(sessions[i]->Wnode.Guid, sessionGuid, ARRAYSIZE(sessionGuid));
printf(
"Session GUID: %ls\n"
"Session ID: %llu\n"
"Session name: %s\n"
"Log file: %s\n"
"min buffers: %u\n"
"max buffers: %u\n"
"buffers: %u\n"
"buffers written: %u\n"
"buffers lost: %u\n"
"events lost: %u\n"
"\n",
sessionGuid,
sessions[i]->Wnode.HistoricalContext,
(PCSTR)((LPCBYTE)sessions[i] + sessions[i]->LoggerNameOffset),
(PCSTR)((LPCBYTE)sessions[i] + sessions[i]->LogFileNameOffset),
sessions[i]->MinimumBuffers,
sessions[i]->MaximumBuffers,
sessions[i]->NumberOfBuffers,
sessions[i]->BuffersWritten,
sessions[i]->LogBuffersLost,
sessions[i]->EventsLost);
}
}
}
catch (std::bad_alloc const&)
{
printf("Error allocating memory for properties.\n");
status = ERROR_OUTOFMEMORY;
}
return status;
}
注意
evntrace.h 標頭會將 QueryAllTraces 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 2000 Professional [僅限傳統型應用程式] |
支援的最低伺服器 | Windows 2000 Server [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | evntrace.h |
連結庫 | Windows 8.1 和 Windows Server 2012 R2 上的 Sechost.lib;Windows 8、Windows Server 2012、Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista 和 Windows XP 上的 Advapi32.lib |
DLL | Sechost.dll Windows 8.1 和 Windows Server 2012 R2;Windows 8、Windows Server 2012、Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista 和 Windows XP 上的 Advapi32.dll |