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 
23   ULONG Filler[4];
24   ULONGLONG Filler2[2];  // Assumed sizeof(LONGLONG) = sizeof(ULONGLONG)
25   struct {
26     ULONG Filler[14];
27   } Filler_RDMAB;
28   struct {
29     ULONG Filler[9];
30   } Filler_R;
31   struct {
32     ULONG Filler[4];
33     D3DKMTQS_COUNTER Filler2;
34   } Filler_P;
35   struct {
36     D3DKMTQS_COUNTER Filler[16];
37     ULONG Filler2[2];
38   } Filler_PF;
39   struct {
40     ULONGLONG Filler[8];
41   } Filler_PT;
42   struct {
43     ULONG Filler[2];
44   } Filler_SR;
45   struct {
46     ULONG Filler[7];
47   } Filler_L;
48   struct {
49     D3DKMTQS_COUNTER Filler[7];
50   } Filler_A;
51   struct {
52     D3DKMTQS_COUNTER Filler[4];
53   } Filler_T;
54   ULONG64 Reserved[8];
55 } D3DKMTQS_ADAPTER_INFO;
56 
57 typedef struct _D3DKMTQS_SEGMENT_INFO_WIN7 {
58   ULONG Filler[3];
59   struct {
60     ULONGLONG Filler;
61     ULONG Filler2[2];
62   } Filler_M;
63 
64   ULONG Aperture;
65 
66   ULONGLONG Filler3[5];
67   ULONG64 Filler4[8];
68 } D3DKMTQS_SEGMENT_INFO_WIN7;
69 
70 typedef struct _D3DKMTQS_SEGMENT_INFO_WIN8 {
71   ULONGLONG Filler[3];
72   struct {
73     ULONGLONG Filler;
74     ULONG Filler2[2];
75   } Filler_M;
76 
77   ULONG Aperture;
78 
79   ULONGLONG Filler3[5];
80   ULONG64 Filler4[8];
81 } D3DKMTQS_SEGMENT_INFO_WIN8;
82 
83 typedef struct _D3DKMTQS_SYSTEM_MEMORY {
84   ULONGLONG BytesAllocated;
85   ULONG Filler[2];
86   ULONGLONG Filler2[7];
87 } D3DKMTQS_SYSTEM_MEMORY;
88 
89 typedef struct _D3DKMTQS_PROCESS_INFO {
90   ULONG Filler[2];
91   struct {
92     ULONGLONG BytesAllocated;
93 
94     ULONG Filler[2];
95     ULONGLONG Filler2[7];
96   } SystemMemory;
97   ULONG64 Reserved[8];
98 } D3DKMTQS_PROCESS_INFO;
99 
100 typedef struct _D3DKMTQS_PROCESS_SEGMENT_INFO {
101   union {
102     struct {
103       ULONGLONG BytesCommitted;
104     } Win8;
105     struct {
106       ULONG BytesCommitted;
107       ULONG UnknownRandomness;
108     } Win7;
109   };
110 
111   ULONGLONG Filler[2];
112   ULONG Filler2;
113   struct {
114     ULONG Filler;
115     D3DKMTQS_COUNTER Filler2[6];
116     ULONGLONG Filler3;
117   } Filler3;
118   struct {
119     ULONGLONG Filler;
120   } Filler4;
121   ULONG64 Reserved[8];
122 } D3DKMTQS_PROCESS_SEGMENT_INFO;
123 
124 typedef enum _D3DKMTQS_TYPE {
125   D3DKMTQS_ADAPTER = 0,
126   D3DKMTQS_PROCESS = 1,
127   D3DKMTQS_SEGMENT = 3,
128   D3DKMTQS_PROCESS_SEGMENT = 4,
129 } D3DKMTQS_TYPE;
130 
131 typedef union _D3DKMTQS_RESULT {
132   D3DKMTQS_ADAPTER_INFO AdapterInfo;
133   D3DKMTQS_SEGMENT_INFO_WIN7 SegmentInfoWin7;
134   D3DKMTQS_SEGMENT_INFO_WIN8 SegmentInfoWin8;
135   D3DKMTQS_PROCESS_INFO ProcessInfo;
136   D3DKMTQS_PROCESS_SEGMENT_INFO ProcessSegmentInfo;
137 } D3DKMTQS_RESULT;
138 
139 typedef struct _D3DKMTQS_QUERY_SEGMENT {
140   ULONG SegmentId;
141 } D3DKMTQS_QUERY_SEGMENT;
142 
143 typedef struct _D3DKMTQS {
144   D3DKMTQS_TYPE Type;
145   LUID AdapterLuid;
146   HANDLE hProcess;
147   D3DKMTQS_RESULT QueryResult;
148 
149   union {
150     D3DKMTQS_QUERY_SEGMENT QuerySegment;
151     D3DKMTQS_QUERY_SEGMENT QueryProcessSegment;
152   };
153 } D3DKMTQS;
154 
155 extern "C" {
156 typedef __checkReturn NTSTATUS(APIENTRY* PFND3DKMTQS)(const D3DKMTQS*);
157 }
158