ReactOS 0.4.16-dev-981-g80eb313
kdapi.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/kd64/kdapi.c
5 * PURPOSE: KD64 Public Routines and Internal Support
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 * Stefan Ginsberg (stefan.ginsberg@reactos.org)
8 */
9
10/* INCLUDES ******************************************************************/
11
12#include <ntoskrnl.h>
13
14#ifdef KDBG
15#include <kdbg/kdb.h>
16#endif
17
18#define NDEBUG
19#include <debug.h>
20
22
23/* PRIVATE FUNCTIONS *********************************************************/
24
25VOID
31{
32 PCHAR DestinationBytes, SourceBytes;
33
34 /* Copy the buffers 1 byte at a time */
35 DestinationBytes = Destination;
36 SourceBytes = Source;
37 while (Length--) *DestinationBytes++ = *SourceBytes++;
38}
39
40VOID
45{
46 PCHAR DestinationBytes;
47
48 /* Zero the buffer 1 byte at a time */
49 DestinationBytes = Destination;
50 while (Length--) *DestinationBytes++ = 0;
51}
52
58 _In_ ULONG TotalSize,
61 _Out_opt_ PULONG ActualSize)
62{
64 ULONG RemainingLength, CopyChunk;
65
66 /* Check if we didn't get a chunk size or if it is too big */
67 if (ChunkSize == 0)
68 {
69 /* Default to 4 byte chunks */
70 ChunkSize = 4;
71 }
73 {
74 /* Normalize to maximum size */
76 }
77
78 /* Copy the whole range in aligned chunks */
79 RemainingLength = TotalSize;
80 CopyChunk = 1;
81 while (RemainingLength > 0)
82 {
83 /*
84 * Determine the best chunk size for this round.
85 * The ideal size is aligned, isn't larger than the
86 * the remaining length and respects the chunk limit.
87 */
88 while (((CopyChunk * 2) <= RemainingLength) &&
89 (CopyChunk < ChunkSize) &&
90 ((Address & ((CopyChunk * 2) - 1)) == 0))
91 {
92 /* Increase it */
93 CopyChunk *= 2;
94 }
95
96 /*
97 * The chunk size can be larger than the remaining size if this
98 * isn't the first round, so check if we need to shrink it back.
99 */
100 while (CopyChunk > RemainingLength)
101 {
102 /* Shrink it */
103 CopyChunk /= 2;
104 }
105
106 /* Do the copy */
107 Status = MmDbgCopyMemory(Address, Buffer, CopyChunk, Flags);
108 if (!NT_SUCCESS(Status))
109 {
110 /* Copy failed, break out */
111 break;
112 }
113
114 /* Update pointers and length for the next run */
115 Address = Address + CopyChunk;
116 Buffer = (PVOID)((ULONG_PTR)Buffer + CopyChunk);
117 RemainingLength = RemainingLength - CopyChunk;
118 }
119
120 /* We may have modified executable code, flush the instruction cache */
121 KeSweepICache((PVOID)(ULONG_PTR)Address, TotalSize);
122
123 /*
124 * Return the size we managed to copy and return
125 * success if we could copy the whole range.
126 */
127 if (ActualSize) *ActualSize = TotalSize - RemainingLength;
128 return RemainingLength == 0 ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
129}
130
131VOID
132NTAPI
135{
136 PDBGKD_QUERY_MEMORY Memory = &State->u.QueryMemory;
139
140 /* Validate the address space */
141 if (Memory->AddressSpace == DBGKD_QUERY_MEMORY_VIRTUAL)
142 {
143 /* Check if this is process memory */
145 {
146 /* It is */
147 Memory->AddressSpace = DBGKD_QUERY_MEMORY_PROCESS;
148 }
149 else
150 {
151 /* Check if it's session space */
153 {
154 /* It is */
155 Memory->AddressSpace = DBGKD_QUERY_MEMORY_SESSION;
156 }
157 else
158 {
159 /* Not session space but some other kernel memory */
160 Memory->AddressSpace = DBGKD_QUERY_MEMORY_KERNEL;
161 }
162 }
163
164 /* Set flags */
168 }
169 else
170 {
171 /* Invalid */
173 }
174
175 /* Return structure */
176 State->ReturnStatus = Status;
177 Memory->Reserved = 0;
178
179 /* Build header */
180 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
181 Header.Buffer = (PCHAR)State;
182
183 /* Send the packet */
185 &Header,
186 NULL,
187 &KdpContext);
188}
189
190VOID
191NTAPI
195{
196 //PDBGKD_SEARCH_MEMORY SearchMemory = &State->u.SearchMemory;
198
199 /* TODO */
200 KdpDprintf("Memory Search support is unimplemented!\n");
201
202 /* Send a failure packet */
203 State->ReturnStatus = STATUS_UNSUCCESSFUL;
204 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
205 Header.Buffer = (PCHAR)State;
207 &Header,
208 NULL,
209 &KdpContext);
210}
211
212VOID
213NTAPI
217{
218 //PDBGKD_FILL_MEMORY FillMemory = &State->u.FillMemory;
220
221 /* TODO */
222 KdpDprintf("Memory Fill support is unimplemented!\n");
223
224 /* Send a failure packet */
225 State->ReturnStatus = STATUS_UNSUCCESSFUL;
226 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
227 Header.Buffer = (PCHAR)State;
229 &Header,
230 NULL,
231 &KdpContext);
232}
233
234VOID
235NTAPI
239{
240 PDBGKD_WRITE_BREAKPOINT64 Breakpoint = &State->u.WriteBreakPoint;
242
243 /* Build header */
244 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
245 Header.Buffer = (PCHAR)State;
246 ASSERT(Data->Length == 0);
247
248 /* Create the breakpoint */
249 Breakpoint->BreakPointHandle =
251 if (!Breakpoint->BreakPointHandle)
252 {
253 /* We failed */
254 State->ReturnStatus = STATUS_UNSUCCESSFUL;
255 }
256 else
257 {
258 /* Success! */
259 State->ReturnStatus = STATUS_SUCCESS;
260 }
261
262 /* Send the packet */
264 &Header,
265 NULL,
266 &KdpContext);
267}
268
269VOID
270NTAPI
274{
275 PDBGKD_RESTORE_BREAKPOINT RestoreBp = &State->u.RestoreBreakPoint;
277
278 /* Fill out the header */
279 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
280 Header.Buffer = (PCHAR)State;
281 ASSERT(Data->Length == 0);
282
283 /* Get the version block */
285 {
286 /* We're all good */
287 State->ReturnStatus = STATUS_SUCCESS;
288 }
289 else
290 {
291 /* We failed */
292 State->ReturnStatus = STATUS_UNSUCCESSFUL;
293 }
294
295 /* Send the packet */
297 &Header,
298 NULL,
299 &KdpContext);
300}
301
303NTAPI
307{
308 //PDBGKD_BREAKPOINTEX = &State->u.BreakPointEx;
310
311 /* TODO */
312 KdpDprintf("Extended Breakpoint Write support is unimplemented!\n");
313
314 /* Send a failure packet */
315 State->ReturnStatus = STATUS_UNSUCCESSFUL;
316 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
317 Header.Buffer = (PCHAR)State;
319 &Header,
320 Data,
321 &KdpContext);
322 return STATUS_UNSUCCESSFUL;
323}
324
325VOID
326NTAPI
330{
331 //PDBGKD_BREAKPOINTEX = &State->u.BreakPointEx;
333
334 /* TODO */
335 KdpDprintf("Extended Breakpoint Restore support is unimplemented!\n");
336
337 /* Send a failure packet */
338 State->ReturnStatus = STATUS_UNSUCCESSFUL;
339 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
340 Header.Buffer = (PCHAR)State;
342 &Header,
343 Data,
344 &KdpContext);
345}
346
347VOID
348NTAPI
352{
353 //PDBGKD_WRITE_CUSTOM_BREAKPOINT = &State->u.WriteCustomBreakpoint;
355
356 /* Not supported */
357 KdpDprintf("Custom Breakpoint Write is unimplemented\n");
358
359 /* Send a failure packet */
360 State->ReturnStatus = STATUS_UNSUCCESSFUL;
361 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
362 Header.Buffer = (PCHAR)State;
364 &Header,
365 NULL,
366 &KdpContext);
367}
368
369VOID
370NTAPI
372{
373 /* Update the buffer */
375
376 /* Setup the trace data */
377 TraceData->Length = (USHORT)(TraceDataBufferPosition * sizeof(ULONG));
378 TraceData->Buffer = (PCHAR)TraceDataBuffer;
379
380 /* Reset the buffer location */
382}
383
384VOID
385NTAPI
388 IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange)
389{
390 ULONG InstructionCount;
391 BOOLEAN HadBreakpoints;
392
393 /* Setup common stuff available for all CPU architectures */
394 WaitStateChange->NewState = NewState;
395 WaitStateChange->ProcessorLevel = KeProcessorLevel;
396 WaitStateChange->Processor = (USHORT)KeGetCurrentPrcb()->Number;
397 WaitStateChange->NumberProcessors = (ULONG)KeNumberProcessors;
398 WaitStateChange->Thread = (ULONG64)(LONG_PTR)KeGetCurrentThread();
399 WaitStateChange->ProgramCounter = (ULONG64)(LONG_PTR)KeGetContextPc(Context);
400
401 /* Zero out the entire Control Report */
402 KdpZeroMemory(&WaitStateChange->AnyControlReport,
404
405 /* Now copy the instruction stream and set the count */
406 KdpCopyMemoryChunks((ULONG_PTR)WaitStateChange->ProgramCounter,
407 &WaitStateChange->ControlReport.InstructionStream[0],
409 0,
411 &InstructionCount);
412 WaitStateChange->ControlReport.InstructionCount = (USHORT)InstructionCount;
413
414 /* Clear all the breakpoints in this region */
415 HadBreakpoints =
416 KdpDeleteBreakpointRange((PVOID)(ULONG_PTR)WaitStateChange->ProgramCounter,
417 (PVOID)((ULONG_PTR)WaitStateChange->ProgramCounter +
418 WaitStateChange->ControlReport.InstructionCount - 1));
419 if (HadBreakpoints)
420 {
421 /* Copy the instruction stream again, this time without breakpoints */
422 KdpCopyMemoryChunks((ULONG_PTR)WaitStateChange->ProgramCounter,
423 &WaitStateChange->ControlReport.InstructionStream[0],
424 InstructionCount,
425 0,
427 NULL);
428 }
429}
430
431VOID
432NTAPI
435{
436 /* Copy the version block */
439 sizeof(DBGKD_GET_VERSION64));
440}
441
442VOID
443NTAPI
445{
447
448 /* Fill out the header */
449 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
450 Header.Buffer = (PCHAR)State;
451
452 /* Get the version block */
453 KdpSysGetVersion(&State->u.GetVersion64);
454
455 /* Fill out the state */
456 State->ApiNumber = DbgKdGetVersionApi;
457 State->ReturnStatus = STATUS_SUCCESS;
458
459 /* Send the packet */
461 &Header,
462 NULL,
463 &KdpContext);
464}
465
466VOID
467NTAPI
471{
472 PDBGKD_READ_MEMORY64 ReadMemory = &State->u.ReadMemory;
474 ULONG Length = ReadMemory->TransferCount;
475
476 /* Setup the header */
477 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
478 Header.Buffer = (PCHAR)State;
479 ASSERT(Data->Length == 0);
480
481 /* Validate length */
483 {
484 /* Overflow, set it to maximum possible */
486 }
487
488 /* Do the read */
489 State->ReturnStatus = KdpCopyMemoryChunks(ReadMemory->TargetBaseAddress,
490 Data->Buffer,
491 Length,
492 0,
494 &Length);
495
496 /* Return the actual length read */
497 ReadMemory->ActualBytesRead = Length;
498 Data->Length = (USHORT)Length;
499
500 /* Send the packet */
502 &Header,
503 Data,
504 &KdpContext);
505}
506
507VOID
508NTAPI
512{
513 PDBGKD_WRITE_MEMORY64 WriteMemory = &State->u.WriteMemory;
515
516 /* Setup the header */
517 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
518 Header.Buffer = (PCHAR)State;
519
520 /* Do the write */
521 State->ReturnStatus = KdpCopyMemoryChunks(WriteMemory->TargetBaseAddress,
522 Data->Buffer,
523 Data->Length,
524 0,
527 &WriteMemory->ActualBytesWritten);
528
529 /* Send the packet */
531 &Header,
532 NULL,
533 &KdpContext);
534}
535
536VOID
537NTAPI
541{
542 PDBGKD_READ_MEMORY64 ReadMemory = &State->u.ReadMemory;
544 ULONG Length = ReadMemory->TransferCount;
545 ULONG Flags, CacheFlags;
546
547 /* Setup the header */
548 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
549 Header.Buffer = (PCHAR)State;
550 ASSERT(Data->Length == 0);
551
552 /* Validate length */
554 {
555 /* Overflow, set it to maximum possible */
557 }
558
559 /* Start with the default flags */
561
562 /* Get the caching flags and check if a type is specified */
563 CacheFlags = ReadMemory->ActualBytesRead;
564 if (CacheFlags == DBGKD_CACHING_CACHED)
565 {
566 /* Cached */
568 }
569 else if (CacheFlags == DBGKD_CACHING_UNCACHED)
570 {
571 /* Uncached */
573 }
574 else if (CacheFlags == DBGKD_CACHING_WRITE_COMBINED)
575 {
576 /* Write Combined */
578 }
579
580 /* Do the read */
581 State->ReturnStatus = KdpCopyMemoryChunks(ReadMemory->TargetBaseAddress,
582 Data->Buffer,
583 Length,
584 0,
585 Flags,
586 &Length);
587
588 /* Return the actual length read */
589 ReadMemory->ActualBytesRead = Length;
590 Data->Length = (USHORT)Length;
591
592 /* Send the packet */
594 &Header,
595 Data,
596 &KdpContext);
597}
598
599VOID
600NTAPI
604{
605 PDBGKD_WRITE_MEMORY64 WriteMemory = &State->u.WriteMemory;
607 ULONG Flags, CacheFlags;
608
609 /* Setup the header */
610 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
611 Header.Buffer = (PCHAR)State;
612
613 /* Start with the default flags */
615
616 /* Get the caching flags and check if a type is specified */
617 CacheFlags = WriteMemory->ActualBytesWritten;
618 if (CacheFlags == DBGKD_CACHING_CACHED)
619 {
620 /* Cached */
622 }
623 else if (CacheFlags == DBGKD_CACHING_UNCACHED)
624 {
625 /* Uncached */
627 }
628 else if (CacheFlags == DBGKD_CACHING_WRITE_COMBINED)
629 {
630 /* Write Combined */
632 }
633
634 /* Do the write */
635 State->ReturnStatus = KdpCopyMemoryChunks(WriteMemory->TargetBaseAddress,
636 Data->Buffer,
637 Data->Length,
638 0,
639 Flags,
640 &WriteMemory->ActualBytesWritten);
641
642 /* Send the packet */
644 &Header,
645 NULL,
646 &KdpContext);
647}
648
649VOID
650NTAPI
654{
655 PDBGKD_READ_MEMORY64 ReadMemory = &State->u.ReadMemory;
658
659 /* Setup the header */
660 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
661 Header.Buffer = (PCHAR)State;
662 ASSERT(Data->Length == 0);
663
664 /* Check the length requested */
665 Length = ReadMemory->TransferCount;
667 {
668 /* Use maximum allowed */
670 }
671
672 /* Call the internal routine */
673 State->ReturnStatus = KdpSysReadControlSpace(State->Processor,
674 ReadMemory->TargetBaseAddress,
675 Data->Buffer,
676 Length,
677 &Length);
678
679 /* Return the actual length read */
680 ReadMemory->ActualBytesRead = Length;
681 Data->Length = (USHORT)Length;
682
683 /* Send the reply */
685 &Header,
686 Data,
687 &KdpContext);
688}
689
690VOID
691NTAPI
695{
696 PDBGKD_WRITE_MEMORY64 WriteMemory = &State->u.WriteMemory;
698
699 /* Setup the header */
700 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
701 Header.Buffer = (PCHAR)State;
702
703 /* Call the internal routine */
704 State->ReturnStatus = KdpSysWriteControlSpace(State->Processor,
705 WriteMemory->TargetBaseAddress,
706 Data->Buffer,
707 Data->Length,
708 &WriteMemory->ActualBytesWritten);
709
710 /* Send the reply */
712 &Header,
713 Data,
714 &KdpContext);
715}
716
717VOID
718NTAPI
722{
725
726 /* Setup the header */
727 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
728 Header.Buffer = (PCHAR)State;
729 ASSERT(Data->Length == 0);
730
731 /* Make sure that this is a valid request */
732 if (State->Processor < KeNumberProcessors)
733 {
734 /* Check if the request is for this CPU */
735 if (State->Processor == KeGetCurrentPrcb()->Number)
736 {
737 /* We're just copying our own context */
739 }
740 else
741 {
742 /* Get the context from the PRCB array */
743 TargetContext = &KiProcessorBlock[State->Processor]->
744 ProcessorState.ContextFrame;
745 }
746
747 /* Copy it over to the debugger */
748 KdpMoveMemory(Data->Buffer,
750 sizeof(CONTEXT));
751 Data->Length = sizeof(CONTEXT);
752
753 /* Let the debugger set the context now */
755
756 /* Finish up */
757 State->ReturnStatus = STATUS_SUCCESS;
758 }
759 else
760 {
761 /* Invalid request */
762 State->ReturnStatus = STATUS_UNSUCCESSFUL;
763 }
764
765 /* Send the reply */
767 &Header,
768 Data,
769 &KdpContext);
770}
771
772VOID
773NTAPI
777{
780
781 /* Setup the header */
782 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
783 Header.Buffer = (PCHAR)State;
784 ASSERT(Data->Length == sizeof(CONTEXT));
785
786 /* Make sure that this is a valid request */
787 if ((State->Processor < KeNumberProcessors) &&
789 {
790 /* Check if the request is for this CPU */
791 if (State->Processor == KeGetCurrentPrcb()->Number)
792 {
793 /* We're just copying our own context */
795 }
796 else
797 {
798 /* Get the context from the PRCB array */
799 TargetContext = &KiProcessorBlock[State->Processor]->
800 ProcessorState.ContextFrame;
801 }
802
803 /* Copy the new context to it */
805 Data->Buffer,
806 sizeof(CONTEXT));
807
808 /* Finish up */
809 State->ReturnStatus = STATUS_SUCCESS;
810 }
811 else
812 {
813 /* Invalid request */
814 State->ReturnStatus = STATUS_UNSUCCESSFUL;
815 }
816
817 /* Send the reply */
819 &Header,
820 NULL,
821 &KdpContext);
822}
823
824VOID
825NTAPI
829{
831 PDBGKD_CONTEXT_EX ContextEx;
833 ASSERT(Data->Length == 0);
834
835 /* Get our struct */
836 ContextEx = &State->u.ContextEx;
837
838 /* Set up the header */
839 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
840 Header.Buffer = (PCHAR)State;
841
842 /* Make sure that this is a valid request */
843 if ((State->Processor < KeNumberProcessors) &&
844 (ContextEx->Offset + ContextEx->ByteCount) <= sizeof(CONTEXT))
845 {
846 /* Check if the request is for this CPU */
847 if (State->Processor == KeGetCurrentPrcb()->Number)
848 {
849 /* We're just copying our own context */
851 }
852 else
853 {
854 /* Get the context from the PRCB array */
855 TargetContext = &KiProcessorBlock[State->Processor]->
856 ProcessorState.ContextFrame;
857 }
858
859 /* Copy what is requested */
860 KdpMoveMemory(Data->Buffer,
861 (PVOID)((ULONG_PTR)TargetContext + ContextEx->Offset),
862 ContextEx->ByteCount);
863
864 /* KD copies all */
865 Data->Length = ContextEx->BytesCopied = ContextEx->ByteCount;
866
867 /* Let the debugger set the context now */
869
870 /* Finish up */
871 State->ReturnStatus = STATUS_SUCCESS;
872 }
873 else
874 {
875 /* Invalid request */
876 ContextEx->BytesCopied = 0;
877 State->ReturnStatus = STATUS_UNSUCCESSFUL;
878 }
879
880 /* Send the reply */
882 &Header,
883 Data,
884 &KdpContext);
885}
886
887VOID
888NTAPI
892{
894 PDBGKD_CONTEXT_EX ContextEx;
896
897 /* Get our struct */
898 ContextEx = &State->u.ContextEx;
899 ASSERT(Data->Length == ContextEx->ByteCount);
900
901 /* Set up the header */
902 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
903 Header.Buffer = (PCHAR)State;
904
905 /* Make sure that this is a valid request */
906 if ((State->Processor < KeNumberProcessors) &&
907 ((ContextEx->Offset + ContextEx->ByteCount) <= sizeof(CONTEXT)) &&
909 {
910 /* Check if the request is for this CPU */
911 if (State->Processor == KeGetCurrentPrcb()->Number)
912 {
913 /* We're just copying our own context */
915 }
916 else
917 {
918 /* Get the context from the PRCB array */
919 TargetContext = &KiProcessorBlock[State->Processor]->
920 ProcessorState.ContextFrame;
921 }
922
923 /* Copy what is requested */
925 Data->Buffer,
926 ContextEx->ByteCount);
927
928 /* KD copies all */
929 ContextEx->BytesCopied = ContextEx->ByteCount;
930
931 /* Finish up */
932 State->ReturnStatus = STATUS_SUCCESS;
933 }
934 else
935 {
936 /* Invalid request */
937 ContextEx->BytesCopied = 0;
938 State->ReturnStatus = STATUS_UNSUCCESSFUL;
939 }
940
941 /* Send the reply */
943 &Header,
944 NULL,
945 &KdpContext);
946}
947
948VOID
949NTAPI
951{
952 /* Crash with the special code */
953 KeBugCheck(MANUALLY_INITIATED_CRASH);
954}
955
956VOID
957NTAPI
961{
963 PDBGKD_READ_WRITE_MSR ReadMsr = &State->u.ReadWriteMsr;
964 ULARGE_INTEGER MsrValue;
965
966 /* Setup the header */
967 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
968 Header.Buffer = (PCHAR)State;
969 ASSERT(Data->Length == 0);
970
971 /* Call the internal routine */
972 State->ReturnStatus = KdpSysReadMsr(ReadMsr->Msr, &MsrValue.QuadPart);
973
974 /* Return the data */
975 ReadMsr->DataValueLow = MsrValue.LowPart;
976 ReadMsr->DataValueHigh = MsrValue.HighPart;
977
978 /* Send the reply */
980 &Header,
981 NULL,
982 &KdpContext);
983}
984
985VOID
986NTAPI
990{
992 PDBGKD_READ_WRITE_MSR WriteMsr = &State->u.ReadWriteMsr;
993 ULARGE_INTEGER MsrValue;
994
995 /* Setup the header */
996 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
997 Header.Buffer = (PCHAR)State;
998 ASSERT(Data->Length == 0);
999
1000 /* Call the internal routine */
1001 MsrValue.LowPart = WriteMsr->DataValueLow;
1002 MsrValue.HighPart = WriteMsr->DataValueHigh;
1003 State->ReturnStatus = KdpSysWriteMsr(WriteMsr->Msr, &MsrValue.QuadPart);
1004
1005 /* Send the reply */
1007 &Header,
1008 NULL,
1009 &KdpContext);
1010}
1011
1012VOID
1013NTAPI
1015 IN PSTRING Data,
1017{
1018 STRING Header;
1019 PDBGKD_GET_SET_BUS_DATA GetBusData = &State->u.GetSetBusData;
1020 ULONG Length;
1021
1022 /* Setup the header */
1023 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1024 Header.Buffer = (PCHAR)State;
1025 ASSERT(Data->Length == 0);
1026
1027 /* Check the length requested */
1028 Length = GetBusData->Length;
1030 {
1031 /* Use maximum allowed */
1033 }
1034
1035 /* Call the internal routine */
1036 State->ReturnStatus = KdpSysReadBusData(GetBusData->BusDataType,
1037 GetBusData->BusNumber,
1038 GetBusData->SlotNumber,
1039 GetBusData->Offset,
1040 Data->Buffer,
1041 Length,
1042 &Length);
1043
1044 /* Return the actual length read */
1045 GetBusData->Length = Length;
1046 Data->Length = (USHORT)Length;
1047
1048 /* Send the reply */
1050 &Header,
1051 Data,
1052 &KdpContext);
1053}
1054
1055VOID
1056NTAPI
1058 IN PSTRING Data,
1060{
1061 STRING Header;
1062 PDBGKD_GET_SET_BUS_DATA SetBusData = &State->u.GetSetBusData;
1063
1064 /* Setup the header */
1065 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1066 Header.Buffer = (PCHAR)State;
1067
1068 /* Call the internal routine */
1069 State->ReturnStatus = KdpSysWriteBusData(SetBusData->BusDataType,
1070 SetBusData->BusNumber,
1071 SetBusData->SlotNumber,
1072 SetBusData->Offset,
1073 Data->Buffer,
1074 SetBusData->Length,
1075 &SetBusData->Length);
1076
1077 /* Send the reply */
1079 &Header,
1080 NULL,
1081 &KdpContext);
1082}
1083
1084VOID
1085NTAPI
1087 IN PSTRING Data,
1089{
1090 STRING Header;
1091 PDBGKD_READ_WRITE_IO64 ReadIo = &State->u.ReadWriteIo;
1092
1093 /* Setup the header */
1094 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1095 Header.Buffer = (PCHAR)State;
1096 ASSERT(Data->Length == 0);
1097
1098 /*
1099 * Clear the value so 1 or 2 byte reads
1100 * don't leave the higher bits unmodified
1101 */
1102 ReadIo->DataValue = 0;
1103
1104 /* Call the internal routine */
1105 State->ReturnStatus = KdpSysReadIoSpace(Isa,
1106 0,
1107 1,
1108 ReadIo->IoAddress,
1109 &ReadIo->DataValue,
1110 ReadIo->DataSize,
1111 &ReadIo->DataSize);
1112
1113 /* Send the reply */
1115 &Header,
1116 NULL,
1117 &KdpContext);
1118}
1119
1120VOID
1121NTAPI
1123 IN PSTRING Data,
1125{
1126 STRING Header;
1127 PDBGKD_READ_WRITE_IO64 WriteIo = &State->u.ReadWriteIo;
1128
1129 /* Setup the header */
1130 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1131 Header.Buffer = (PCHAR)State;
1132 ASSERT(Data->Length == 0);
1133
1134 /* Call the internal routine */
1135 State->ReturnStatus = KdpSysWriteIoSpace(Isa,
1136 0,
1137 1,
1138 WriteIo->IoAddress,
1139 &WriteIo->DataValue,
1140 WriteIo->DataSize,
1141 &WriteIo->DataSize);
1142
1143 /* Send the reply */
1145 &Header,
1146 NULL,
1147 &KdpContext);
1148}
1149
1150VOID
1151NTAPI
1153 IN PSTRING Data,
1155{
1156 STRING Header;
1157 PDBGKD_READ_WRITE_IO_EXTENDED64 ReadIoExtended = &State->u.
1158 ReadWriteIoExtended;
1159
1160 /* Setup the header */
1161 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1162 Header.Buffer = (PCHAR)State;
1163 ASSERT(Data->Length == 0);
1164
1165 /*
1166 * Clear the value so 1 or 2 byte reads
1167 * don't leave the higher bits unmodified
1168 */
1169 ReadIoExtended->DataValue = 0;
1170
1171 /* Call the internal routine */
1172 State->ReturnStatus = KdpSysReadIoSpace(ReadIoExtended->InterfaceType,
1173 ReadIoExtended->BusNumber,
1174 ReadIoExtended->AddressSpace,
1175 ReadIoExtended->IoAddress,
1176 &ReadIoExtended->DataValue,
1177 ReadIoExtended->DataSize,
1178 &ReadIoExtended->DataSize);
1179
1180 /* Send the reply */
1182 &Header,
1183 NULL,
1184 &KdpContext);
1185}
1186
1187VOID
1188NTAPI
1190 IN PSTRING Data,
1192{
1193 STRING Header;
1194 PDBGKD_READ_WRITE_IO_EXTENDED64 WriteIoExtended = &State->u.
1195 ReadWriteIoExtended;
1196
1197 /* Setup the header */
1198 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1199 Header.Buffer = (PCHAR)State;
1200 ASSERT(Data->Length == 0);
1201
1202 /* Call the internal routine */
1203 State->ReturnStatus = KdpSysWriteIoSpace(WriteIoExtended->InterfaceType,
1204 WriteIoExtended->BusNumber,
1205 WriteIoExtended->AddressSpace,
1206 WriteIoExtended->IoAddress,
1207 &WriteIoExtended->DataValue,
1208 WriteIoExtended->DataSize,
1209 &WriteIoExtended->DataSize);
1210
1211 /* Send the reply */
1213 &Header,
1214 NULL,
1215 &KdpContext);
1216}
1217
1218VOID
1219NTAPI
1221{
1222 STRING Header;
1223
1224 /* Setup the header */
1225 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1226 Header.Buffer = (PCHAR)State;
1227
1228 /* Call the internal routine */
1230
1231 /* Send the reply */
1233 &Header,
1234 NULL,
1235 &KdpContext);
1236}
1237
1238VOID
1239NTAPI
1241{
1242 STRING Header;
1243
1244 /* Set failure */
1245 State->ReturnStatus = STATUS_UNSUCCESSFUL;
1246
1247 /* Setup the packet */
1248 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1249 Header.Buffer = (PCHAR)State;
1250
1251 /* Send it */
1253 &Header,
1254 NULL,
1255 &KdpContext);
1256}
1257
1258static
1261 _In_ USHORT ProcessorIndex)
1262{
1263 /* Make sure that the processor index is valid */
1264 if (ProcessorIndex >= KeNumberProcessors)
1265 {
1266 KdpDprintf("%u is not a valid processor number\n", ProcessorIndex);
1268 }
1269
1270 /* If the new processor is the current one, there is nothing to do */
1271 if (ProcessorIndex == KeGetCurrentProcessorNumber())
1272 {
1274 }
1275
1276 /* Call the architecture specific Ke routine */
1277 return KxSwitchKdProcessor(ProcessorIndex);
1278}
1279
1281NTAPI
1283 IN PSTRING SendHeader,
1286{
1288 DBGKD_MANIPULATE_STATE64 ManipulateState;
1289 ULONG Length;
1290 KDSTATUS RecvCode;
1291
1292 /* Setup the Manipulate State structure */
1293 Header.MaximumLength = sizeof(DBGKD_MANIPULATE_STATE64);
1294 Header.Buffer = (PCHAR)&ManipulateState;
1295 Data.MaximumLength = sizeof(KdpMessageBuffer);
1296 Data.Buffer = KdpMessageBuffer;
1297
1298 /*
1299 * Reset the context state to ensure the debugger has received
1300 * the current context before it sets it.
1301 */
1303
1305 /* Send the Packet */
1306 KdSendPacket(PacketType, SendHeader, SendData, &KdpContext);
1307
1308 /* If the debugger isn't present anymore, just return success */
1310
1311 /* Main processing Loop */
1312 for (;;)
1313 {
1314 /* Receive Loop */
1315 do
1316 {
1317 /* Wait to get a reply to our packet */
1319 &Header,
1320 &Data,
1321 &Length,
1322 &KdpContext);
1323
1324 /* If we got a resend request, do it */
1325 if (RecvCode == KdPacketNeedsResend) goto SendPacket;
1326 } while (RecvCode == KdPacketTimedOut);
1327
1328 /* Now check what API we got */
1329 switch (ManipulateState.ApiNumber)
1330 {
1332
1333 /* Read virtual memory */
1334 KdpReadVirtualMemory(&ManipulateState, &Data, Context);
1335 break;
1336
1338
1339 /* Write virtual memory */
1340 KdpWriteVirtualMemory(&ManipulateState, &Data, Context);
1341 break;
1342
1343 case DbgKdGetContextApi:
1344
1345 /* Get the current context */
1346 KdpGetContext(&ManipulateState, &Data, Context);
1347 break;
1348
1349 case DbgKdSetContextApi:
1350
1351 /* Set a new context */
1352 KdpSetContext(&ManipulateState, &Data, Context);
1353 break;
1354
1356
1357 /* Write the breakpoint */
1358 KdpWriteBreakpoint(&ManipulateState, &Data, Context);
1359 break;
1360
1362
1363 /* Restore the breakpoint */
1364 KdpRestoreBreakpoint(&ManipulateState, &Data, Context);
1365 break;
1366
1367 case DbgKdContinueApi:
1368
1369 /* Simply continue */
1370 return NT_SUCCESS(ManipulateState.u.Continue.ContinueStatus);
1371
1373
1374 /* Read control space */
1375 KdpReadControlSpace(&ManipulateState, &Data, Context);
1376 break;
1377
1379
1380 /* Write control space */
1381 KdpWriteControlSpace(&ManipulateState, &Data, Context);
1382 break;
1383
1385
1386 /* Read I/O Space */
1387 KdpReadIoSpace(&ManipulateState, &Data, Context);
1388 break;
1389
1391
1392 /* Write I/O Space */
1393 KdpWriteIoSpace(&ManipulateState, &Data, Context);
1394 break;
1395
1396 case DbgKdRebootApi:
1397
1398 /* Reboot the system */
1400 break;
1401
1402 case DbgKdContinueApi2:
1403
1404 /* Check if caller reports success */
1405 if (NT_SUCCESS(ManipulateState.u.Continue2.ContinueStatus))
1406 {
1407 /* Update the state */
1408 KdpGetStateChange(&ManipulateState, Context);
1409 return ContinueSuccess;
1410 }
1411 else
1412 {
1413 /* Return an error */
1414 return ContinueError;
1415 }
1416
1418
1419 /* Read physical memory */
1420 KdpReadPhysicalMemory(&ManipulateState, &Data, Context);
1421 break;
1422
1424
1425 /* Write physical memory */
1426 KdpWritePhysicalMemory(&ManipulateState, &Data, Context);
1427 break;
1428
1432
1433 /* TODO */
1434 KdpDprintf("Special Call support is unimplemented!\n");
1435 KdpNotSupported(&ManipulateState);
1436 break;
1437
1440
1441 /* TODO */
1442 KdpDprintf("Internal Breakpoint support is unimplemented!\n");
1443 KdpNotSupported(&ManipulateState);
1444 break;
1445
1447
1448 /* Read I/O Space */
1449 KdpReadIoSpaceExtended(&ManipulateState, &Data, Context);
1450 break;
1451
1453
1454 /* Write I/O Space */
1455 KdpWriteIoSpaceExtended(&ManipulateState, &Data, Context);
1456 break;
1457
1458 case DbgKdGetVersionApi:
1459
1460 /* Get version data */
1461 KdpGetVersion(&ManipulateState);
1462 break;
1463
1465
1466 /* Write the breakpoint and check if it failed */
1467 if (!NT_SUCCESS(KdpWriteBreakPointEx(&ManipulateState,
1468 &Data,
1469 Context)))
1470 {
1471 /* Return an error */
1472 return ContinueError;
1473 }
1474 break;
1475
1477
1478 /* Restore the breakpoint */
1479 KdpRestoreBreakPointEx(&ManipulateState, &Data, Context);
1480 break;
1481
1483
1484 /* Crash the system */
1485 KdpCauseBugCheck(&ManipulateState);
1486 break;
1487
1489
1490 /* Switch the processor and return */
1491 return KdpSwitchProcessor(ManipulateState.Processor);
1492
1493 case DbgKdPageInApi:
1494
1495 /* This API, introduced in NT4, has been obsoleted in NT5. It is
1496 * replaced by ExpDebuggerPageIn support in ExpDebuggerWorker(). */
1497 KdpDprintf("DbgKdPageInApi is obsolete!\n");
1498 KdpNotSupported(&ManipulateState);
1499 break;
1500
1502
1503 /* Read from the specified MSR */
1504 KdpReadMachineSpecificRegister(&ManipulateState, &Data, Context);
1505 break;
1506
1508
1509 /* Write to the specified MSR */
1510 KdpWriteMachineSpecificRegister(&ManipulateState, &Data, Context);
1511 break;
1512
1514
1515 /* Search memory */
1516 KdpSearchMemory(&ManipulateState, &Data, Context);
1517 break;
1518
1519 case DbgKdGetBusDataApi:
1520
1521 /* Read from the bus */
1522 KdpGetBusData(&ManipulateState, &Data, Context);
1523 break;
1524
1525 case DbgKdSetBusDataApi:
1526
1527 /* Write to the bus */
1528 KdpSetBusData(&ManipulateState, &Data, Context);
1529 break;
1530
1532
1533 /* Check for memory corruption in the lower 4 GB */
1534 KdpCheckLowMemory(&ManipulateState);
1535 break;
1536
1538
1539 /* Just clear the counter */
1541 break;
1542
1543 case DbgKdFillMemoryApi:
1544
1545 /* Fill memory */
1546 KdpFillMemory(&ManipulateState, &Data, Context);
1547 break;
1548
1550
1551 /* Query memory */
1552 KdpQueryMemory(&ManipulateState, Context);
1553 break;
1554
1556
1557 /* TODO */
1558 KdpDprintf("Partition Switch support is unimplemented!\n");
1559 KdpNotSupported(&ManipulateState);
1560 break;
1561
1563
1564 /* Write the customized breakpoint */
1565 KdpWriteCustomBreakpoint(&ManipulateState, &Data, Context);
1566 break;
1567
1569
1570 /* Extended Context Get */
1571 KdpGetContextEx(&ManipulateState, &Data, Context);
1572 break;
1573
1575
1576 /* Extended Context Set */
1577 KdpSetContextEx(&ManipulateState, &Data, Context);
1578 break;
1579
1580 /* Unsupported Messages */
1581 default:
1582
1583 /* Send warning */
1584 KdpDprintf("Received Unrecognized API 0x%lx\n", ManipulateState.ApiNumber);
1585
1586 /* Setup an empty message, with failure */
1587 Data.Length = 0;
1588 ManipulateState.ReturnStatus = STATUS_UNSUCCESSFUL;
1589
1590 /* Send it */
1592 &Header,
1593 &Data,
1594 &KdpContext);
1595 break;
1596 }
1597 }
1598}
1599
1600VOID
1601NTAPI
1603 IN PKD_SYMBOLS_INFO SymbolInfo,
1606{
1607 PSTRING ExtraData;
1609 DBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange;
1610 ULONG PathNameLength;
1612
1613 /* Start wait loop */
1614 do
1615 {
1616 /* Build the architecture common parts of the message */
1618 Context,
1619 &WaitStateChange);
1620
1621 /* Now finish creating the structure */
1622 KdpSetContextState(&WaitStateChange, Context);
1623
1624 /* Fill out load data */
1625 WaitStateChange.u.LoadSymbols.UnloadSymbols = Unload;
1626 WaitStateChange.u.LoadSymbols.BaseOfDll = (ULONG64)(LONG_PTR)SymbolInfo->BaseOfDll;
1627 WaitStateChange.u.LoadSymbols.ProcessId = SymbolInfo->ProcessId;
1628 WaitStateChange.u.LoadSymbols.CheckSum = SymbolInfo->CheckSum;
1629 WaitStateChange.u.LoadSymbols.SizeOfImage = SymbolInfo->SizeOfImage;
1630
1631 /* Check if we have a path name */
1632 if (PathName)
1633 {
1634 /* Copy it to the path buffer */
1635 KdpCopyMemoryChunks((ULONG_PTR)PathName->Buffer,
1637 PathName->Length,
1638 0,
1640 &PathNameLength);
1641
1642 /* Null terminate */
1643 KdpPathBuffer[PathNameLength++] = ANSI_NULL;
1644
1645 /* Set the path length */
1646 WaitStateChange.u.LoadSymbols.PathNameLength = PathNameLength;
1647
1648 /* Set up the data */
1649 Data.Buffer = KdpPathBuffer;
1650 Data.Length = (USHORT)PathNameLength;
1651 ExtraData = &Data;
1652 }
1653 else
1654 {
1655 /* No name */
1656 WaitStateChange.u.LoadSymbols.PathNameLength = 0;
1657 ExtraData = NULL;
1658 }
1659
1660 /* Setup the header */
1661 Header.Length = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE);
1662 Header.Buffer = (PCHAR)&WaitStateChange;
1663
1664 /* Send the packet */
1666 &Header,
1667 ExtraData,
1668 Context);
1670}
1671
1672VOID
1673NTAPI
1675 IN PSTRING CommandString,
1677{
1679 DBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange;
1680 ULONG Length, ActualLength, TotalLength;
1682
1683 /* Start wait loop */
1684 do
1685 {
1686 /* Build the architecture common parts of the message */
1688 Context,
1689 &WaitStateChange);
1690
1691 /* Set the context */
1692 KdpSetContextState(&WaitStateChange, Context);
1693
1694 /* Clear the command string structure */
1695 KdpZeroMemory(&WaitStateChange.u.CommandString,
1696 sizeof(DBGKD_COMMAND_STRING));
1697
1698 /* Normalize name string to max */
1699 Length = min(128 - 1, NameString->Length);
1700
1701 /* Copy it to the message buffer */
1702 KdpCopyMemoryChunks((ULONG_PTR)NameString->Buffer,
1704 Length,
1705 0,
1707 &ActualLength);
1708
1709 /* Null terminate and calculate the total length */
1710 TotalLength = ActualLength;
1712
1713 /* Check if the command string is too long */
1714 Length = CommandString->Length;
1715 if (Length > (PACKET_MAX_SIZE -
1717 {
1718 /* Use maximum possible size */
1721 }
1722
1723 /* Copy it to the message buffer */
1724 KdpCopyMemoryChunks((ULONG_PTR)CommandString->Buffer,
1726 Length,
1727 0,
1729 &ActualLength);
1730
1731 /* Null terminate and calculate the total length */
1732 TotalLength += ActualLength;
1734
1735 /* Now set up the header and the data */
1736 Header.Length = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE);
1737 Header.Buffer = (PCHAR)&WaitStateChange;
1738 Data.Length = (USHORT)TotalLength;
1739 Data.Buffer = KdpMessageBuffer;
1740
1741 /* Send State Change packet and wait for a reply */
1743 &Header,
1744 &Data,
1745 Context);
1747}
1748
1749BOOLEAN
1750NTAPI
1753 IN BOOLEAN SecondChanceException)
1754{
1756 DBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange;
1758
1759 /* Start report loop */
1760 do
1761 {
1762 /* Build the architecture common parts of the message */
1764
1765#if !defined(_WIN64)
1766
1767 /* Convert it and copy it over */
1769 &WaitStateChange.u.Exception.ExceptionRecord);
1770
1771#else
1772
1773 /* Just copy it directly, no need to convert */
1774 KdpMoveMemory(&WaitStateChange.u.Exception.ExceptionRecord,
1775 ExceptionRecord,
1776 sizeof(EXCEPTION_RECORD));
1777
1778#endif
1779
1780 /* Set the First Chance flag */
1781 WaitStateChange.u.Exception.FirstChance = !SecondChanceException;
1782
1783 /* Now finish creating the structure */
1784 KdpSetContextState(&WaitStateChange, Context);
1785
1786 /* Setup the actual header to send to KD */
1787 Header.Length = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE);
1788 Header.Buffer = (PCHAR)&WaitStateChange;
1789
1790 /* Setup the trace data */
1792
1793 /* Send State Change packet and wait for a reply */
1795 &Header,
1796 &Data,
1797 Context);
1799
1800 /* Return */
1801 return Status;
1802}
1803
1805NTAPI
1807 VOID)
1808{
1809 PKPRCB CurrentPrcb = KeGetCurrentPrcb();
1811 EXCEPTION_RECORD ExceptionRecord = {0};
1813
1814 /* Save the port data */
1815 KdSave(FALSE);
1816
1819
1820 /* Report the new state */
1821 Status = KdpReportExceptionStateChange(&ExceptionRecord,
1823 FALSE);
1824
1825 /* Restore the port data */
1827
1828 return Status;
1829}
1830
1831VOID
1832NTAPI
1837{
1838 LONG OldSlip, NewSlip, PendingSlip;
1839
1840 /* Get the current pending slip */
1841 PendingSlip = KdpTimeSlipPending;
1842 do
1843 {
1844 /* Save the old value and either disable or enable it now. */
1845 OldSlip = PendingSlip;
1846 NewSlip = OldSlip > 1 ? 1 : 0;
1847
1848 /* Try to change the value */
1850 NewSlip,
1851 OldSlip) != OldSlip);
1852
1853 /* If the New Slip value is 1, then do the Time Slipping */
1855}
1856
1857VOID
1858NTAPI
1860{
1861 KIRQL OldIrql;
1863
1864 /* Update the System time from the CMOS */
1868
1869 /* Check if we have a registered Time Slip Event and signal it */
1873
1874 /* Delay the DPC until it runs next time */
1875 DueTime.QuadPart = -1800000000;
1877}
1878
1880NTAPI
1882{
1883 LARGE_INTEGER Null = {{0}};
1884
1885 /* Check if interrupts were disabled */
1886 if (!KeGetTrapFrameInterruptState(TrapFrame))
1887 {
1888 /* Nothing to return */
1889 return Null;
1890 }
1891
1892 /* Otherwise, do the call */
1894}
1895
1896BOOLEAN
1897NTAPI
1899 IN PKEXCEPTION_FRAME ExceptionFrame)
1900{
1902
1903 /* Check if we have a trap frame */
1904 if (TrapFrame)
1905 {
1906 /* Calculate the time difference for the enter */
1910 }
1911 else
1912 {
1913 /* No trap frame, so can't calculate */
1915 }
1916
1917 /* Save the current IRQL */
1918 KeGetCurrentPrcb()->DebuggerSavedIRQL = KeGetCurrentIrql();
1919
1920 /* Freeze all CPUs, raising also the IRQL to HIGH_LEVEL */
1921 Enable = KeFreezeExecution(TrapFrame, ExceptionFrame);
1922
1923 /* Lock the port, save its state and set the debugger entered flag */
1925 KdSave(FALSE);
1927
1928 /* Check freeze flag */
1929 if (KiFreezeFlag & 1)
1930 {
1931 /* Print out errror */
1932 KdpDprintf("FreezeLock was jammed! Backup SpinLock was used!\n");
1933 }
1934
1935 /* Check processor state */
1936 if (KiFreezeFlag & 2)
1937 {
1938 /* Print out errror */
1939 KdpDprintf("Some processors not frozen in debugger!\n");
1940 }
1941
1942 /* Make sure we acquired the port */
1943 if (!KdpPortLocked) KdpDprintf("Port lock was not acquired!\n");
1944
1945 /* Return if interrupts needs to be re-enabled */
1946 return Enable;
1947}
1948
1949VOID
1950NTAPI
1952{
1953 ULONG TimeSlip;
1954
1955 /* Reset the debugger entered flag, restore the port state and unlock it */
1959
1960 /* Unfreeze the CPUs, restoring also the IRQL */
1962
1963 /* Compare time with the one from KdEnterDebugger */
1964 if (!KdTimerStop.QuadPart)
1965 {
1966 /* We didn't get a trap frame earlier in so never got the time */
1968 }
1969 else
1970 {
1971 /* Query the timer */
1973 }
1974
1975 /* Check if a Time Slip was on queue */
1977 if (TimeSlip == 1)
1978 {
1979 /* Queue a DPC for the time slip */
1981 KeInsertQueueDpc(&KdpTimeSlipDpc, NULL, NULL); // FIXME: this can trigger context switches!
1982 }
1983}
1984
1986NTAPI
1988{
1989 KIRQL OldIrql;
1990
1991#if defined(__GNUC__)
1992 /* Make gcc happy */
1994#endif
1995
1996 /* Check if enabling the debugger is blocked */
1997 if (KdBlockEnable)
1998 {
1999 /* It is, fail the enable */
2000 return STATUS_ACCESS_DENIED;
2001 }
2002
2003 /* Check if we need to acquire the lock */
2004 if (NeedLock)
2005 {
2006 /* Lock the port */
2008 KdpPortLock();
2009 }
2010
2011 /* Check if we're not disabled */
2012 if (!KdDisableCount)
2013 {
2014 /* Check if we had locked the port before */
2015 if (NeedLock)
2016 {
2017 /* Do the unlock */
2018 KdpPortUnlock();
2020
2021 /* Fail: We're already enabled */
2023 }
2024 else
2025 {
2026 /*
2027 * This can only happen if we are called from a bugcheck
2028 * and were never initialized, so initialize the debugger now.
2029 */
2030 KdInitSystem(0, NULL);
2031
2032 /* Return success since we initialized */
2033 return STATUS_SUCCESS;
2034 }
2035 }
2036
2037 /* Decrease the disable count */
2038 if (!(--KdDisableCount))
2039 {
2040 /* We're now enabled again! Were we enabled before, too? */
2042 {
2043 /* Reinitialize the Debugger */
2044 KdInitSystem(0, NULL);
2046 }
2047 }
2048
2049 /* Check if we had locked the port before */
2050 if (NeedLock)
2051 {
2052 /* Yes, now unlock it */
2053 KdpPortUnlock();
2055 }
2056
2057 /* We're done */
2058 return STATUS_SUCCESS;
2059}
2060
2062NTAPI
2064{
2065 KIRQL OldIrql;
2067
2068#if defined(__GNUC__)
2069 /* Make gcc happy */
2071#endif
2072
2073 /*
2074 * If enabling the debugger is blocked
2075 * then there is nothing to disable (duh)
2076 */
2077 if (KdBlockEnable)
2078 {
2079 /* Fail */
2080 return STATUS_ACCESS_DENIED;
2081 }
2082
2083 /* Check if we need to acquire the lock */
2084 if (NeedLock)
2085 {
2086 /* Lock the port */
2088 KdpPortLock();
2089 }
2090
2091 /* Check if we're not disabled */
2092 if (!KdDisableCount)
2093 {
2094 /* Check if the debugger was never actually initialized */
2096 {
2097 /* It wasn't, so don't re-enable it later */
2099 }
2100 else
2101 {
2102 /* It was, so we will re-enable it later */
2104 }
2105
2106 /* Check if we were called from the exported API and are enabled */
2107 if ((NeedLock) && (KdPreviouslyEnabled))
2108 {
2109 /* Check if it is safe to disable the debugger */
2111 if (!NT_SUCCESS(Status))
2112 {
2113 /* Release the lock and fail */
2114 KdpPortUnlock();
2116 return Status;
2117 }
2118 }
2119
2120 /* Only disable the debugger if it is enabled */
2122 {
2123 /*
2124 * Disable the debugger; suspend breakpoints
2125 * and reset the debug stub
2126 */
2129
2130 /* We are disabled now */
2132 SharedUserData->KdDebuggerEnabled = FALSE;
2133 }
2134 }
2135
2136 /* Increment the disable count */
2138
2139 /* Check if we had locked the port before */
2140 if (NeedLock)
2141 {
2142 /* Yes, now unlock it */
2143 KdpPortUnlock();
2145 }
2146
2147 /* We're done */
2148 return STATUS_SUCCESS;
2149}
2150
2151/* PUBLIC FUNCTIONS **********************************************************/
2152
2153/*
2154 * @implemented
2155 */
2157NTAPI
2159{
2160 /* Use the internal routine */
2162}
2163
2164/*
2165 * @implemented
2166 */
2168NTAPI
2170{
2171 /* Use the internal routine */
2173}
2174
2216NTAPI
2225{
2227 ULONG Length = 0;
2228
2229 /* Handle some internal commands */
2230 switch ((ULONG)Command)
2231 {
2232#if DBG
2233 case ' soR': /* ROS-INTERNAL */
2234 {
2235 switch ((ULONG_PTR)InputBuffer)
2236 {
2237 case 0x21: // DumpAllThreads:
2239 break;
2240
2241 case 0x22: // DumpUserThreads:
2243 break;
2244
2245 case 0x24: // KdSpare3:
2247 break;
2248
2249 default:
2250 break;
2251 }
2252 return STATUS_SUCCESS;
2253 }
2254
2255#if defined(_M_IX86) && !defined(_WINKD_) // See ke/i386/traphdlr.c
2256 /* Register a debug callback */
2257 case 'CsoR':
2258 {
2259 switch (InputBufferLength)
2260 {
2261 case ID_Win32PreServiceHook:
2262 KeWin32PreServiceHook = InputBuffer;
2263 break;
2264
2265 case ID_Win32PostServiceHook:
2266 KeWin32PostServiceHook = InputBuffer;
2267 break;
2268
2269 }
2270 break;
2271 }
2272#endif
2273
2274 /* Special case for stack frame dumps */
2275 case 'DsoR':
2276 {
2278 break;
2279 }
2280#ifdef KDBG
2281 /* Register KDBG CLI callback */
2282 case 'RbdK':
2283 {
2285 }
2286#endif // KDBG
2287#endif
2288 default:
2289 break;
2290 }
2291
2292 switch (Command)
2293 {
2294 case SysDbgQueryVersion:
2296 {
2298 }
2299 else
2300 {
2303 }
2304 break;
2305
2306 case SysDbgReadVirtual:
2307 case SysDbgWriteVirtual:
2308 if (InputBufferLength != sizeof(SYSDBG_VIRTUAL))
2309 {
2311 }
2312 else
2313 {
2315 PVOID LockedBuffer;
2316 PMDL LockVariable;
2317
2319 Request.Request,
2322 &LockedBuffer,
2323 &LockVariable);
2324 if (NT_SUCCESS(Status))
2325 {
2327 Request.Buffer,
2328 Request.Request,
2329 0,
2331 &Length);
2332 ExUnlockUserBuffer(LockVariable);
2333 }
2334 }
2335 break;
2336
2337 case SysDbgReadPhysical:
2339 if (InputBufferLength != sizeof(SYSDBG_PHYSICAL))
2340 {
2342 }
2343 else
2344 {
2346 PVOID LockedBuffer;
2347 PMDL LockVariable;
2348
2350 Request.Request,
2353 &LockedBuffer,
2354 &LockVariable);
2355 if (NT_SUCCESS(Status))
2356 {
2357 Status = KdpCopyMemoryChunks(Request.Address.QuadPart,
2358 Request.Buffer,
2359 Request.Request,
2360 0,
2362 &Length);
2363 ExUnlockUserBuffer(LockVariable);
2364 }
2365 }
2366 break;
2367
2370 {
2372 }
2373 else
2374 {
2376 PVOID LockedBuffer;
2377 PMDL LockVariable;
2378
2380 Request.Request,
2383 &LockedBuffer,
2384 &LockVariable);
2385 if (NT_SUCCESS(Status))
2386 {
2388 Request.Address,
2389 LockedBuffer,
2390 Request.Request,
2391 &Length);
2392 ExUnlockUserBuffer(LockVariable);
2393 }
2394 }
2395 break;
2396
2399 {
2401 }
2402 else
2403 {
2405 PVOID LockedBuffer;
2406 PMDL LockVariable;
2407
2409 Request.Request,
2412 &LockedBuffer,
2413 &LockVariable);
2414 if (NT_SUCCESS(Status))
2415 {
2417 Request.Address,
2418 LockedBuffer,
2419 Request.Request,
2420 &Length);
2421 ExUnlockUserBuffer(LockVariable);
2422 }
2423 }
2424 break;
2425
2426 case SysDbgReadIoSpace:
2427 if (InputBufferLength != sizeof(SYSDBG_IO_SPACE))
2428 {
2430 }
2431 else
2432 {
2434 PVOID LockedBuffer;
2435 PMDL LockVariable;
2436
2438 Request.Request,
2441 &LockedBuffer,
2442 &LockVariable);
2443 if (NT_SUCCESS(Status))
2444 {
2445 Status = KdpSysReadIoSpace(Request.InterfaceType,
2446 Request.BusNumber,
2447 Request.AddressSpace,
2448 Request.Address,
2449 LockedBuffer,
2450 Request.Request,
2451 &Length);
2452 ExUnlockUserBuffer(LockVariable);
2453 }
2454 }
2455 break;
2456
2457 case SysDbgWriteIoSpace:
2458 if (InputBufferLength != sizeof(SYSDBG_IO_SPACE))
2459 {
2461 }
2462 else
2463 {
2465 PVOID LockedBuffer;
2466 PMDL LockVariable;
2467
2469 Request.Request,
2472 &LockedBuffer,
2473 &LockVariable);
2474 if (NT_SUCCESS(Status))
2475 {
2476 Status = KdpSysWriteIoSpace(Request.InterfaceType,
2477 Request.BusNumber,
2478 Request.AddressSpace,
2479 Request.Address,
2480 LockedBuffer,
2481 Request.Request,
2482 &Length);
2483 ExUnlockUserBuffer(LockVariable);
2484 }
2485 }
2486 break;
2487
2488 case SysDbgReadMsr:
2489 if (InputBufferLength != sizeof(SYSDBG_MSR))
2490 {
2492 }
2493 else
2494 {
2496 Status = KdpSysReadMsr(Request->Address, &Request->Data);
2497 }
2498 break;
2499
2500 case SysDbgWriteMsr:
2501 if (InputBufferLength != sizeof(SYSDBG_MSR))
2502 {
2504 }
2505 else
2506 {
2508 Status = KdpSysWriteMsr(Request->Address, &Request->Data);
2509 }
2510 break;
2511
2512 case SysDbgReadBusData:
2513 if (InputBufferLength != sizeof(SYSDBG_BUS_DATA))
2514 {
2516 }
2517 else
2518 {
2520 PVOID LockedBuffer;
2521 PMDL LockVariable;
2522
2524 Request.Request,
2527 &LockedBuffer,
2528 &LockVariable);
2529 if (NT_SUCCESS(Status))
2530 {
2531 Status = KdpSysReadBusData(Request.BusDataType,
2532 Request.BusNumber,
2533 Request.SlotNumber,
2534 Request.Address,
2535 LockedBuffer,
2536 Request.Request,
2537 &Length);
2538 ExUnlockUserBuffer(LockVariable);
2539 }
2540 }
2541 break;
2542
2543 case SysDbgWriteBusData:
2544 if (InputBufferLength != sizeof(SYSDBG_BUS_DATA))
2545 {
2547 }
2548 else
2549 {
2551 PVOID LockedBuffer;
2552 PMDL LockVariable;
2553
2555 Request.Request,
2558 &LockedBuffer,
2559 &LockVariable);
2560 if (NT_SUCCESS(Status))
2561 {
2562 Status = KdpSysWriteBusData(Request.BusDataType,
2563 Request.BusNumber,
2564 Request.SlotNumber,
2565 Request.Address,
2566 LockedBuffer,
2567 Request.Request,
2568 &Length);
2569 ExUnlockUserBuffer(LockVariable);
2570 }
2571 }
2572 break;
2573
2576 break;
2577
2578 default:
2580 break;
2581 }
2582
2583 if (ReturnLength)
2585
2586 return Status;
2587}
2588
2589/*
2590 * @implemented
2591 */
2593NTAPI
2595 IN ULONG InBufferBytes OPTIONAL,
2596 IN PVOID InBuffer,
2597 IN ULONG OutBufferBytes OPTIONAL,
2599 OUT PULONG OutBufferNeeded OPTIONAL)
2600{
2601 /* Fail if there is no debugger */
2602 if (KdPitchDebugger)
2603 {
2604 /* No debugger, no options */
2606 }
2607
2608 /* Do we recognize this option? */
2609 if (Option != KD_OPTION_SET_BLOCK_ENABLE)
2610 {
2611 /* We don't, clear the output length and fail */
2612 if (OutBufferNeeded) *OutBufferNeeded = 0;
2614 }
2615
2616 /* Verify parameters */
2617 if ((InBufferBytes != sizeof(BOOLEAN)) ||
2618 (OutBufferBytes != 0) ||
2619 (OutBuffer != NULL))
2620 {
2621 /* Invalid parameters for this option, fail */
2623 }
2624
2625 /*
2626 * Check if the high bit is set, meaning we don't
2627 * allow the debugger to be enabled
2628 */
2629 if (KdBlockEnable & 0x80)
2630 {
2631 /* Fail regardless of what state the caller tried to set */
2633 }
2634
2635 /* Set the new block enable state */
2636 KdBlockEnable = *(PBOOLEAN)InBuffer;
2637
2638 /* No output buffer required for this option */
2639 if (OutBufferNeeded) *OutBufferNeeded = 0;
2640
2641 /* We are done */
2642 return STATUS_SUCCESS;
2643}
2644
2645/*
2646 * @implemented
2647 */
2649NTAPI
2651{
2652 /* Check what power state this is */
2653 if (NewState == PowerDeviceD0)
2654 {
2655 /* Wake up the debug port */
2657 return STATUS_SUCCESS;
2658 }
2659 else if ((NewState == PowerDeviceD1) ||
2660 (NewState == PowerDeviceD2) ||
2661 (NewState == PowerDeviceD3))
2662 {
2663 /* Power down the debug port */
2665 return STATUS_SUCCESS;
2666 }
2667 else
2668 {
2669 /* Invalid state! */
2671 }
2672}
2673
2674/*
2675 * @implemented
2676 */
2677BOOLEAN
2678NTAPI
2680{
2681 BOOLEAN Enable, DebuggerNotPresent;
2682
2683 /* Check if the debugger is completely disabled */
2684 if (KdPitchDebugger)
2685 {
2686 /* Don't try to refresh then, fail early */
2687 return TRUE;
2688 }
2689
2690 /* Enter the debugger */
2692
2693 /*
2694 * Attempt to send a string to the debugger
2695 * to refresh the connection state.
2696 */
2697 KdpDprintf("KDTARGET: Refreshing KD connection\n");
2698
2699 /* Save the state while we are holding the lock */
2700 DebuggerNotPresent = KdDebuggerNotPresent;
2701
2702 /* Exit the debugger and return the state */
2704 return DebuggerNotPresent;
2705}
2706
2707/*
2708 * @implemented
2709 */
2711NTAPI
2715{
2716 PULONG Mask;
2717
2718 /* Check if the ID fits in the component table */
2720 {
2721 /* It does, so get the mask from there */
2723 }
2724 else if (ComponentId == MAXULONG)
2725 {
2726 /*
2727 * This is the internal ID used for DbgPrint messages without ID
2728 * and Level. Use the system-wide mask for those.
2729 */
2731 }
2732 else
2733 {
2734#if (NTDDI_VERSION >= NTDDI_VISTA)
2735 /* Use the default component ID */
2737 // Level = DPFLTR_INFO_LEVEL; // Override the Level.
2738#else
2739 /* Invalid ID, fail */
2741#endif
2742 }
2743
2744 /* Convert Level to bit field if required */
2745 if (Level < 32) Level = 1 << Level;
2746 Level &= ~DPFLTR_MASK;
2747
2748 /* Determine if this Level is filtered out */
2749 if ((Kd_WIN2000_Mask & Level) || (*Mask & Level))
2750 {
2751 /* This mask will get through to the debugger */
2752 return (NTSTATUS)TRUE;
2753 }
2754 else
2755 {
2756 /* This mask is filtered out */
2757 return (NTSTATUS)FALSE;
2758 }
2759}
2760
2761/*
2762 * @implemented
2763 */
2765NTAPI
2770{
2771 PULONG Mask;
2772
2773 /* Modifying debug filters requires the debug privilege */
2775 {
2776 /* Fail */
2777 return STATUS_ACCESS_DENIED;
2778 }
2779
2780 /* Check if the ID fits in the component table */
2782 {
2783 /* It does, so get the mask from there */
2785 }
2786 else if (ComponentId == MAXULONG)
2787 {
2788 /*
2789 * This is the internal ID used for DbgPrint messages without ID
2790 * and Level. Use the system-wide mask for those.
2791 */
2793 }
2794 else
2795 {
2796#if (NTDDI_VERSION >= NTDDI_VISTA)
2797 /* Use the default component ID */
2799#else
2800 /* Invalid ID, fail */
2802#endif
2803 }
2804
2805 /* Convert Level to bit field if required */
2806 if (Level < 32) Level = 1 << Level;
2807 Level &= ~DPFLTR_MASK;
2808
2809 /* Set or remove the Level */
2810 if (State)
2811 *Mask |= Level;
2812 else
2813 *Mask &= ~Level;
2814
2815 return STATUS_SUCCESS;
2816}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG _In_ KPROCESSOR_MODE PreviousMode
unsigned char BOOLEAN
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
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1434
Definition: bufpool.h:45
Definition: Header.h:9
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
BOOLEAN NTAPI KeInsertQueueDpc(IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: dpc.c:725
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
#define ExGetPreviousMode
Definition: ex.h:143
static VOID NTAPI Unload(PDRIVER_OBJECT DriverObject)
Definition: floppy.c:377
std::wstring STRING
Definition: fontsub.cpp:33
unsigned int Mask
Definition: fpcontrol.c:82
_In_ PLIST_ENTRY _In_ PSTRING _In_ USHORT _In_opt_ PSTRING _In_opt_ PSTRING _In_ ULONG _In_ ULONG _In_opt_ PVOID TargetContext
Definition: fsrtlfuncs.h:745
#define KeRosDumpStackFrames(Frames, Count)
Definition: gdidebug.h:11
Status
Definition: gdiplustypes.h:25
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
Definition: timer.c:138
#define KeGetCurrentThread
Definition: hal.h:55
VOID NTAPI HalReturnToFirmware(_In_ FIRMWARE_REENTRY Action)
Definition: reboot.c:21
@ Isa
Definition: hwresource.cpp:138
#define InterlockedCompareExchange
Definition: interlocked.h:104
VOID SendPacket(PVOID Context, PNDIS_PACKET NdisPacket, UINT Offset, PVOID LinkAddress, USHORT Type)
Definition: iptest.cpp:247
NTSTATUS NTAPI KdpSysWriteBusData(_In_ BUS_DATA_TYPE BusDataType, _In_ ULONG BusNumber, _In_ ULONG SlotNumber, _In_ ULONG Offset, _In_reads_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _Out_ PULONG ActualLength)
Definition: kdx64.c:151
BOOLEAN KdPreviouslyEnabled
Definition: kddata.c:86
BOOLEAN NTAPI KdInitSystem(_In_ ULONG BootPhase, _In_opt_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kdinit.c:164
ULONG TraceDataBufferPosition
Definition: kddata.c:110
BOOLEAN KdPitchDebugger
Definition: kddata.c:80
BOOLEAN NTAPI KdpDeleteBreakpointRange(IN PVOID Base, IN PVOID Limit)
Definition: kdbreak.c:340
BOOLEAN KdBlockEnable
Definition: kddata.c:84
LARGE_INTEGER KdTimerStop
Definition: kddata.c:121
BOOLEAN KdpContextSent
Definition: kddata.c:69
ULONG Kd_WIN2000_Mask
Definition: kddata.c:143
BOOLEAN KdEnteredDebugger
Definition: kddata.c:88
VOID NTAPI KdpPortLock(VOID)
Definition: kdlock.c:19
VOID NTAPI KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange, IN PCONTEXT Context)
Definition: kdx64.c:66
NTSTATUS NTAPI KdpSysCheckLowMemory(IN ULONG Flags)
Definition: kdx64.c:364
NTSTATUS NTAPI KdpSysWriteIoSpace(_In_ INTERFACE_TYPE InterfaceType, _In_ ULONG BusNumber, _In_ ULONG AddressSpace, _In_ ULONG64 IoAddress, _In_reads_bytes_(DataSize) PVOID DataValue, _In_ ULONG DataSize, _Out_ PULONG ActualDataSize)
Definition: kdx64.c:307
NTSTATUS NTAPI KdpSysWriteMsr(_In_ ULONG Msr, _In_ PULONGLONG MsrValue)
Definition: kdx64.c:116
NTSTATUS NTAPI KdpSysReadMsr(_In_ ULONG Msr, _Out_ PULONGLONG MsrValue)
Definition: kdx64.c:96
NTSTATUS NTAPI KdpSysReadControlSpace(_In_ ULONG Processor, _In_ ULONG64 BaseAddress, _Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _Out_ PULONG ActualLength)
Definition: kdx64.c:166
LONG KdpTimeSlipPending
Definition: kddata.c:118
KDPC KdpTimeSlipDpc
Definition: kddata.c:115
VOID NTAPI KdpGetStateChange(IN PDBGKD_MANIPULATE_STATE64 State, IN PCONTEXT Context)
Definition: kdx64.c:22
ULONG KdComponentTableSize
Definition: kddata.c:484
PKEVENT KdpTimeSlipEvent
Definition: kddata.c:119
NTSTATUS NTAPI KdpSysReadBusData(_In_ BUS_DATA_TYPE BusDataType, _In_ ULONG BusNumber, _In_ ULONG SlotNumber, _In_ ULONG Offset, _Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _Out_ PULONG ActualLength)
Definition: kdx64.c:136
DBGKD_GET_VERSION64 KdVersionBlock
Definition: kddata.c:495
LARGE_INTEGER KdTimerStart
Definition: kd64.h:541
ULONG Kd_DEFAULT_Mask
Definition: kddata.c:245
KSPIN_LOCK KdpDebuggerLock
Definition: kddata.c:67
ULONG KdDisableCount
Definition: kddata.c:89
PKDEBUG_ROUTINE KiDebugRoutine
Definition: kddata.c:74
KSPIN_LOCK KdpTimeSlipEventLock
Definition: kddata.c:120
NTSTATUS NTAPI KdpSysWriteControlSpace(_In_ ULONG Processor, _In_ ULONG64 BaseAddress, _In_reads_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _Out_ PULONG ActualLength)
Definition: kdx64.c:218
ULONG TraceDataBuffer[40]
Definition: kddata.c:109
VOID NTAPI KdpPortUnlock(VOID)
Definition: kdlock.c:27
BOOLEAN NTAPI KdpStub(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChanceException)
Definition: kdtrap.c:266
WORK_QUEUE_ITEM KdpTimeSlipWorkItem
Definition: kddata.c:117
VOID NTAPI KdpRestoreAllBreakpoints(VOID)
Definition: kdbreak.c:368
KD_CONTEXT KdpContext
Definition: kddata.c:65
ULONG KdpNumInternalBreakpoints
Definition: kddata.c:99
CHAR KdpPathBuffer[KDP_MSG_BUFFER_SIZE]
Definition: kddata.c:127
CHAR KdpMessageBuffer[KDP_MSG_BUFFER_SIZE]
Definition: kddata.c:126
PULONG KdComponentTable[MAX_KD_COMPONENT_TABLE_ENTRIES]
Definition: kddata.c:314
ULONG NTAPI KdpAddBreakpoint(IN PVOID Address)
Definition: kdbreak.c:20
NTSTATUS NTAPI KdpAllowDisable(VOID)
Definition: kdx64.c:372
NTSTATUS NTAPI KdpSysReadIoSpace(_In_ INTERFACE_TYPE InterfaceType, _In_ ULONG BusNumber, _In_ ULONG AddressSpace, _In_ ULONG64 IoAddress, _Out_writes_bytes_(DataSize) PVOID DataValue, _In_ ULONG DataSize, _Out_ PULONG ActualDataSize)
Definition: kdx64.c:250
BOOLEAN NTAPI KdpDeleteBreakpoint(IN ULONG BpEntry)
Definition: kdbreak.c:311
VOID NTAPI KdpSuspendAllBreakPoints(VOID)
Definition: kdbreak.c:407
BOOLEAN KdpPortLocked
Definition: kddata.c:66
LARGE_INTEGER KdTimerDifference
Definition: kd64.h:541
KTIMER KdpTimeSlipTimer
Definition: kddata.c:116
static KCONTINUE_STATUS KdpSwitchProcessor(_In_ USHORT ProcessorIndex)
Definition: kdapi.c:1260
VOID NTAPI KdpRestoreBreakPointEx(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:327
VOID NTAPI KdpFillMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:214
NTSTATUS NTAPI NtQueryDebugFilterState(_In_ ULONG ComponentId, _In_ ULONG Level)
Definition: kdapi.c:2712
VOID NTAPI KdpWriteMachineSpecificRegister(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:987
NTSTATUS NTAPI NtSetDebugFilterState(_In_ ULONG ComponentId, _In_ ULONG Level, _In_ BOOLEAN State)
Definition: kdapi.c:2766
NTSTATUS NTAPI KdDisableDebuggerWithLock(IN BOOLEAN NeedLock)
Definition: kdapi.c:2063
VOID NTAPI KdpRestoreBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:271
NTSTATUS NTAPI KdChangeOption(IN KD_OPTION Option, IN ULONG InBufferBytes OPTIONAL, IN PVOID InBuffer, IN ULONG OutBufferBytes OPTIONAL, OUT PVOID OutBuffer, OUT PULONG OutBufferNeeded OPTIONAL)
Definition: kdapi.c:2594
VOID NTAPI KdpGetVersion(IN PDBGKD_MANIPULATE_STATE64 State)
Definition: kdapi.c:444
VOID NTAPI PspDumpThreads(BOOLEAN SystemThreads)
VOID NTAPI KdpGetContext(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:719
BOOLEAN NTAPI KdRefreshDebuggerNotPresent(VOID)
Definition: kdapi.c:2679
VOID NTAPI KdpNotSupported(IN PDBGKD_MANIPULATE_STATE64 State)
Definition: kdapi.c:1240
VOID NTAPI KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:468
VOID NTAPI KdpGetContextEx(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:826
VOID NTAPI KdpQueryMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PCONTEXT Context)
Definition: kdapi.c:133
VOID NTAPI KdpSetCommonState(IN ULONG NewState, IN PCONTEXT Context, IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange)
Definition: kdapi.c:386
VOID NTAPI DumpTraceData(IN PSTRING TraceData)
Definition: kdapi.c:371
VOID NTAPI KdpSearchMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:192
VOID NTAPI KdpReadPhysicalMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:538
VOID NTAPI KdpTimeSlipWork(IN PVOID Context)
Definition: kdapi.c:1859
VOID NTAPI KdpReadControlSpace(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:651
KCONTINUE_STATUS NTAPI KdReportProcessorChange(VOID)
Definition: kdapi.c:1806
BOOLEAN NTAPI KdpReportExceptionStateChange(IN PEXCEPTION_RECORD ExceptionRecord, IN OUT PCONTEXT Context, IN BOOLEAN SecondChanceException)
Definition: kdapi.c:1751
VOID NTAPI KdpWriteBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:236
VOID NTAPI KdpCauseBugCheck(IN PDBGKD_MANIPULATE_STATE64 State)
Definition: kdapi.c:950
VOID NTAPI KdpWriteVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:509
VOID NTAPI KdpReadIoSpace(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1086
VOID NTAPI KdpReportCommandStringStateChange(IN PSTRING NameString, IN PSTRING CommandString, IN OUT PCONTEXT Context)
Definition: kdapi.c:1674
NTSTATUS NTAPI KdpWriteBreakPointEx(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:304
VOID NTAPI KdpWriteIoSpace(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1122
NTSTATUS NTAPI KdSystemDebugControl(_In_ SYSDBG_COMMAND Command, _In_reads_bytes_(InputBufferLength) PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_writes_bytes_(OutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferLength, _Out_opt_ PULONG ReturnLength, _In_ KPROCESSOR_MODE PreviousMode)
Perform various queries to the kernel debugger.
Definition: kdapi.c:2217
NTSTATUS NTAPI KdPowerTransition(IN DEVICE_POWER_STATE NewState)
Definition: kdapi.c:2650
VOID NTAPI KdpSetContext(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:774
VOID NTAPI KdpReportLoadSymbolsStateChange(IN PSTRING PathName, IN PKD_SYMBOLS_INFO SymbolInfo, IN BOOLEAN Unload, IN OUT PCONTEXT Context)
Definition: kdapi.c:1602
VOID NTAPI KdpWritePhysicalMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:601
NTSTATUS NTAPI KdDisableDebugger(VOID)
Definition: kdapi.c:2169
VOID NTAPI KdpZeroMemory(_In_ PVOID Destination, _In_ SIZE_T Length)
Definition: kdapi.c:42
NTSTATUS NTAPI KdEnableDebugger(VOID)
Definition: kdapi.c:2158
VOID NTAPI KdpSetContextEx(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:889
VOID NTAPI KdpSetBusData(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1057
KCONTINUE_STATUS NTAPI KdpSendWaitContinue(IN ULONG PacketType, IN PSTRING SendHeader, IN PSTRING SendData OPTIONAL, IN OUT PCONTEXT Context)
Definition: kdapi.c:1282
VOID NTAPI KdpReadIoSpaceExtended(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1152
NTSTATUS NTAPI KdpCopyMemoryChunks(_In_ ULONG64 Address, _In_ PVOID Buffer, _In_ ULONG TotalSize, _In_ ULONG ChunkSize, _In_ ULONG Flags, _Out_opt_ PULONG ActualSize)
Definition: kdapi.c:55
BOOLEAN NTAPI KdEnterDebugger(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
Definition: kdapi.c:1898
VOID NTAPI KdExitDebugger(IN BOOLEAN Enable)
Definition: kdapi.c:1951
VOID NTAPI KdpSysGetVersion(_Out_ PDBGKD_GET_VERSION64 Version)
Definition: kdapi.c:433
VOID NTAPI KdpReadMachineSpecificRegister(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:958
VOID NTAPI KdpMoveMemory(_In_ PVOID Destination, _In_ PVOID Source, _In_ SIZE_T Length)
Definition: kdapi.c:27
VOID NTAPI KdpCheckLowMemory(IN PDBGKD_MANIPULATE_STATE64 State)
Definition: kdapi.c:1220
VOID NTAPI KdpTimeSlipDpcRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: kdapi.c:1833
VOID NTAPI KdpWriteIoSpaceExtended(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1189
NTSTATUS NTAPI KdEnableDebuggerWithLock(IN BOOLEAN NeedLock)
Definition: kdapi.c:1987
VOID NTAPI KdpWriteCustomBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:349
VOID NTAPI KdpGetBusData(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1014
VOID NTAPI KdpWriteControlSpace(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:692
LARGE_INTEGER NTAPI KdpQueryPerformanceCounter(IN PKTRAP_FRAME TrapFrame)
Definition: kdapi.c:1881
BOOLEAN NTAPI KdbRegisterCliCallback(PVOID Callback, BOOLEAN Deregister)
Definition: kdb_cli.c:3203
NTSTATUS NTAPI KdD0Transition(VOID)
Definition: kdcom.c:99
NTSTATUS NTAPI KdRestore(IN BOOLEAN SleepTransition)
Definition: kdcom.c:121
NTSTATUS NTAPI KdD3Transition(VOID)
Definition: kdcom.c:106
NTSTATUS NTAPI KdSave(IN BOOLEAN SleepTransition)
Definition: kdcom.c:113
BOOLEAN KdDebuggerNotPresent
Definition: kddata.c:81
BOOLEAN KdDebuggerEnabled
Definition: kddata.c:82
VOID NTAPI KdSendPacket(IN ULONG PacketType, IN PSTRING MessageHeader, IN PSTRING MessageData, IN OUT PKD_CONTEXT KdContext)
Definition: kddll.c:314
KDP_STATUS NTAPI KdReceivePacket(IN ULONG PacketType, OUT PSTRING MessageHeader, OUT PSTRING MessageData, OUT PULONG DataLength, IN OUT PKD_CONTEXT KdContext)
Definition: kddll.c:80
#define PCHAR
Definition: match.c:90
#define KdpDprintf(...)
Definition: mmdbg.c:19
#define ASSERT(a)
Definition: mode.c:44
unsigned __int64 ULONG64
Definition: imports.h:198
#define STATUS_DEBUGGER_INACTIVE
Definition: debugger.c:30
#define min(a, b)
Definition: monoChain.cc:55
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1182
@ HalRebootRoutine
Definition: haltypes.h:37
struct _SYSDBG_MSR * PSYSDBG_MSR
struct _SYSDBG_CONTROL_SPACE * PSYSDBG_CONTROL_SPACE
struct _SYSDBG_BUS_DATA * PSYSDBG_BUS_DATA
struct _SYSDBG_PHYSICAL * PSYSDBG_PHYSICAL
@ SysDbgCheckLowMemory
Definition: kdtypes.h:82
@ SysDbgReadPhysical
Definition: kdtypes.h:72
@ SysDbgReadMsr
Definition: kdtypes.h:78
@ SysDbgWriteControlSpace
Definition: kdtypes.h:75
@ SysDbgWriteBusData
Definition: kdtypes.h:81
@ SysDbgWriteVirtual
Definition: kdtypes.h:71
@ SysDbgWritePhysical
Definition: kdtypes.h:73
@ SysDbgQueryVersion
Definition: kdtypes.h:69
@ SysDbgReadControlSpace
Definition: kdtypes.h:74
@ SysDbgReadBusData
Definition: kdtypes.h:80
@ SysDbgReadIoSpace
Definition: kdtypes.h:76
@ SysDbgWriteMsr
Definition: kdtypes.h:79
@ SysDbgReadVirtual
Definition: kdtypes.h:70
@ SysDbgWriteIoSpace
Definition: kdtypes.h:77
struct _SYSDBG_IO_SPACE * PSYSDBG_IO_SPACE
struct _SYSDBG_VIRTUAL * PSYSDBG_VIRTUAL
enum _SYSDBG_COMMAND SYSDBG_COMMAND
enum _KCONTINUE_STATUS KCONTINUE_STATUS
@ ContinueProcessorReselected
Definition: ketypes.h:451
@ ContinueError
Definition: ketypes.h:449
@ ContinueSuccess
Definition: ketypes.h:450
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3043
#define _In_reads_bytes_(s)
Definition: no_sal2.h:170
#define _Out_opt_
Definition: no_sal2.h:214
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _Out_writes_bytes_(s)
Definition: no_sal2.h:178
struct _CONTEXT CONTEXT
_IRQL_requires_same_ _In_ PVOID _Inout_ struct _CONTEXT * ContextRecord
Definition: ntbasedef.h:662
#define ANSI_NULL
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
VOID NTAPI ExUnlockUserBuffer(PMDL Mdl)
Definition: sysinfo.c:194
NTSTATUS NTAPI ExLockUserBuffer(PVOID BaseAddress, ULONG Length, KPROCESSOR_MODE AccessMode, LOCK_OPERATION Operation, PVOID *MappedSystemVa, PMDL *OutMdl)
Definition: sysinfo.c:202
VOID NTAPI ExUpdateSystemTimeFromCmos(IN BOOLEAN UpdateInterruptTime, IN ULONG MaxSepInSeconds)
Definition: time.c:311
VOID NTAPI ExReleaseTimeRefreshLock(VOID)
Definition: time.c:177
BOOLEAN NTAPI ExAcquireTimeRefreshLock(IN BOOLEAN Wait)
Definition: time.c:145
FORCEINLINE VOID KeSweepICache(IN PVOID BaseAddress, IN SIZE_T FlushSize)
Definition: ke.h:280
#define KeGetTrapFrameInterruptState(TrapFrame)
Definition: ke.h:233
#define KeGetContextPc(Context)
Definition: ke.h:31
PKPRCB KiProcessorBlock[]
Definition: krnlinit.c:31
KCONTINUE_STATUS NTAPI KxSwitchKdProcessor(_In_ ULONG ProcessorIndex)
Definition: freeze.c:207
ULONG KiFreezeFlag
Definition: freeze.c:20
BOOLEAN NTAPI KeFreezeExecution(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
Definition: freeze.c:26
USHORT KeProcessorLevel
Definition: krnlinit.c:20
VOID NTAPI KeThawExecution(IN BOOLEAN Enable)
Definition: freeze.c:65
#define MMDBG_COPY_PHYSICAL
Definition: mm.h:76
BOOLEAN NTAPI MmIsSessionAddress(IN PVOID Address)
Definition: session.c:48
#define MMDBG_COPY_UNSAFE
Definition: mm.h:77
VOID NTAPI MmDumpArmPfnDatabase(IN BOOLEAN StatusOnly)
Definition: mminit.c:1465
#define MMDBG_COPY_MAX_SIZE
Definition: mm.h:85
#define MMDBG_COPY_WRITE_COMBINED
Definition: mm.h:80
NTSTATUS NTAPI MmDbgCopyMemory(IN ULONG64 Address, IN PVOID Buffer, IN ULONG Size, IN ULONG Flags)
Definition: mmdbg.c:124
#define MMDBG_COPY_CACHED
Definition: mm.h:78
#define MMDBG_COPY_UNCACHED
Definition: mm.h:79
#define MMDBG_COPY_WRITE
Definition: mm.h:75
const LUID SeDebugPrivilege
Definition: priv.c:39
CCHAR KeNumberProcessors
Definition: processor.c:19
BOOLEAN FASTCALL KeTryToAcquireSpinLockAtDpcLevel(IN OUT PKSPIN_LOCK SpinLock)
Definition: spinlock.c:309
BOOLEAN NTAPI SeSinglePrivilegeCheck(_In_ LUID PrivilegeValue, _In_ KPROCESSOR_MODE PreviousMode)
Checks if a single privilege is present in the context of the calling thread.
Definition: priv.c:744
static BOOL SendData(PINFO pInfo)
Definition: ntpclient.c:76
@ PowerDeviceD1
Definition: ntpoapi.h:50
@ PowerDeviceD0
Definition: ntpoapi.h:49
@ PowerDeviceD2
Definition: ntpoapi.h:51
@ PowerDeviceD3
Definition: ntpoapi.h:52
enum _DEVICE_POWER_STATE DEVICE_POWER_STATE
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
Definition: ntpoapi.h:207
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:242
#define STATUS_INVALID_INFO_CLASS
Definition: ntstatus.h:240
#define STATUS_INVALID_PARAMETER_1
Definition: ntstatus.h:475
#define STATUS_WAKE_SYSTEM_DEBUGGER
Definition: ntstatus.h:188
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
static WCHAR Address[46]
Definition: ping.c:68
PVOID MmHighestUserAddress
Definition: rtlcompat.c:29
_In_ UCHAR _In_ ULONG _Out_ PUCHAR _Outptr_result_bytebuffer_ OutBufferLength PVOID * OutBuffer
Definition: scsi.h:4071
#define KdPacketNeedsResend
Definition: kddll.h:7
ULONG KDSTATUS
Definition: kddll.h:4
#define KdPacketTimedOut
Definition: kddll.h:6
FORCEINLINE ULONG KeGetCurrentProcessorNumber(VOID)
Definition: ke.h:341
#define SharedUserData
#define STATUS_SUCCESS
Definition: shellext.h:65
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
Definition: shell.h:41
DBGKD_COMMAND_STRING CommandString
Definition: windbgkd.h:510
union _DBGKD_ANY_WAIT_STATE_CHANGE::@3641 u
DBGKM_EXCEPTION64 Exception
Definition: windbgkd.h:508
DBGKD_LOAD_SYMBOLS64 LoadSymbols
Definition: windbgkd.h:509
NTSTATUS ContinueStatus
Definition: windbgkd.h:585
NTSTATUS ContinueStatus
Definition: windbgkd.h:579
DBGKD_CONTINUE2 Continue2
Definition: windbgkd.h:800
union _DBGKD_MANIPULATE_STATE64::@3649 u
DBGKD_CONTINUE Continue
Definition: windbgkd.h:799
EXCEPTION_RECORD64 ExceptionRecord
Definition: windbgkd.h:312
DWORD ExceptionCode
Definition: compat.h:208
PVOID ExceptionAddress
Definition: compat.h:211
Definition: ketypes.h:699
KPROCESSOR_STATE ProcessorState
Definition: ketypes.h:672
CONTEXT ContextFrame
Definition: ketypes.h:625
$ULONG LowPart
Definition: ntbasedef.h:577
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:578
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
#define MAXULONG
Definition: typedefs.h:251
uint32_t * PULONG_PTR
Definition: typedefs.h:65
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char * PBOOLEAN
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
LONGLONG QuadPart
Definition: typedefs.h:114
_In_ ULONG TotalLength
Definition: usbdlib.h:158
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
Definition: wdfdpc.h:112
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
_In_ WDFREQUEST _In_ size_t OutputBufferLength
Definition: wdfio.h:320
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
Definition: wdfio.h:322
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
Definition: wdfiotarget.h:953
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG _In_ _Out_ WDFMEMORY * Memory
Definition: wdfmemory.h:169
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190
_Must_inspect_result_ _In_ WDFUSBPIPE _In_ WDFREQUEST _In_opt_ WDFMEMORY ReadMemory
Definition: wdfusb.h:2000
_Must_inspect_result_ _In_ WDFUSBPIPE _In_ WDFREQUEST _In_opt_ WDFMEMORY WriteMemory
Definition: wdfusb.h:1918
#define DbgKdClearAllInternalBreakpointsApi
Definition: windbgkd.h:110
#define DbgKdCheckLowMemoryApi
Definition: windbgkd.h:109
#define DbgKdWriteControlSpaceApi
Definition: windbgkd.h:82
#define DbgKdGetVersionApi
Definition: windbgkd.h:96
#define DbgKdReadControlSpaceApi
Definition: windbgkd.h:81
#define DbgKdGetContextApi
Definition: windbgkd.h:76
#define DbgKdLoadSymbolsStateChange
Definition: windbgkd.h:60
#define DBGKD_CACHING_WRITE_COMBINED
Definition: windbgkd.h:192
#define DbgKdPageInApi
Definition: windbgkd.h:101
#define DbgKdSetContextExApi
Definition: windbgkd.h:116
#define DBGKD_CACHING_CACHED
Definition: windbgkd.h:190
#define DbgKdWriteVirtualMemoryApi
Definition: windbgkd.h:75
#define DbgKdGetContextExApi
Definition: windbgkd.h:115
#define DbgKdWriteCustomBreakpointApi
Definition: windbgkd.h:114
#define DbgKdSwitchPartition
Definition: windbgkd.h:113
#define DBGKD_QUERY_MEMORY_PROCESS
Definition: windbgkd.h:160
#define DBGKD_QUERY_MEMORY_READ
Definition: windbgkd.h:167
#define DbgKdSetContextApi
Definition: windbgkd.h:77
struct _DBGKD_ANY_WAIT_STATE_CHANGE DBGKD_ANY_WAIT_STATE_CHANGE
#define PACKET_MAX_SIZE
Definition: windbgkd.h:18
#define DbgKdReadIoSpaceApi
Definition: windbgkd.h:83
#define DBGKD_QUERY_MEMORY_SESSION
Definition: windbgkd.h:161
#define DbgKdCommandStringStateChange
Definition: windbgkd.h:61
#define PACKET_TYPE_KD_STATE_MANIPULATE
Definition: windbgkd.h:43
#define DbgKdWriteBreakPointExApi
Definition: windbgkd.h:97
#define DbgKdSearchMemoryApi
Definition: windbgkd.h:106
#define DbgKdGetInternalBreakPointApi
Definition: windbgkd.h:93
#define DBGKD_CACHING_UNCACHED
Definition: windbgkd.h:191
#define DbgKdQuerySpecialCallsApi
Definition: windbgkd.h:89
#define DBGKD_QUERY_MEMORY_WRITE
Definition: windbgkd.h:168
#define DbgKdReadVirtualMemoryApi
Definition: windbgkd.h:74
#define DbgKdFillMemoryApi
Definition: windbgkd.h:111
#define DbgKdWriteMachineSpecificRegister
Definition: windbgkd.h:103
#define DbgKdCauseBugCheckApi
Definition: windbgkd.h:99
#define DbgKdContinueApi2
Definition: windbgkd.h:86
#define DbgKdWriteBreakPointApi
Definition: windbgkd.h:78
#define DbgKdExceptionStateChange
Definition: windbgkd.h:59
#define PACKET_TYPE_KD_STATE_CHANGE64
Definition: windbgkd.h:48
#define DbgKdWriteIoSpaceApi
Definition: windbgkd.h:84
#define DbgKdContinueApi
Definition: windbgkd.h:80
#define DbgKdSetInternalBreakPointApi
Definition: windbgkd.h:92
#define DbgKdGetBusDataApi
Definition: windbgkd.h:107
#define DbgKdClearSpecialCallsApi
Definition: windbgkd.h:91
#define DBGKD_QUERY_MEMORY_EXECUTE
Definition: windbgkd.h:169
#define DBGKD_QUERY_MEMORY_VIRTUAL
Definition: windbgkd.h:159
#define DbgKdWriteIoSpaceExtendedApi
Definition: windbgkd.h:95
#define DBGKD_QUERY_MEMORY_KERNEL
Definition: windbgkd.h:162
#define DbgKdSetBusDataApi
Definition: windbgkd.h:108
#define DbgKdSetSpecialCallApi
Definition: windbgkd.h:90
static __inline VOID NTAPI ExceptionRecord32To64(IN PEXCEPTION_RECORD32 Ex32, OUT PEXCEPTION_RECORD64 Ex64)
Definition: windbgkd.h:917
#define DbgKdWritePhysicalMemoryApi
Definition: windbgkd.h:88
#define DbgKdRestoreBreakPointExApi
Definition: windbgkd.h:98
#define DbgKdQueryMemoryApi
Definition: windbgkd.h:112
#define DBGKD_MAXSTREAM
Definition: windbgkd.h:19
#define DbgKdRebootApi
Definition: windbgkd.h:85
#define DbgKdReadMachineSpecificRegister
Definition: windbgkd.h:102
#define DbgKdReadIoSpaceExtendedApi
Definition: windbgkd.h:94
#define DbgKdSwitchProcessor
Definition: windbgkd.h:100
#define DbgKdRestoreBreakPointApi
Definition: windbgkd.h:79
#define DbgKdReadPhysicalMemoryApi
Definition: windbgkd.h:87
struct _DBGKD_MANIPULATE_STATE64 DBGKD_MANIPULATE_STATE64
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
Definition: work.c:723
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
@ DelayedWorkQueue
Definition: extypes.h:190
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
enum _KD_OPTION KD_OPTION
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
@ IoReadAccess
Definition: ketypes.h:863
@ IoWriteAccess
Definition: ketypes.h:864
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:688
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:687
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:689
@ KD_OPTION_SET_BLOCK_ENABLE
Definition: ketypes.h:524
_Inout_ PUCHAR _In_ PUCHAR _Out_ PUCHAR _Out_ PULONG ChunkSize
Definition: rtlfuncs.h:2294