|
|
1.1 root 1: /*++ BUILD Version: 0045 // Increment this if a change has global effects
2:
3: Copyright (c) 1990-1992 Microsoft Corporation
4:
5: Module Name:
6:
7: windbgkd.h
8:
9: Abstract:
10:
11: This module defines the 32-Bit Windows Kernel Debugger interface.
12:
13: Revision History:
14:
15: --*/
16:
17: #ifndef _WINDBGKD_
18: #define _WINDBGKD_
19:
20: typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;
21:
22: #ifdef _X86_
23:
24: //
25: // DBGKD_CONTROL_REPORT
26: //
27: // This structure contains machine specific data passed to the debugger
28: // when a Wait_State_Change message is sent. Idea is to allow debugger
29: // to do what it needes without reading any more packets.
30: // Structure is filled in by KdpSetControlReport
31: //
32:
33: #define DBGKD_MAXSTREAM 16
34:
35: typedef struct _DBGKD_CONTROL_REPORT {
36: DWORD Dr6;
37: DWORD Dr7;
38: WORD InstructionCount;
39: WORD ReportFlags;
40: BYTE InstructionStream[DBGKD_MAXSTREAM];
41: WORD SegCs;
42: WORD SegDs;
43: WORD SegEs;
44: WORD SegFs;
45: DWORD EFlags;
46: } DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
47:
48: #define REPORT_INCLUDES_SEGS 0x0001 // this is for backward compatibility
49:
50: //
51: // DBGKD_CONTROL_SET
52: //
53: // This structure control value the debugger wants to set on every
54: // continue, and thus sets here to avoid packet traffic.
55: //
56:
57: typedef struct _DBGKD_CONTROL_SET {
58: DWORD TraceFlag; // WARNING: This must NOT be a BOOLEAN,
59: // or host and target will end
60: // up with different alignments!
61: DWORD Dr7;
62: DWORD CurrentSymbolStart; // Range in which to trace locally
63: DWORD CurrentSymbolEnd;
64: } DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET;
65:
66: #endif //_X86_
67:
68:
69: typedef struct _DESCRIPTOR_TABLE_ENTRY {
70: DWORD Selector;
71: LDT_ENTRY Descriptor;
72: } DESCRIPTOR_TABLE_ENTRY, *PDESCRIPTOR_TABLE_ENTRY;
73:
74:
75: #if defined(_MIPS_)
76:
77: // end_ntddk end_nthal
78:
79: //
80: // Define MIPS specific kernel debugger information.
81: //
82: // The following structure contains machine specific data passed to
83: // the host system kernel debugger in a wait state change message.
84: //
85:
86: #define DBGKD_MAXSTREAM 16
87:
88: typedef struct _DBGKD_CONTROL_REPORT {
89: DWORD InstructionCount;
90: BYTE InstructionStream[DBGKD_MAXSTREAM];
91: } DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
92:
93: //
94: // The following structure contains information that the host system
95: // kernel debugger wants to set on every continue operation and avoids
96: // the need to send extra packets of information.
97: //
98:
99: typedef DWORD DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET;
100:
101: #endif // ntddk nthal
102:
103: #ifdef _ALPHA_
104:
105: //
106: // Define Alpha specific kernel debugger information.
107: //
108: // The following structure contains machine specific data passed to
109: // the host system kernel debugger in a wait state change message.
110: //
111:
112: #define DBGKD_MAXSTREAM 16
113:
114: typedef struct _DBGKD_CONTROL_REPORT {
115: DWORD InstructionCount;
116: BYTE InstructionStream[DBGKD_MAXSTREAM];
117: } DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
118:
119: //
120: // The following structure contains information that the host system
121: // kernel debugger wants to set on every continue operation and avoids
122: // the need to send extra packets of information.
123: //
124:
125: typedef DWORD DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET;
126:
127: #endif // _ALPHA_
128:
129: #ifdef _X86_
130: //
131: // Special Registers for i386
132: //
133:
134: typedef struct _DESCRIPTOR {
135: WORD Pad;
136: WORD Limit;
137: DWORD Base;
138: } KDESCRIPTOR, *PKDESCRIPTOR;
139:
140: typedef struct _KSPECIAL_REGISTERS {
141: DWORD Cr0;
142: DWORD Cr2;
143: DWORD Cr3;
144: DWORD Cr4;
145: DWORD KernelDr0;
146: DWORD KernelDr1;
147: DWORD KernelDr2;
148: DWORD KernelDr3;
149: DWORD KernelDr6;
150: DWORD KernelDr7;
151: KDESCRIPTOR Gdtr;
152: KDESCRIPTOR Idtr;
153: WORD Tr;
154: WORD Ldtr;
155: DWORD Reserved[6];
156: } KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
157:
158: //
159: // Processor State frame: Before a processor freezes itself, it
160: // dumps the processor state to the processor state frame for
161: // debugger to examine.
162: //
163:
164: typedef struct _KPROCESSOR_STATE {
165: struct _CONTEXT ContextFrame;
166: struct _KSPECIAL_REGISTERS SpecialRegisters;
167: } KPROCESSOR_STATE, *PKPROCESSOR_STATE;
168: #endif // _X86_
169:
170: typedef struct _DBGKM_EXCEPTION {
171: EXCEPTION_RECORD ExceptionRecord;
172: DWORD FirstChance;
173: } DBGKM_EXCEPTION, *PDBGKM_EXCEPTION;
174:
175:
176: //
177: // DbgKd APIs are for the portable kernel debugger
178: //
179:
180: //
181: // KD_PACKETS are the low level data format used in KD. All packets
182: // begin with a packet leader, byte count, packet type. The sequence
183: // for accepting a packet is:
184: //
185: // - read 4 bytes to get packet leader. If read times out (10 seconds)
186: // with a short read, or if packet leader is incorrect, then retry
187: // the read.
188: //
189: // - next read 2 byte packet type. If read times out (10 seconds) with
190: // a short read, or if packet type is bad, then start again looking
191: // for a packet leader.
192: //
193: // - next read 4 byte packet Id. If read times out (10 seconds)
194: // with a short read, or if packet Id is not what we expect, then
195: // ask for resend and restart again looking for a packet leader.
196: //
197: // - next read 2 byte byte count. If read times out (10 seconds) with
198: // a short read, or if byte count is greater than PACKET_MAX_SIZE,
199: // then start again looking for a packet leader.
200: //
201: // - next read 4 byte packet data checksum.
202: //
203: // - The packet data immediately follows the packet. There should be
204: // ByteCount bytes following the packet header. Read the packet
205: // data, if read times out (10 seconds) then start again looking for
206: // a packet leader.
207: //
208:
209:
210: typedef struct _KD_PACKET {
211: DWORD PacketLeader;
212: WORD PacketType;
213: WORD ByteCount;
214: DWORD PacketId;
215: DWORD Checksum;
216: } KD_PACKET, *PKD_PACKET;
217:
218:
219: #define PACKET_MAX_SIZE 4000
220: #define INITIAL_PACKET_ID 0x80800000 // DON't use 0
221: #define SYNC_PACKET_ID 0x00000800 // Or in with INITIAL_PACKET_ID
222: // to force a packet ID reset.
223:
224: //
225: // BreakIn packet
226: //
227:
228: #define BREAKIN_PACKET 0x62626262
229: #define BREAKIN_PACKET_BYTE 0x62
230:
231: //
232: // Packet lead in sequence
233: //
234:
235: #define PACKET_LEADER 0x30303030 //0x77000077
236: #define PACKET_LEADER_BYTE 0x30
237:
238: #define CONTROL_PACKET_LEADER 0x69696969
239: #define CONTROL_PACKET_LEADER_BYTE 0x69
240:
241: //
242: // Packet Trailing Byte
243: //
244:
245: #define PACKET_TRAILING_BYTE 0xAA
246:
247: //
248: // Packet Types
249: //
250:
251: #define PACKET_TYPE_UNUSED 0
252: #define PACKET_TYPE_KD_STATE_CHANGE 1
253: #define PACKET_TYPE_KD_STATE_MANIPULATE 2
254: #define PACKET_TYPE_KD_DEBUG_IO 3
255: #define PACKET_TYPE_KD_ACKNOWLEDGE 4 // Packet-control type
256: #define PACKET_TYPE_KD_RESEND 5 // Packet-control type
257: #define PACKET_TYPE_KD_RESET 6 // Packet-control type
258: #define PACKET_TYPE_MAX 7
259:
260: //
261: // If the packet type is PACKET_TYPE_KD_STATE_CHANGE, then
262: // the format of the packet data is as follows:
263: //
264:
265: #define DbgKdExceptionStateChange 0x00003030L
266: #define DbgKdLoadSymbolsStateChange 0x00003031L
267:
268: //
269: // Pathname Data follows directly
270: //
271:
272: typedef struct _DBGKD_LOAD_SYMBOLS {
273: DWORD PathNameLength;
274: PVOID BaseOfDll;
275: DWORD ProcessId;
276: DWORD CheckSum;
277: DWORD SizeOfImage;
278: BOOLEAN UnloadSymbols;
279: } DBGKD_LOAD_SYMBOLS, *PDBGKD_LOAD_SYMBOLS;
280:
281: typedef struct _DBGKD_WAIT_STATE_CHANGE {
282: DWORD NewState;
283: WORD ProcessorType;
284: WORD Processor;
285: DWORD NumberProcessors;
286: PVOID Thread;
287: PVOID ProgramCounter;
288: union {
289: DBGKM_EXCEPTION Exception;
290: DBGKD_LOAD_SYMBOLS LoadSymbols;
291: } u;
292: DBGKD_CONTROL_REPORT ControlReport;
293: } DBGKD_WAIT_STATE_CHANGE, *PDBGKD_WAIT_STATE_CHANGE;
294:
295: //
296: // If the packet type is PACKET_TYPE_KD_STATE_MANIPULATE, then
297: // the format of the packet data is as follows:
298: //
299: // Api Numbers for state manipulation
300: //
301:
302: #define DbgKdReadVirtualMemoryApi 0x00003130L
303: #define DbgKdWriteVirtualMemoryApi 0x00003131L
304: #define DbgKdGetContextApi 0x00003132L
305: #define DbgKdSetContextApi 0x00003133L
306: #define DbgKdWriteBreakPointApi 0x00003134L
307: #define DbgKdRestoreBreakPointApi 0x00003135L
308: #define DbgKdContinueApi 0x00003136L
309: #define DbgKdReadControlSpaceApi 0x00003137L
310: #define DbgKdWriteControlSpaceApi 0x00003138L
311: #define DbgKdReadIoSpaceApi 0x00003139L
312: #define DbgKdWriteIoSpaceApi 0x0000313AL
313: #define DbgKdRebootApi 0x0000313BL
314: #define DbgKdContinueApi2 0x0000313CL
315: #define DbgKdReadPhysicalMemoryApi 0x0000313DL
316: #define DbgKdWritePhysicalMemoryApi 0x0000313EL
317: #define DbgKdQuerySpecialCallsApi 0x0000313FL
318: #define DbgKdSetSpecialCallApi 0x00003140L
319: #define DbgKdClearSpecialCallsApi 0x00003141L
320: #define DbgKdSetInternalBreakPointApi 0x00003142L
321: #define DbgKdGetInternalBreakPointApi 0x00003143L
322: #define DbgKdReadIoSpaceExtendedApi 0x00003144L
323: #define DbgKdWriteIoSpaceExtendedApi 0x00003145L
324:
325: //
326: // Response is a read memory message with data following
327: //
328:
329: typedef struct _DBGKD_READ_MEMORY {
330: PVOID TargetBaseAddress;
331: DWORD TransferCount;
332: DWORD ActualBytesRead;
333: } DBGKD_READ_MEMORY, *PDBGKD_READ_MEMORY;
334:
335: //
336: // Data follows directly
337: //
338:
339: typedef struct _DBGKD_WRITE_MEMORY {
340: PVOID TargetBaseAddress;
341: DWORD TransferCount;
342: DWORD ActualBytesWritten;
343: } DBGKD_WRITE_MEMORY, *PDBGKD_WRITE_MEMORY;
344:
345: //
346: // Response is a get context message with a full context record following
347: //
348:
349: typedef struct _DBGKD_GET_CONTEXT {
350: DWORD ContextFlags;
351: } DBGKD_GET_CONTEXT, *PDBGKD_GET_CONTEXT;
352:
353: //
354: // Full Context record follows
355: //
356:
357: typedef struct _DBGKD_SET_CONTEXT {
358: DWORD ContextFlags;
359: } DBGKD_SET_CONTEXT, *PDBGKD_SET_CONTEXT;
360:
361: typedef struct _DBGKD_WRITE_BREAKPOINT {
362: PVOID BreakPointAddress;
363: DWORD BreakPointHandle;
364: } DBGKD_WRITE_BREAKPOINT, *PDBGKD_WRITE_BREAKPOINT;
365:
366: typedef struct _DBGKD_RESTORE_BREAKPOINT {
367: DWORD BreakPointHandle;
368: } DBGKD_RESTORE_BREAKPOINT, *PDBGKD_RESTORE_BREAKPOINT;
369:
370: typedef struct _DBGKD_CONTINUE {
371: DWORD ContinueStatus;
372: } DBGKD_CONTINUE, *PDBGKD_CONTINUE;
373:
374: typedef struct _DBGKD_CONTINUE2 {
375: DWORD ContinueStatus;
376: DBGKD_CONTROL_SET ControlSet;
377: } DBGKD_CONTINUE2, *PDBGKD_CONTINUE2;
378:
379: typedef struct _DBGKD_READ_WRITE_IO {
380: DWORD DataSize; // 1, 2, 4
381: PVOID IoAddress;
382: DWORD DataValue;
383: } DBGKD_READ_WRITE_IO, *PDBGKD_READ_WRITE_IO;
384:
385: typedef struct _DBGKD_READ_WRITE_IO_EXTENDED {
386: DWORD DataSize; // 1, 2, 4
387: DWORD InterfaceType;
388: DWORD BusNumber;
389: DWORD AddressSpace;
390: PVOID IoAddress;
391: DWORD DataValue;
392: } DBGKD_READ_WRITE_IO_EXTENDED, *PDBGKD_READ_WRITE_IO_EXTENDED;
393:
394: typedef struct _DBGKD_QUERY_SPECIAL_CALLS {
395: DWORD NumberOfSpecialCalls;
396: // DWORD SpecialCalls[];
397: } DBGKD_QUERY_SPECIAL_CALLS, *PDBGKD_QUERY_SPECIAL_CALLS;
398:
399: typedef struct _DBGKD_SET_SPECIAL_CALL {
400: DWORD SpecialCall;
401: } DBGKD_SET_SPECIAL_CALL, *PDBGKD_SET_SPECIAL_CALL;
402:
403: typedef struct _DBGKD_SET_INTERNAL_BREAKPOINT {
404: DWORD BreakpointAddress;
405: DWORD Flags;
406: } DBGKD_SET_INTERNAL_BREAKPOINT, *PDBGKD_SET_INTERNAL_BREAKPOINT;
407:
408: typedef struct _DBGKD_GET_INTERNAL_BREAKPOINT {
409: DWORD BreakpointAddress;
410: DWORD Flags;
411: DWORD Calls;
412: DWORD MaxCallsPerPeriod;
413: DWORD MinInstructions;
414: DWORD MaxInstructions;
415: DWORD TotalInstructions;
416: } DBGKD_GET_INTERNAL_BREAKPOINT, *PDBGKD_GET_INTERNAL_BREAKPOINT;
417:
418: #define DBGKD_INTERNAL_BP_FLAG_COUNTONLY 0x00000001 // don't count instructions
419: #define DBGKD_INTERNAL_BP_FLAG_INVALID 0x00000002 // disabled BP
420: #define DBGKD_INTERNAL_BP_FLAG_SUSPENDED 0x00000004 // temporarily suspended
421: #define DBGKD_INTERNAL_BP_FLAG_DYING 0x00000008 // kill on exit
422:
423: typedef struct _DBGKD_MANIPULATE_STATE {
424: DWORD ApiNumber;
425: WORD ProcessorType;
426: WORD Processor;
427: DWORD ReturnStatus;
428: union {
429: DBGKD_READ_MEMORY ReadMemory;
430: DBGKD_WRITE_MEMORY WriteMemory;
431: DBGKD_GET_CONTEXT GetContext;
432: DBGKD_SET_CONTEXT SetContext;
433: DBGKD_WRITE_BREAKPOINT WriteBreakPoint;
434: DBGKD_RESTORE_BREAKPOINT RestoreBreakPoint;
435: DBGKD_CONTINUE Continue;
436: DBGKD_CONTINUE2 Continue2;
437: DBGKD_READ_WRITE_IO ReadWriteIo;
438: DBGKD_READ_WRITE_IO_EXTENDED ReadWriteIoExtended;
439: DBGKD_QUERY_SPECIAL_CALLS QuerySpecialCalls;
440: DBGKD_SET_SPECIAL_CALL SetSpecialCall;
441: DBGKD_SET_INTERNAL_BREAKPOINT SetInternalBreakpoint;
442: DBGKD_GET_INTERNAL_BREAKPOINT GetInternalBreakpoint;
443: } u;
444: } DBGKD_MANIPULATE_STATE, *PDBGKD_MANIPULATE_STATE;
445:
446: //
447: // This is the format for the trace data passed back from the kernel to
448: // the debugger to describe multiple calls that have returned since the
449: // last trip back. The basic format is that there are a bunch of these
450: // (4 byte) unions stuck together. Each union is of one of two types: a
451: // 4 byte unsigned long interger, or a three field struct, describing a
452: // call (where "call" is delimited by returning or exiting the symbol
453: // scope). If the number of instructions executed is too big to fit
454: // into a WORD -1, then the Instructions field has
455: // TRACE_DATA_INSTRUCTIONS_BIG and the next union is a LongNumber
456: // containing the real number of instructions executed.
457: //
458: // The very first union returned in each callback is a LongNumber
459: // containing the number of unions returned (including the "size"
460: // record, os it's always at least 1 even if there's no data to return).
461: //
462: // This is all returned to the debugger when one of two things
463: // happens:
464: //
465: // 1) The pc moves out of all defined symbol ranges
466: // 2) The buffer of trace data entries is filled.
467: //
468: // The "trace done" case is hacked around on the debugger side. It
469: // guarantees that the pc address that indicates a trace exit never
470: // winds up in a defined symbol range.
471: //
472: // The only other complexity in this system is handling the SymbolNumber
473: // table. This table is kept in parallel by the kernel and the
474: // debugger. When the PC exits a known symbol range, the Begin and End
475: // symbol ranges are set by the debugger and are allocated to the next
476: // symbol slot upon return. "The next symbol slot" means the numerical
477: // next slot number, unless we've filled all slots, in which case it is
478: // #0. (ie., allocation is cyclic and not LRU or something). The
479: // SymbolNumber table is flushed when a SpecialCalls call is made (ie.,
480: // at the beginning of the WatchTrace).
481: //
482:
483: typedef union _DBGKD_TRACE_DATA {
484: struct {
485: BYTE SymbolNumber;
486: CHAR LevelChange;
487: WORD Instructions;
488: } s;
489: DWORD LongNumber;
490: } DBGKD_TRACE_DATA, *PDBGKD_TRACE_DATA;
491:
492: #define TRACE_DATA_INSTRUCTIONS_BIG 0xffff
493:
494: #define TRACE_DATA_BUFFER_MAX_SIZE 40
495:
496: //
497: // If the packet type is PACKET_TYPE_KD_DEBUG_IO, then
498: // the format of the packet data is as follows:
499: //
500:
501: #define DbgKdPrintStringApi 0x00003230L
502: #define DbgKdGetStringApi 0x00003231L
503:
504: //
505: // For print string, the Null terminated string to print
506: // immediately follows the message
507: //
508: typedef struct _DBGKD_PRINT_STRING {
509: DWORD LengthOfString;
510: } DBGKD_PRINT_STRING, *PDBGKD_PRINT_STRING;
511:
512: //
513: // For get string, the Null terminated promt string
514: // immediately follows the message. The LengthOfStringRead
515: // field initially contains the maximum number of characters
516: // to read. Upon reply, this contains the number of bytes actually
517: // read. The data read immediately follows the message.
518: //
519: //
520: typedef struct _DBGKD_GET_STRING {
521: DWORD LengthOfPromptString;
522: DWORD LengthOfStringRead;
523: } DBGKD_GET_STRING, *PDBGKD_GET_STRING;
524:
525: typedef struct _DBGKD_DEBUG_IO {
526: DWORD ApiNumber;
527: WORD ProcessorType;
528: WORD Processor;
529: union {
530: DBGKD_PRINT_STRING PrintString;
531: DBGKD_GET_STRING GetString;
532: } u;
533: } DBGKD_DEBUG_IO, *PDBGKD_DEBUG_IO;
534:
535:
536: VOID
537: NTAPI
538: DbgKdSendBreakIn(
539: VOID
540: );
541:
542: PBYTE
543: NTAPI
544: DbgKdGets(
545: PBYTE Buffer,
546: WORD Length
547: );
548:
549: DWORD
550: NTAPI
551: DbgKdWaitStateChange(
552: OUT PDBGKD_WAIT_STATE_CHANGE StateChange,
553: OUT PVOID Buffer,
554: IN DWORD BufferLength
555: );
556:
557: DWORD
558: NTAPI
559: DbgKdContinue (
560: IN DWORD ContinueStatus
561: );
562:
563: DWORD
564: NTAPI
565: DbgKdContinue2 (
566: IN DWORD ContinueStatus,
567: IN DBGKD_CONTROL_SET ControlSet
568: );
569:
570: DWORD
571: NTAPI
572: DbgKdReadVirtualMemory(
573: IN PVOID TargetBaseAddress,
574: OUT PVOID UserInterfaceBuffer,
575: IN DWORD TransferCount,
576: OUT PDWORD ActualBytesRead OPTIONAL
577: );
578:
579: DWORD
580: NTAPI
581: DbgKdWriteVirtualMemory(
582: IN PVOID TargetBaseAddress,
583: OUT PVOID UserInterfaceBuffer,
584: IN DWORD TransferCount,
585: OUT PDWORD ActualBytesWritten OPTIONAL
586: );
587:
588: DWORD
589: NTAPI
590: DbgKdReadPhysicalMemory(
591: IN PHYSICAL_ADDRESS TargetBaseAddress,
592: OUT PVOID UserInterfaceBuffer,
593: IN DWORD TransferCount,
594: OUT PDWORD ActualBytesRead OPTIONAL
595: );
596:
597: DWORD
598: NTAPI
599: DbgKdWritePhysicalMemory(
600: IN PHYSICAL_ADDRESS TargetBaseAddress,
601: OUT PVOID UserInterfaceBuffer,
602: IN DWORD TransferCount,
603: OUT PDWORD ActualBytesWritten OPTIONAL
604: );
605:
606: DWORD
607: NTAPI
608: DbgKdReadControlSpace(
609: IN WORD Processor,
610: IN PVOID TargetBaseAddress,
611: OUT PVOID UserInterfaceBuffer,
612: IN DWORD TransferCount,
613: OUT PDWORD ActualBytesRead OPTIONAL
614: );
615:
616: DWORD
617: NTAPI
618: DbgKdWriteControlSpace(
619: IN WORD Processor,
620: IN PVOID TargetBaseAddress,
621: OUT PVOID UserInterfaceBuffer,
622: IN DWORD TransferCount,
623: OUT PDWORD ActualBytesWritten OPTIONAL
624: );
625:
626: DWORD
627: NTAPI
628: DbgKdReadIoSpace(
629: IN PVOID IoAddress,
630: OUT PVOID ReturnedData,
631: IN DWORD DataSize
632: );
633:
634: DWORD
635: NTAPI
636: DbgKdWriteIoSpace(
637: IN PVOID IoAddress,
638: IN DWORD DataValue,
639: IN DWORD DataSize
640: );
641:
642: DWORD
643: NTAPI
644: DbgKdGetContext(
645: IN WORD Processor,
646: IN OUT PCONTEXT Context
647: );
648:
649: DWORD
650: NTAPI
651: DbgKdSetContext(
652: IN WORD Processor,
653: IN PCONTEXT Context
654: );
655:
656: DWORD
657: NTAPI
658: DbgKdWriteBreakPoint(
659: IN PVOID BreakPointAddress,
660: OUT PDWORD BreakPointHandle
661: );
662:
663: DWORD
664: NTAPI
665: DbgKdRestoreBreakPoint(
666: IN DWORD BreakPointHandle
667: );
668:
669: DWORD
670: NTAPI
671: DbgKdReboot(
672: VOID
673: );
674:
675: #ifdef _X86_
676: DWORD
677: NTAPI
678: DbgKdLookupSelector(
679: IN WORD Processor,
680: IN OUT PDESCRIPTOR_TABLE_ENTRY pDescriptorTableEntry
681: );
682: #endif
683:
684: #define DBG_EXCEPTION_HANDLED ((DWORD )0x00010001L)
685:
686: #endif // _WINDBGKD_
687:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.