ReactOS 0.4.15-dev-8127-g6338913
ParaNdis-Debug.c
Go to the documentation of this file.
1/*
2 * This file contains debug support procedures, common for NDIS5 and NDIS6
3 *
4 * Copyright (c) 2008-2017 Red Hat, Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met :
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and / or other materials provided with the distribution.
14 * 3. Neither the names of the copyright holders nor the names of their contributors
15 * may be used to endorse or promote products derived from this software
16 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29#include "ndis56common.h"
30#include "stdarg.h"
31#include "ntstrsafe.h"
32
33//#define OVERRIDE_DEBUG_BREAK
34
35#ifdef WPP_EVENT_TRACING
36#include "ParaNdis-Debug.tmh"
37#endif
38
42
44
45static KBUGCHECK_REASON_CALLBACK_ROUTINE ParaNdis_OnBugCheck;
51);
53
59 );
60
63 );
64
70 );
71
77 )
78{
79 return 0;
80}
86 )
87{
89 return FALSE;
90}
91
94 )
95{
96 return FALSE;
97}
98
103
104#if !defined(WPP_EVENT_TRACING) || defined(WPP_USE_BYPASS)
105#if defined(DPFLTR_MASK)
106
107//common case, except Win2K
108static void __cdecl DebugPrint(const char *fmt, ...)
109{
111 va_start(list, fmt);
113#if defined(VIRTIO_DBG_USE_IOPORT)
114 {
116 // use this way of output only for DISPATCH_LEVEL,
117 // higher requires more protection
119 {
120 char buf[256];
121 size_t len, i;
122 buf[0] = 0;
125 else if (status == STATUS_BUFFER_OVERFLOW) len = sizeof(buf);
126 else { memcpy(buf, "Can't print", 11); len = 11; }
128 for (i = 0; i < len; ++i)
129 {
130 NdisRawWritePortUchar(VIRTIO_DBG_USE_IOPORT, buf[i]);
131 }
132 NdisRawWritePortUchar(VIRTIO_DBG_USE_IOPORT, '\n');
134 }
135 }
136#endif
137}
138
141
142#else //DPFLTR_MASK
143#pragma message("DebugPrint for Win2K")
144
147
148#endif //DPFLTR_MASK
149#endif
150
151
152
153void _LogOutEntry(int level, const char *s)
154{
155 DPrintf(level, ("[%s]=>", s));
156}
157
158void _LogOutExitValue(int level, const char *s, ULONG value)
159{
160 DPrintf(level, ("[%s]<=0x%X", s, value));
161}
162
163void _LogOutString(int level, const char *s)
164{
165 DPrintf(level, ("[%s]", s));
166}
167
170 __in __int64 Logger,
174{
175#if WPP_USE_BYPASS
176 DPrintfBypass(0, ("[%s] %s, flags %X, level %d",
177 __FUNCTION__, Enable ? "enabled" : "disabled",
178 Flags, (ULONG)Level));
179#endif
182}
183
184
185#ifdef OVERRIDE_DEBUG_BREAK
186static PUCHAR pDbgBreakPoint;
187static UCHAR DbgBreakPointChunk[5];
188static void AnotherDbgBreak()
189{
190 DPrintf(0, ("Somebody tried to break into the debugger!"));
191}
192#endif
193
195{
196 NDIS_STRING usRegister, usDeregister, usPrint;
197 PVOID pr, pd;
198 BOOLEAN res;
200
204 NdisInitUnicodeString(&usPrint, L"vDbgPrintEx");
205 NdisInitUnicodeString(&usRegister, L"KeRegisterBugCheckReasonCallback");
206 NdisInitUnicodeString(&usDeregister, L"KeDeregisterBugCheckReasonCallback");
207 pd = MmGetSystemRoutineAddress(&usPrint);
208 if (pd) PrintProcedure = (vDbgPrintExType)pd;
209 pr = MmGetSystemRoutineAddress(&usRegister);
210 pd = MmGetSystemRoutineAddress(&usDeregister);
211 if (pr && pd)
212 {
215 }
216 res = BugCheckRegisterCallback(&CallbackRecord, ParaNdis_OnBugCheck, KbCallbackSecondaryDumpData, "NetKvm");
217 DPrintf(0, ("[%s] Crash callback %sregistered", __FUNCTION__, res ? "" : "NOT "));
218
219#ifdef OVERRIDE_DEBUG_BREAK
220 if (sizeof(PVOID) == sizeof(ULONG))
221 {
222 UCHAR replace[5] = {0xe9,0,0,0,0};
223 ULONG replacement;
224 NDIS_STRING usDbgBreakPointName;
225 NdisInitUnicodeString(&usDbgBreakPointName, L"DbgBreakPoint");
226 pDbgBreakPoint = (PUCHAR)MmGetSystemRoutineAddress(&usDbgBreakPointName);
227 if (pDbgBreakPoint)
228 {
229 DPrintf(0, ("Replacing original BP handler at %p", pDbgBreakPoint));
230 replacement = RtlPointerToOffset(pDbgBreakPoint + 5, AnotherDbgBreak);
231 RtlCopyMemory(replace + 1, &replacement, sizeof(replacement));
232 RtlCopyMemory(DbgBreakPointChunk, pDbgBreakPoint, sizeof(DbgBreakPointChunk));
233 RtlCopyMemory(pDbgBreakPoint, replace, sizeof(replace));
234 }
235 }
236#endif
237}
238
240{
241#ifdef OVERRIDE_DEBUG_BREAK
242 if (sizeof(PVOID) == sizeof(ULONG) && pDbgBreakPoint)
243 {
244 DPrintf(0, ("Restoring original BP handler at %p", pDbgBreakPoint));
245 RtlCopyMemory(pDbgBreakPoint, DbgBreakPointChunk, sizeof(DbgBreakPointChunk));
246 }
247#endif
249 WPP_CLEANUP(pDriverObject);
250}
251
252
253#define MAX_CONTEXTS 4
254#if defined(ENABLE_HISTORY_LOG)
255#define MAX_HISTORY 0x40000
256#else
257#define MAX_HISTORY 2
258#endif
260{
266
267
268typedef struct _tagBugCheckData
269{
273
276
278{
292}
293
295{
296 UINT i;
298 for (i = 0; i < MAX_CONTEXTS; ++i)
299 {
300 UINT64 val1 = bRegister ? 0 : (UINT_PTR)pContext;
301 UINT64 val2 = bRegister ? (UINT_PTR)pContext : 0;
302 if (BugCheckData.StaticData.PerNicData[i].Context != val1) continue;
304 break;
305 }
307}
308
310{
311 UINT i, n = 0;
313 for (i = 0; i < MAX_CONTEXTS; ++i)
314 {
317 if (!p) continue;
318 pSave->nofPacketsToComplete = p->NetTxPacketsToReturn;
319 pSave->nofReadyTxBuffers = p->nofFreeHardwareBuffers;
321 pSave->LastTxCompletionTimeStamp = p->LastTxCompletionTimeStamp;
323 ++n;
324 }
325 return n;
326}
327
333 )
334{
336 if (KbCallbackSecondaryDumpData == Reason && ReasonSpecificDataLength >= sizeof(*pDump))
337 {
338 ULONG dumpSize = sizeof(BugCheckData.Location);
339 if (!pDump->OutBuffer)
340 {
341 UINT nSaved;
342 nSaved = FillDataOnBugCheck();
343 if (pDump->InBufferLength >= dumpSize)
344 {
345 pDump->OutBuffer = pDump->InBuffer;
346 pDump->OutBufferLength = dumpSize;
347 }
348 else
349 {
351 pDump->OutBufferLength = dumpSize;
352 bNative = FALSE;
353 }
354 DPrintf(0, ("[%s] system buffer of %d, saving data for %d NIC", __FUNCTION__,pDump->InBufferLength, nSaved));
355 DPrintf(0, ("[%s] using %s buffer", __FUNCTION__, bNative ? "native" : "own"));
356 }
357 else if (pDump->OutBuffer == pDump->InBuffer)
358 {
359 RtlCopyMemory(&pDump->Guid, &ParaNdis_CrashGuid, sizeof(pDump->Guid));
360 RtlCopyMemory(pDump->InBuffer, &BugCheckData.Location, dumpSize);
361 pDump->OutBufferLength = dumpSize;
363 DPrintf(0, ("[%s] dump data (%d) at %p", __FUNCTION__, pDump->OutBufferLength, pDump->OutBuffer));
364 }
365 }
366}
367
368#if defined(ENABLE_HISTORY_LOG)
370 PARANDIS_ADAPTER *pContext,
372 PVOID pParam1,
373 ULONG lParam2,
374 ULONG lParam3,
375 ULONG lParam4)
376{
379 index = (index - 1) % MAX_HISTORY;
381 phe->Context = (UINT_PTR)pContext;
382 phe->operation = op;
383 phe->pParam1 = (UINT_PTR)pParam1;
384 phe->lParam2 = lParam2;
385 phe->lParam3 = lParam3;
386 phe->lParam4 = lParam4;
387#if (PARANDIS_DEBUG_HISTORY_DATA_VERSION == 1)
388 phe->uIRQL = KeGetCurrentIrql();
390#endif
392}
393
394#endif
#define PARANDIS_DEBUG_PER_NIC_DATA_VERSION
Definition: DebugData.h:92
tBugCheckHistoryDataEntry_V1 tBugCheckHistoryDataEntry
Definition: DebugData.h:161
static const GUID ParaNdis_CrashGuid
Definition: DebugData.h:68
#define PARANDIS_DEBUG_HISTORY_DATA_VERSION
Definition: DebugData.h:93
enum _etagHistoryLogOperation eHistoryLogOperation
#define PARANDIS_GET_LAST_INTERRUPT_TIMESTAMP(p)
Definition: DebugData.h:109
#define PARANDIS_DEBUG_STATIC_DATA_VERSION
Definition: DebugData.h:91
static tBugCheckData BugCheckData
static BOOLEAN bNative
DEBUGPRINTFUNC VirtioDebugPrintProc
void ParaNdis_DebugCleanup(PDRIVER_OBJECT pDriverObject)
BOOLEAN(NTAPI * KeDeregisterBugCheckReasonCallbackType)(__inout PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord)
BOOLEAN(NTAPI * KeRegisterBugCheckReasonCallbackType)(__out PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, __in PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, __in KBUGCHECK_CALLBACK_REASON Reason, __in PUCHAR Component)
struct _tagBugCheckData tBugCheckData
struct _tagBugCheckStaticData tBugCheckStaticData
static KeRegisterBugCheckReasonCallbackType BugCheckRegisterCallback
ULONG(NTAPI * vDbgPrintExType)(__in ULONG ComponentId, __in ULONG Level, __in PCCH Format, __in va_list arglist)
void ParaNdis_DebugInitialize(PVOID DriverObject, PVOID RegistryPath)
void _LogOutEntry(int level, const char *s)
defined(WPP_EVENT_TRACING) || defined(WPP_USE_BYPASS)
static UINT FillDataOnBugCheck()
VOID WppEnableCallback(__in LPCGUID Guid, __in __int64 Logger, __in BOOLEAN Enable, __in ULONG Flags, __in UCHAR Level)
BOOLEAN NTAPI KeDeregisterBugCheckReasonCallbackDummyProc(__inout PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord)
static NDIS_SPIN_LOCK CrashLock
void ParaNdis_DebugRegisterMiniport(PARANDIS_ADAPTER *pContext, BOOLEAN bRegister)
static ULONG NTAPI DummyPrintProcedure(__in ULONG ComponentId, __in ULONG Level, __in PCCH Format, __in va_list arglist)
static VOID ParaNdis_PrepareBugCheckData()
int nDebugLevel
#define MAX_CONTEXTS
static KeDeregisterBugCheckReasonCallbackType BugCheckDeregisterCallback
int bDebugPrint
#define MAX_HISTORY
void _LogOutString(int level, const char *s)
static vDbgPrintExType PrintProcedure
DEBUGPRINTFUNC pDebugPrint
void _LogOutExitValue(int level, const char *s, ULONG value)
static BOOLEAN NTAPI KeRegisterBugCheckReasonCallbackDummyProc(__out PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, __in PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, __in KBUGCHECK_CALLBACK_REASON Reason, __in PUCHAR Component)
int virtioDebugLevel
static KBUGCHECK_REASON_CALLBACK_ROUTINE ParaNdis_OnBugCheck
KBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
unsigned char BOOLEAN
unsigned long long UINT64
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define __cdecl
Definition: accygwin.h:79
char * va_list
Definition: acmsvcex.h:78
#define va_start(ap, A)
Definition: acmsvcex.h:91
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 ComponentId
Definition: acpixf.h:1281
#define InterlockedIncrement
Definition: armddk.h:53
LONG NTSTATUS
Definition: precomp.h:26
#define index(s, c)
Definition: various.h:29
#define __int64
Definition: basetyps.h:16
Definition: list.h:37
#define DebugPrint(x)
Definition: classpnp.h:125
#define __in
Definition: dbghelp.h:35
#define __inout
Definition: dbghelp.h:50
#define __out
Definition: dbghelp.h:62
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT op
Definition: effect.c:236
@ DPFLTR_DEFAULT_ID
Definition: dpfilter.h:129
#define __FUNCTION__
Definition: types.h:116
#define WPP_INIT_TRACING(a, b)
Definition: kdebugprint.h:56
#define DPrintf(Level, Fmt)
Definition: kdebugprint.h:61
#define DPrintfBypass(Level, Fmt)
Definition: kdebugprint.h:63
void(* DEBUGPRINTFUNC)(const char *fmt,...)
Definition: kdebugprint.h:42
#define WPP_CLEANUP(a)
Definition: kdebugprint.h:57
VOID EXPORT NdisInitUnicodeString(IN OUT PNDIS_STRING DestinationString, IN PCWSTR SourceString)
Definition: string.c:130
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
_Must_inspect_result_ _In_ PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine
Definition: fltkernel.h:1035
GLint level
Definition: gl.h:1546
GLdouble s
Definition: gl.h:2039
GLdouble n
Definition: glext.h:7729
GLuint res
Definition: glext.h:9613
GLuint index
Definition: glext.h:6031
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define DbgPrint
Definition: hal.h:12
if(dx< 0)
Definition: linetemp.h:194
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
PVOID PVOID PWCHAR PVOID USHORT PULONG Reason
Definition: env.c:47
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
#define RtlPointerToOffset(Base, Pointer)
Definition: ndis56common.h:54
void ParaNdis_CallOnBugCheck(PARANDIS_ADAPTER *pContext)
static void FORCEINLINE ParaNdis_DebugHistory(PARANDIS_ADAPTER *pContext, eHistoryLogOperation op, PVOID pParam1, ULONG lParam2, ULONG lParam3, ULONG lParam4)
Definition: ndis56common.h:647
#define NdisReleaseSpinLock(_SpinLock)
Definition: ndis.h:4115
unsigned int UINT
Definition: ndis.h:50
#define NdisAllocateSpinLock(_SpinLock)
Definition: ndis.h:4088
#define NdisGetCurrentSystemTime
Definition: ndis.h:4462
#define NdisRawWritePortUchar(Port, Data)
Definition: ndis.h:4230
#define NdisAcquireSpinLock(_SpinLock)
Definition: ndis.h:4106
#define DPFLTR_MASK
Definition: kdtypes.h:34
CONST CHAR * PCCH
Definition: ntbasedef.h:392
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
NTSTRSAFEAPI RtlStringCbVPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, _In_ va_list argList)
Definition: ntstrsafe.h:1034
#define L(x)
Definition: ntvdm.h:50
#define BOOLEAN
Definition: pedump.c:73
INT replace(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], DWORD dwFlags, BOOL *doMore)
Definition: replace.c:47
#define list
Definition: rosglue.h:35
FORCEINLINE ULONG KeGetCurrentProcessorNumber(VOID)
Definition: ke.h:341
va_lists_t arglist[FMT_ARGMAX+1]
Definition: format.c:284
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
tBugCheckDataLocation Location
tBugCheckStaticData StaticData
LARGE_INTEGER LastInterruptTimeStamp
Definition: DebugData.h:119
LARGE_INTEGER LastTxCompletionTimeStamp
Definition: DebugData.h:120
LARGE_INTEGER qCrashTime
Definition: DebugData.h:78
tBugCheckStaticDataContent Data
tBugCheckHistoryDataEntry History[MAX_HISTORY]
tBugCheckPerNicDataContent PerNicData[MAX_CONTEXTS]
tBugCheckStaticDataHeader Header
Definition: dsound.c:943
Definition: ps.c:97
PVOID NTAPI MmGetSystemRoutineAddress(IN PUNICODE_STRING SystemRoutineName)
Definition: sysldr.c:3604
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define IN
Definition: typedefs.h:39
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
LONGLONG QuadPart
Definition: typedefs.h:114
Definition: pdh_main.c:94
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
Definition: wdfobject.h:762
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define KeInitializeCallbackRecord(CallbackRecord)
Definition: kefuncs.h:1387
_In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD _Inout_ PVOID _In_ ULONG ReasonSpecificDataLength
Definition: ketypes.h:270
_In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD _Inout_ PVOID ReasonSpecificData
Definition: ketypes.h:269
_In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD * Record
Definition: ketypes.h:268
KBUGCHECK_CALLBACK_REASON
Definition: ketypes.h:259
KBUGCHECK_REASON_CALLBACK_ROUTINE * PKBUGCHECK_REASON_CALLBACK_ROUTINE
Definition: ketypes.h:271
_In_ ULONG Component
Definition: potypes.h:496
unsigned char UCHAR
Definition: xmlstorage.h:181