Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi WCT WAITCHAIN\u节点\u信息联合验证_Winapi - Fatal编程技术网

Winapi WCT WAITCHAIN\u节点\u信息联合验证

Winapi WCT WAITCHAIN\u节点\u信息联合验证,winapi,Winapi,我正在使用C代码中的WCT Api(使用pinvoke),我有一个问题: 调用GetThreadWaitChain时,我得到WAITCHAIN\u NODE\u INFO数组的结果: WAITCHAIN\u节点\u信息: WAITCHAIN_NODE_INFO包含两个结构的并集-这意味着只有一个值是有效的,我如何知道从WAITCHAIN_NODE_INFO结构中获取哪些信息 目前我正在检查ProcessId和ThreadId是否为0,由此我假设另一半联合已初始化 这是我的C#WAITCHAIN

我正在使用C代码中的WCT Api(使用
pinvoke
),我有一个问题:

调用
GetThreadWaitChain
时,我得到WAITCHAIN\u NODE\u INFO数组的结果:

WAITCHAIN\u节点\u信息:

WAITCHAIN_NODE_INFO包含两个结构的并集-这意味着只有一个值是有效的,我如何知道从WAITCHAIN_NODE_INFO结构中获取哪些信息

目前我正在检查ProcessId和ThreadId是否为0,由此我假设另一半联合已初始化

这是我的C#WAITCHAIN_NODE_信息结构模型:

[StructLayout(LayoutKind.Sequential)]
public struct WAITCHAIN_NODE_INFO
{
    public WCT_OBJECT_TYPE ObjectType;
    public WCT_OBJECT_STATUS ObjectStatus;
    public _WAITCHAIN_NODE_INFO_UNION Union;
}


[StructLayout(LayoutKind.Explicit)]
public struct _WAITCHAIN_NODE_INFO_UNION
{
    [FieldOffset(0)]
    public _WAITCHAIN_NODE_INFO_LOCK_OBJECT LockObject;
    [FieldOffset(0)]
    public _WAITCHAIN_NODE_INFO_THREAD_OBJECT ThreadObject;
}

public unsafe struct _WAITCHAIN_NODE_INFO_LOCK_OBJECT
{
    /*The name of the object. Object names are only available for certain object, such as mutexes. If the object does not have a name, this member is an empty string.*/
    public fixed char ObjectName[WctApiConst.WCT_OBJNAME_LENGTH];
    /*This member is reserved for future use.*/
    public UInt64 Timeout;
    /*This member is reserved for future use.*/
    public UInt32 Alertable;
}

public struct _WAITCHAIN_NODE_INFO_THREAD_OBJECT
{
    /*The process identifier.*/
    public UInt32 ProcessId;
    /*The thread identifier. For COM and ALPC, this member can be 0.*/
    public UInt32 ThreadId;
    /*The wait time.*/
    public UInt32 WaitTime;
    /*The number of context switches.*/
    public UInt32 ContextSwitches;
}
有没有更好的方法来实现这一点


提前感谢

如果
ObjectType
WctThreadType
,那么您应该阅读union的
ThreadObject
部分。否则,您将读取union的
LockObject
部分


可以从MS提供的各种示例中收集到这种情况。例如:

我重新标记了这个。互操作其实并不重要。这是一个纯粹的winapi问题。