1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
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 ProcessHacker at
7  * http://processhacker.svn.sourceforge.net/viewvc/processhacker/2.x/trunk/plugins/ExtendedTools/d3dkmt.h?revision=4758&view=markup
8  * For more details see Mozilla Bug 689870.
9  * [Bug 917496 indicates that some of these structs may not match reality, and
10  * therefore should not be trusted.  See the reference to bug 917496 in
11  * gfxWindowsPlatform.cpp.]
12  */
13 
14 typedef struct _D3DKMTQS_COUNTER
15 {
16     ULONG Count;
17     ULONGLONG Bytes;
18 } D3DKMTQS_COUNTER;
19 
20 typedef struct _D3DKMTQS_ADAPTER_INFO
21 {
22     ULONG NbSegments;
23 
24     ULONG Filler[4];
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 {
60     ULONG Filler[3];
61     struct {
62         ULONGLONG Filler;
63         ULONG Filler2[2];
64     } Filler_M;
65 
66     ULONG Aperture;
67 
68     ULONGLONG Filler3[5];
69     ULONG64 Filler4[8];
70 } D3DKMTQS_SEGMENT_INFO_WIN7;
71 
72 typedef struct _D3DKMTQS_SEGMENT_INFO_WIN8
73 {
74     ULONGLONG Filler[3];
75     struct {
76         ULONGLONG Filler;
77         ULONG Filler2[2];
78     } Filler_M;
79 
80     ULONG Aperture;
81 
82     ULONGLONG Filler3[5];
83     ULONG64 Filler4[8];
84 } D3DKMTQS_SEGMENT_INFO_WIN8;
85 
86 typedef struct _D3DKMTQS_SYSTEM_MEMORY
87 {
88     ULONGLONG BytesAllocated;
89     ULONG Filler[2];
90     ULONGLONG Filler2[7];
91 } D3DKMTQS_SYSTEM_MEMORY;
92 
93 typedef struct _D3DKMTQS_PROCESS_INFO
94 {
95     ULONG Filler[2];
96     struct {
97         ULONGLONG BytesAllocated;
98 
99         ULONG Filler[2];
100         ULONGLONG Filler2[7];
101     } SystemMemory;
102     ULONG64 Reserved[8];
103 } D3DKMTQS_PROCESS_INFO;
104 
105 typedef struct _D3DKMTQS_PROCESS_SEGMENT_INFO
106 {
107     union {
108         struct {
109             ULONGLONG BytesCommitted;
110         } Win8;
111         struct {
112             ULONG BytesCommitted;
113             ULONG UnknownRandomness;
114         } Win7;
115     };
116 
117     ULONGLONG Filler[2];
118     ULONG Filler2;
119     struct {
120         ULONG Filler;
121         D3DKMTQS_COUNTER Filler2[6];
122         ULONGLONG Filler3;
123     } Filler3;
124     struct {
125         ULONGLONG Filler;
126     } Filler4;
127     ULONG64 Reserved[8];
128 } D3DKMTQS_PROCESS_SEGMENT_INFO;
129 
130 typedef enum _D3DKMTQS_TYPE
131 {
132     D3DKMTQS_ADAPTER = 0,
133     D3DKMTQS_PROCESS = 1,
134     D3DKMTQS_SEGMENT = 3,
135     D3DKMTQS_PROCESS_SEGMENT = 4,
136 } D3DKMTQS_TYPE;
137 
138 typedef union _D3DKMTQS_RESULT
139 {
140     D3DKMTQS_ADAPTER_INFO AdapterInfo;
141     D3DKMTQS_SEGMENT_INFO_WIN7 SegmentInfoWin7;
142     D3DKMTQS_SEGMENT_INFO_WIN8 SegmentInfoWin8;
143     D3DKMTQS_PROCESS_INFO ProcessInfo;
144     D3DKMTQS_PROCESS_SEGMENT_INFO ProcessSegmentInfo;
145 } D3DKMTQS_RESULT;
146 
147 typedef struct _D3DKMTQS_QUERY_SEGMENT
148 {
149     ULONG SegmentId;
150 } D3DKMTQS_QUERY_SEGMENT;
151 
152 typedef struct _D3DKMTQS
153 {
154     D3DKMTQS_TYPE Type;
155     LUID AdapterLuid;
156     HANDLE hProcess;
157     D3DKMTQS_RESULT QueryResult;
158 
159     union
160     {
161         D3DKMTQS_QUERY_SEGMENT QuerySegment;
162         D3DKMTQS_QUERY_SEGMENT QueryProcessSegment;
163     };
164 } D3DKMTQS;
165 
166 extern "C" {
167 typedef __checkReturn NTSTATUS (APIENTRY *PFND3DKMTQS)(const D3DKMTQS *);
168 }
169