ReactOS 0.4.17-dev-806-gffa4164
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 va_end(list);
114#if defined(VIRTIO_DBG_USE_IOPORT)
115 {
117 // use this way of output only for DISPATCH_LEVEL,
118 // higher requires more protection
120 {
121 char buf[256];
122 size_t len, i;
123 buf[0] = 0;
124 // The list was consumed above; start a fresh one for the second pass
125 va_start(list, fmt);
127 va_end(list);
129 else if (status == STATUS_BUFFER_OVERFLOW) len = sizeof(buf);
130 else { memcpy(buf, "Can't print", 11); len = 11; }
132 for (i = 0; i < len; ++i)
133 {
134 NdisRawWritePortUchar(VIRTIO_DBG_USE_IOPORT, buf[i]);
135 }
136 NdisRawWritePortUchar(VIRTIO_DBG_USE_IOPORT, '\n');
138 }
139 }
140#endif
141}
142
145
146#else //DPFLTR_MASK
147#pragma message("DebugPrint for Win2K")
148
151
152#endif //DPFLTR_MASK
153#endif
154
155
156
157void _LogOutEntry(int level, const char *s)
158{
159 DPrintf(level, ("[%s]=>", s));
160}
161
162void _LogOutExitValue(int level, const char *s, ULONG value)
163{
164 DPrintf(level, ("[%s]<=0x%X", s, value));
165}
166
167void _LogOutString(int level, const char *s)
168{
169 DPrintf(level, ("[%s]", s));
170}
171
174 __in __int64 Logger,
178{
179#if WPP_USE_BYPASS
180 DPrintfBypass(0, ("[%s] %s, flags %X, level %d",
181 __FUNCTION__, Enable ? "enabled" : "disabled",
182 Flags, (ULONG)Level));
183#endif
186}
187
188
189#ifdef OVERRIDE_DEBUG_BREAK
190static PUCHAR pDbgBreakPoint;
191static UCHAR DbgBreakPointChunk[5];
192static void AnotherDbgBreak()
193{
194 DPrintf(0, ("Somebody tried to break into the debugger!"));
195}
196#endif
197
199{
200 NDIS_STRING usRegister, usDeregister, usPrint;
201 PVOID pr, pd;
202 BOOLEAN res;
204
208 NdisInitUnicodeString(&usPrint, L"vDbgPrintEx");
209 NdisInitUnicodeString(&usRegister, L"KeRegisterBugCheckReasonCallback");
210 NdisInitUnicodeString(&usDeregister, L"KeDeregisterBugCheckReasonCallback");
211 pd = MmGetSystemRoutineAddress(&usPrint);
212 if (pd) PrintProcedure = (vDbgPrintExType)pd;
213 pr = MmGetSystemRoutineAddress(&usRegister);
214 pd = MmGetSystemRoutineAddress(&usDeregister);
215 if (pr && pd)
216 {
219 }
220 res = BugCheckRegisterCallback(&CallbackRecord, ParaNdis_OnBugCheck, KbCallbackSecondaryDumpData, "NetKvm");
221 DPrintf(0, ("[%s] Crash callback %sregistered", __FUNCTION__, res ? "" : "NOT "));
222
223#ifdef OVERRIDE_DEBUG_BREAK
224 if (sizeof(PVOID) == sizeof(ULONG))
225 {
226 UCHAR replace[5] = {0xe9,0,0,0,0};
227 ULONG replacement;
228 NDIS_STRING usDbgBreakPointName;
229 NdisInitUnicodeString(&usDbgBreakPointName, L"DbgBreakPoint");
230 pDbgBreakPoint = (PUCHAR)MmGetSystemRoutineAddress(&usDbgBreakPointName);
231 if (pDbgBreakPoint)
232 {
233 DPrintf(0, ("Replacing original BP handler at %p", pDbgBreakPoint));
234 replacement = RtlPointerToOffset(pDbgBreakPoint + 5, AnotherDbgBreak);
235 RtlCopyMemory(replace + 1, &replacement, sizeof(replacement));
236 RtlCopyMemory(DbgBreakPointChunk, pDbgBreakPoint, sizeof(DbgBreakPointChunk));
237 RtlCopyMemory(pDbgBreakPoint, replace, sizeof(replace));
238 }
239 }
240#endif
241}
242
244{
245#ifdef OVERRIDE_DEBUG_BREAK
246 if (sizeof(PVOID) == sizeof(ULONG) && pDbgBreakPoint)
247 {
248 DPrintf(0, ("Restoring original BP handler at %p", pDbgBreakPoint));
249 RtlCopyMemory(pDbgBreakPoint, DbgBreakPointChunk, sizeof(DbgBreakPointChunk));
250 }
251#endif
253 WPP_CLEANUP(pDriverObject);
254}
255
256
257#define MAX_CONTEXTS 4
258#if defined(ENABLE_HISTORY_LOG)
259#define MAX_HISTORY 0x40000
260#else
261#define MAX_HISTORY 2
262#endif
264{
270
271
272typedef struct _tagBugCheckData
273{
277
280
282{
296}
297
299{
300 UINT i;
302 for (i = 0; i < MAX_CONTEXTS; ++i)
303 {
304 UINT64 val1 = bRegister ? 0 : (UINT_PTR)pContext;
305 UINT64 val2 = bRegister ? (UINT_PTR)pContext : 0;
306 if (BugCheckData.StaticData.PerNicData[i].Context != val1) continue;
308 break;
309 }
311}
312
314{
315 UINT i, n = 0;
317 for (i = 0; i < MAX_CONTEXTS; ++i)
318 {
321 if (!p) continue;
322 pSave->nofPacketsToComplete = p->NetTxPacketsToReturn;
323 pSave->nofReadyTxBuffers = p->nofFreeHardwareBuffers;
325 pSave->LastTxCompletionTimeStamp = p->LastTxCompletionTimeStamp;
327 ++n;
328 }
329 return n;
330}
331
337 )
338{
340 if (KbCallbackSecondaryDumpData == Reason && ReasonSpecificDataLength >= sizeof(*pDump))
341 {
342 ULONG dumpSize = sizeof(BugCheckData.Location);
343 if (!pDump->OutBuffer)
344 {
345 UINT nSaved;
346 nSaved = FillDataOnBugCheck();
347 if (pDump->InBufferLength >= dumpSize)
348 {
349 pDump->OutBuffer = pDump->InBuffer;
350 pDump->OutBufferLength = dumpSize;
351 }
352 else
353 {
355 pDump->OutBufferLength = dumpSize;
356 bNative = FALSE;
357 }
358 DPrintf(0, ("[%s] system buffer of %d, saving data for %d NIC", __FUNCTION__,pDump->InBufferLength, nSaved));
359 DPrintf(0, ("[%s] using %s buffer", __FUNCTION__, bNative ? "native" : "own"));
360 }
361 else if (pDump->OutBuffer == pDump->InBuffer)
362 {
363 RtlCopyMemory(&pDump->Guid, &ParaNdis_CrashGuid, sizeof(pDump->Guid));
364 RtlCopyMemory(pDump->InBuffer, &BugCheckData.Location, dumpSize);
365 pDump->OutBufferLength = dumpSize;
367 DPrintf(0, ("[%s] dump data (%d) at %p", __FUNCTION__, pDump->OutBufferLength, pDump->OutBuffer));
368 }
369 }
370}
371
372#if defined(ENABLE_HISTORY_LOG)
374 PARANDIS_ADAPTER *pContext,
376 PVOID pParam1,
377 ULONG lParam2,
378 ULONG lParam3,
379 ULONG lParam4)
380{
383 index = (index - 1) % MAX_HISTORY;
385 phe->Context = (UINT_PTR)pContext;
386 phe->operation = op;
387 phe->pParam1 = (UINT_PTR)pParam1;
388 phe->lParam2 = lParam2;
389 phe->lParam3 = lParam3;
390 phe->lParam4 = lParam4;
391#if (PARANDIS_DEBUG_HISTORY_DATA_VERSION == 1)
392 phe->uIRQL = KeGetCurrentIrql();
394#endif
396}
397
398#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
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
unsigned char BOOLEAN
Definition: actypes.h:127
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
#define InterlockedIncrement
Definition: armddk.h:53
LONG NTSTATUS
Definition: precomp.h:26
#define index(s, c)
Definition: various.h:29
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
_In_ ULONG _In_ UCHAR Level
Definition: dispmprt.h:1329
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT op
Definition: effect.c:236
#define __cdecl
Definition: corecrt.h:121
#define __int64
Definition: corecrt.h:72
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
char * va_list
Definition: vadefs.h:50
@ DPFLTR_DEFAULT_ID
Definition: dpfilter.h:129
#define L(x)
Definition: resources.c:13
#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
unsigned int UINT
Definition: sysinfo.c:13
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
#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:404
_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 BOOLEAN
Definition: pedump.c:73
INT replace(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], DWORD dwFlags, BOOL *doMore)
Definition: replace.c:38
#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:3669
unsigned char UCHAR
Definition: typedefs.h:53
#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:96
_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
#define KeInitializeCallbackRecord(CallbackRecord)
Definition: kefuncs.h:1378
_In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD _Inout_ PVOID _In_ ULONG ReasonSpecificDataLength
Definition: ketypes.h:322
_In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD _Inout_ PVOID ReasonSpecificData
Definition: ketypes.h:321
_In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD * Record
Definition: ketypes.h:320
KBUGCHECK_CALLBACK_REASON
Definition: ketypes.h:311
KBUGCHECK_REASON_CALLBACK_ROUTINE * PKBUGCHECK_REASON_CALLBACK_ROUTINE
Definition: ketypes.h:323
_In_ ULONG Component
Definition: potypes.h:499