| 400 | } |
| 401 | |
| 402 | void ParseThreadEntry(HPSS SnapshotHandle) |
| 403 | { |
| 404 | HPSSWALK WalkMarkerHandle; |
| 405 | PSS_THREAD_ENTRY ThreadEntry; |
| 406 | |
| 407 | // |
| 408 | // Walk the snapshot: threads. |
| 409 | // |
| 410 | auto rc = g_winapiApiTable->PssWalkMarkerCreate(NULL, &WalkMarkerHandle); |
| 411 | if (rc != ERROR_SUCCESS) |
| 412 | { |
| 413 | wprintf(L"PssWalkMarkerCreate failed: Win32 error %u (%s).\n", |
| 414 | rc, LookupDictionary(rc, Win32ErrorCodes)); |
| 415 | } |
| 416 | |
| 417 | rc = g_winapiApiTable->PssWalkSnapshot(SnapshotHandle, PSS_WALK_THREADS, WalkMarkerHandle, &ThreadEntry, sizeof(PSS_THREAD_ENTRY)); |
| 418 | |
| 419 | wprintf(L"PSS_THREAD_ENTRY walk:\n"); |
| 420 | |
| 421 | DWORD i = 0; |
| 422 | while (rc == ERROR_SUCCESS) |
| 423 | { |
| 424 | ++i; |
| 425 | |
| 426 | wprintf(L" %2u) Thread ID: %4u (%4x) suspend: %u teb: %p w32sa: %p pc: %p %s\n" |
| 427 | L" priority %d (%s) base priority %d (%s)\n", |
| 428 | i, |
| 429 | (ULONG)ThreadEntry.ThreadId, |
| 430 | (ULONG)ThreadEntry.ThreadId, |
| 431 | ThreadEntry.SuspendCount, |
| 432 | ThreadEntry.TebBaseAddress, |
| 433 | ThreadEntry.Win32StartAddress, |
| 434 | (ThreadEntry.ContextRecord ? CONTEXT_TO_PROGRAM_COUNTER(ThreadEntry.ContextRecord) : 0xDEADBEEF), |
| 435 | ((ThreadEntry.Flags & PSS_THREAD_FLAGS_TERMINATED) ? 1 : 0), |
| 436 | ThreadEntry.Priority, |
| 437 | LookupDictionary(ThreadEntry.Priority, PriorityValueDictionary), |
| 438 | ThreadEntry.BasePriority, |
| 439 | LookupDictionary(ThreadEntry.BasePriority, PriorityValueDictionary)); |
| 440 | |
| 441 | rc = g_winapiApiTable->PssWalkSnapshot(SnapshotHandle, PSS_WALK_THREADS, WalkMarkerHandle, &ThreadEntry, sizeof(PSS_THREAD_ENTRY)); |
| 442 | } |
| 443 | |
| 444 | if (rc == ERROR_NO_MORE_ITEMS) { |
| 445 | wprintf(L" Reached end of thread stream.\n\n"); |
| 446 | |
| 447 | } |
| 448 | else if (rc != ERROR_SUCCESS) { |
| 449 | wprintf(L"PssQuerySnapshot/PSS_WALK_THREADS failed: Win32 error %u (%s).\n\n", |
| 450 | rc, LookupDictionary(rc, Win32ErrorCodes)); |
| 451 | } |
| 452 | |
| 453 | g_winapiApiTable->PssWalkMarkerFree(WalkMarkerHandle); |
| 454 | } |
| 455 | |
| 456 | static void QuerySnapshot(HPSS SnapshotHandle) |
| 457 | { |
no test coverage detected