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