1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2  * This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 /* This file is based on a header file that was briefly seen in the
6  * Windows 8 RC SDK. The work for this file itself was based on the one in
7  * ProcessHacker at
8  * http://processhacker.svn.sourceforge.net/viewvc/processhacker/2.x/trunk/plugins/ExtendedTools/d3dkmt.h?revision=4758&view=markup
9  * For more details see Mozilla Bug 689870.
10  * [Bug 917496 indicates that some of these structs may not match reality, and
11  * therefore should not be trusted.  See the reference to bug 917496 in
12  * gfxWindowsPlatform.cpp.]
13  */
14 
15 typedef struct _D3DKMTQS_COUNTER {
16   ULONG Count;
17   ULONGLONG Bytes;
18 } D3DKMTQS_COUNTER;
19 
20 typedef struct _D3DKMTQS_ADAPTER_INFO {
21   ULONG NbSegments;
22   ULONG NodeCount;
23 
24   ULONG Filler[3];
25   ULONGLONG Filler2[2];  // Assumed sizeof(LONGLONG) = sizeof(ULONGLONG)
26   struct {
27     ULONG Filler[14];
28   } Filler_RDMAB;
29   struct {
30     ULONG Filler[9];
31   } Filler_R;
32   struct {
33     ULONG Filler[4];
34     D3DKMTQS_COUNTER Filler2;
35   } Filler_P;
36   struct {
37     D3DKMTQS_COUNTER Filler[16];
38     ULONG Filler2[2];
39   } Filler_PF;
40   struct {
41     ULONGLONG Filler[8];
42   } Filler_PT;
43   struct {
44     ULONG Filler[2];
45   } Filler_SR;
46   struct {
47     ULONG Filler[7];
48   } Filler_L;
49   struct {
50     D3DKMTQS_COUNTER Filler[7];
51   } Filler_A;
52   struct {
53     D3DKMTQS_COUNTER Filler[4];
54   } Filler_T;
55   ULONG64 Reserved[8];
56 } D3DKMTQS_ADAPTER_INFO;
57 
58 typedef struct _D3DKMTQS_SEGMENT_INFO_WIN7 {
59   ULONG Filler[3];
60   struct {
61     ULONGLONG Filler;
62     ULONG Filler2[2];
63   } Filler_M;
64 
65   ULONG Aperture;
66 
67   ULONGLONG Filler3[5];
68   ULONG64 Filler4[8];
69 } D3DKMTQS_SEGMENT_INFO_WIN7;
70 
71 typedef struct _D3DKMTQS_SEGMENT_INFO_WIN8 {
72   ULONGLONG Filler[3];
73   struct {
74     ULONGLONG Filler;
75     ULONG Filler2[2];
76   } Filler_M;
77 
78   ULONG Aperture;
79 
80   ULONGLONG Filler3[5];
81   ULONG64 Filler4[8];
82 } D3DKMTQS_SEGMENT_INFO_WIN8;
83 
84 typedef struct _D3DKMTQS_SYSTEM_MEMORY {
85   ULONGLONG BytesAllocated;
86   ULONG Filler[2];
87   ULONGLONG Filler2[7];
88 } D3DKMTQS_SYSTEM_MEMORY;
89 
90 typedef struct _D3DKMTQS_PROCESS_INFO {
91   ULONG Filler[2];
92   struct {
93     ULONGLONG BytesAllocated;
94 
95     ULONG Filler[2];
96     ULONGLONG Filler2[7];
97   } SystemMemory;
98   ULONG64 Reserved[8];
99 } D3DKMTQS_PROCESS_INFO;
100 
101 typedef struct _D3DKMTQS_PROCESS_SEGMENT_INFO {
102   union {
103     struct {
104       ULONGLONG BytesCommitted;
105     } Win8;
106     struct {
107       ULONG BytesCommitted;
108       ULONG UnknownRandomness;
109     } Win7;
110   };
111 
112   ULONGLONG Filler[2];
113   ULONG Filler2;
114   struct {
115     ULONG Filler;
116     D3DKMTQS_COUNTER Filler2[6];
117     ULONGLONG Filler3;
118   } Filler3;
119   struct {
120     ULONGLONG Filler;
121   } Filler4;
122   ULONG64 Reserved[8];
123 } D3DKMTQS_PROCESS_SEGMENT_INFO;
124 
125 typedef struct _D3DKMTQS_PROCESS_NODE_INFO {
126   LARGE_INTEGER RunningTime;  // 100ns
127   ULONG ContextSwitch;
128   ULONG PreemptionStatistics[16];
129   ULONG PacketStatistics[32];
130   ULONG64 Reserved[8];
131 } D3DKMTQS_PROCESS_NODE_INFO;
132 
133 typedef enum _D3DKMTQS_TYPE {
134   D3DKMTQS_ADAPTER = 0,
135   D3DKMTQS_PROCESS = 1,
136   D3DKMTQS_SEGMENT = 3,
137   D3DKMTQS_PROCESS_SEGMENT = 4,
138   D3DKMTQS_PROCESS_NODE = 6,
139 } D3DKMTQS_TYPE;
140 
141 typedef union _D3DKMTQS_RESULT {
142   D3DKMTQS_ADAPTER_INFO AdapterInfo;
143   D3DKMTQS_SEGMENT_INFO_WIN7 SegmentInfoWin7;
144   D3DKMTQS_SEGMENT_INFO_WIN8 SegmentInfoWin8;
145   D3DKMTQS_PROCESS_INFO ProcessInfo;
146   D3DKMTQS_PROCESS_SEGMENT_INFO ProcessSegmentInfo;
147   D3DKMTQS_PROCESS_NODE_INFO ProcessNodeInformation;
148 } D3DKMTQS_RESULT;
149 
150 typedef struct _D3DKMTQS_QUERY_SEGMENT {
151   ULONG SegmentId;
152 } D3DKMTQS_QUERY_SEGMENT;
153 
154 typedef struct _D3DKMTQS_QUERY_NODE {
155   ULONG NodeId;
156 } D3DKMTQS_QUERY_NODE;
157 
158 typedef struct _D3DKMTQS {
159   D3DKMTQS_TYPE Type;
160   LUID AdapterLuid;
161   HANDLE hProcess;
162   D3DKMTQS_RESULT QueryResult;
163 
164   union {
165     D3DKMTQS_QUERY_SEGMENT QuerySegment;
166     D3DKMTQS_QUERY_SEGMENT QueryProcessSegment;
167     D3DKMTQS_QUERY_NODE QueryProcessNode;
168   };
169 } D3DKMTQS;
170 
171 extern "C" {
172 typedef __checkReturn NTSTATUS(APIENTRY* PFND3DKMTQS)(const D3DKMTQS*);
173 }
174