Win32 API 日本語リファレンス
ホームSystem.Diagnostics.Debug.Extensions › DEBUG_PNP_TRIAGE_INFO

DEBUG_PNP_TRIAGE_INFO

構造体
サイズx64: 64 バイト / x86: 64 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
SizeOfStructDWORD4+0+0この構造体のバイトサイズ。呼び出し前に設定する。
Lock_AddressULONGLONG8+8+8PnPロックオブジェクトのアドレス。
Lock_ActiveCountINT4+16+16ロックのアクティブカウント(符号付き)。
Lock_ContentionCountDWORD4+20+20ロックの競合発生回数。
Lock_NumberOfExclusiveWaitersDWORD4+24+24排他取得を待機しているスレッド数。
Lock_NumberOfSharedWaitersDWORD4+28+28共有取得を待機しているスレッド数。
Lock_FlagWORD2+32+32ロックの状態フラグ。
TriagedThreadULONGLONG8+40+40トリアージ対象スレッドのアドレス。
ThreadCountINT4+48+48関連するスレッド数(符号付き)。
TriagedThread_WaitTimeULONGLONG8+56+56トリアージ対象スレッドの待機時間。

各言語での定義

#include <windows.h>

// DEBUG_PNP_TRIAGE_INFO  (x64 64 / x86 64 バイト)
typedef struct DEBUG_PNP_TRIAGE_INFO {
    DWORD SizeOfStruct;
    ULONGLONG Lock_Address;
    INT Lock_ActiveCount;
    DWORD Lock_ContentionCount;
    DWORD Lock_NumberOfExclusiveWaiters;
    DWORD Lock_NumberOfSharedWaiters;
    WORD Lock_Flag;
    ULONGLONG TriagedThread;
    INT ThreadCount;
    ULONGLONG TriagedThread_WaitTime;
} DEBUG_PNP_TRIAGE_INFO;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DEBUG_PNP_TRIAGE_INFO
{
    public uint SizeOfStruct;
    public ulong Lock_Address;
    public int Lock_ActiveCount;
    public uint Lock_ContentionCount;
    public uint Lock_NumberOfExclusiveWaiters;
    public uint Lock_NumberOfSharedWaiters;
    public ushort Lock_Flag;
    public ulong TriagedThread;
    public int ThreadCount;
    public ulong TriagedThread_WaitTime;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DEBUG_PNP_TRIAGE_INFO
    Public SizeOfStruct As UInteger
    Public Lock_Address As ULong
    Public Lock_ActiveCount As Integer
    Public Lock_ContentionCount As UInteger
    Public Lock_NumberOfExclusiveWaiters As UInteger
    Public Lock_NumberOfSharedWaiters As UInteger
    Public Lock_Flag As UShort
    Public TriagedThread As ULong
    Public ThreadCount As Integer
    Public TriagedThread_WaitTime As ULong
End Structure
import ctypes
from ctypes import wintypes

class DEBUG_PNP_TRIAGE_INFO(ctypes.Structure):
    _fields_ = [
        ("SizeOfStruct", wintypes.DWORD),
        ("Lock_Address", ctypes.c_ulonglong),
        ("Lock_ActiveCount", ctypes.c_int),
        ("Lock_ContentionCount", wintypes.DWORD),
        ("Lock_NumberOfExclusiveWaiters", wintypes.DWORD),
        ("Lock_NumberOfSharedWaiters", wintypes.DWORD),
        ("Lock_Flag", ctypes.c_ushort),
        ("TriagedThread", ctypes.c_ulonglong),
        ("ThreadCount", ctypes.c_int),
        ("TriagedThread_WaitTime", ctypes.c_ulonglong),
    ]
#[repr(C)]
pub struct DEBUG_PNP_TRIAGE_INFO {
    pub SizeOfStruct: u32,
    pub Lock_Address: u64,
    pub Lock_ActiveCount: i32,
    pub Lock_ContentionCount: u32,
    pub Lock_NumberOfExclusiveWaiters: u32,
    pub Lock_NumberOfSharedWaiters: u32,
    pub Lock_Flag: u16,
    pub TriagedThread: u64,
    pub ThreadCount: i32,
    pub TriagedThread_WaitTime: u64,
}
import "golang.org/x/sys/windows"

type DEBUG_PNP_TRIAGE_INFO struct {
	SizeOfStruct uint32
	Lock_Address uint64
	Lock_ActiveCount int32
	Lock_ContentionCount uint32
	Lock_NumberOfExclusiveWaiters uint32
	Lock_NumberOfSharedWaiters uint32
	Lock_Flag uint16
	TriagedThread uint64
	ThreadCount int32
	TriagedThread_WaitTime uint64
}
type
  DEBUG_PNP_TRIAGE_INFO = record
    SizeOfStruct: DWORD;
    Lock_Address: UInt64;
    Lock_ActiveCount: Integer;
    Lock_ContentionCount: DWORD;
    Lock_NumberOfExclusiveWaiters: DWORD;
    Lock_NumberOfSharedWaiters: DWORD;
    Lock_Flag: Word;
    TriagedThread: UInt64;
    ThreadCount: Integer;
    TriagedThread_WaitTime: UInt64;
  end;
const DEBUG_PNP_TRIAGE_INFO = extern struct {
    SizeOfStruct: u32,
    Lock_Address: u64,
    Lock_ActiveCount: i32,
    Lock_ContentionCount: u32,
    Lock_NumberOfExclusiveWaiters: u32,
    Lock_NumberOfSharedWaiters: u32,
    Lock_Flag: u16,
    TriagedThread: u64,
    ThreadCount: i32,
    TriagedThread_WaitTime: u64,
};
type
  DEBUG_PNP_TRIAGE_INFO {.bycopy.} = object
    SizeOfStruct: uint32
    Lock_Address: uint64
    Lock_ActiveCount: int32
    Lock_ContentionCount: uint32
    Lock_NumberOfExclusiveWaiters: uint32
    Lock_NumberOfSharedWaiters: uint32
    Lock_Flag: uint16
    TriagedThread: uint64
    ThreadCount: int32
    TriagedThread_WaitTime: uint64
struct DEBUG_PNP_TRIAGE_INFO
{
    uint SizeOfStruct;
    ulong Lock_Address;
    int Lock_ActiveCount;
    uint Lock_ContentionCount;
    uint Lock_NumberOfExclusiveWaiters;
    uint Lock_NumberOfSharedWaiters;
    ushort Lock_Flag;
    ulong TriagedThread;
    int ThreadCount;
    ulong TriagedThread_WaitTime;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DEBUG_PNP_TRIAGE_INFO サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; SizeOfStruct : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Lock_Address : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; Lock_ActiveCount : INT (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; Lock_ContentionCount : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; Lock_NumberOfExclusiveWaiters : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; Lock_NumberOfSharedWaiters : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; Lock_Flag : WORD (+32, 2byte)  wpoke st,32,値  /  値 = wpeek(st,32)
; TriagedThread : ULONGLONG (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; ThreadCount : INT (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; TriagedThread_WaitTime : ULONGLONG (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DEBUG_PNP_TRIAGE_INFO
    #field int SizeOfStruct
    #field int64 Lock_Address
    #field int Lock_ActiveCount
    #field int Lock_ContentionCount
    #field int Lock_NumberOfExclusiveWaiters
    #field int Lock_NumberOfSharedWaiters
    #field short Lock_Flag
    #field int64 TriagedThread
    #field int ThreadCount
    #field int64 TriagedThread_WaitTime
#endstruct

stdim st, DEBUG_PNP_TRIAGE_INFO        ; NSTRUCT 変数を確保
st->SizeOfStruct = 100
mes "SizeOfStruct=" + st->SizeOfStruct