00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include "exp.h"
00026
00027
#pragma hdrstop
00028
#include "kdp.h"
00029
00030
#if defined(ALLOC_PRAGMA)
00031
#pragma alloc_text(PAGE, NtSystemDebugControl)
00032
#endif
00033
00034
00035
NTSTATUS
00036 NtSystemDebugControl (
00037 IN SYSDBG_COMMAND Command,
00038 IN PVOID InputBuffer,
00039 IN ULONG InputBufferLength,
00040 OUT PVOID OutputBuffer,
00041 IN ULONG OutputBufferLength,
00042 OUT PULONG ReturnLength OPTIONAL
00043 )
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 {
00098
NTSTATUS status = STATUS_SUCCESS;
00099 BOOLEAN releaseModuleResoure =
FALSE;
00100 ULONG length = 0;
00101
KPROCESSOR_MODE PreviousMode;
00102
00103 PreviousMode = KeGetPreviousMode();
00104
00105
if (!
SeSinglePrivilegeCheck(
SeDebugPrivilege, PreviousMode)) {
00106
return STATUS_ACCESS_DENIED;
00107 }
00108
00109
00110
00111
00112
00113
try {
00114
00115
00116
00117
00118
00119
00120
if ( PreviousMode !=
KernelMode ) {
00121
00122
if ( InputBufferLength != 0 ) {
00123
ProbeForRead( InputBuffer, InputBufferLength,
sizeof(ULONG) );
00124 }
00125
00126
if ( OutputBufferLength != 0 ) {
00127
ProbeForWrite( OutputBuffer, OutputBufferLength,
sizeof(ULONG) );
00128 }
00129
00130
if ( ARGUMENT_PRESENT(ReturnLength) ) {
00131
ProbeForWriteUlong( ReturnLength );
00132 }
00133 }
00134
00135
00136
00137
00138
00139
switch ( Command ) {
00140
00141
#if i386
00142
00143
case SysDbgQueryTraceInformation:
00144
00145 status = KdGetTraceInformation(
00146 OutputBuffer,
00147 OutputBufferLength,
00148 &length
00149 );
00150
00151
break;
00152
00153
case SysDbgSetTracepoint:
00154
00155
if ( InputBufferLength !=
sizeof(DBGKD_MANIPULATE_STATE64) ) {
00156
return STATUS_INFO_LENGTH_MISMATCH;
00157 }
00158
00159 KdSetInternalBreakpoint( InputBuffer );
00160
00161
break;
00162
00163
case SysDbgSetSpecialCall:
00164
00165
if ( InputBufferLength !=
sizeof(PVOID) ) {
00166
return STATUS_INFO_LENGTH_MISMATCH;
00167 }
00168
00169
KdSetSpecialCall( InputBuffer,
NULL );
00170
00171
break;
00172
00173
case SysDbgClearSpecialCalls:
00174
00175
KdClearSpecialCalls( );
00176
00177
break;
00178
00179
case SysDbgQuerySpecialCalls:
00180
00181 status =
KdQuerySpecialCalls(
00182 OutputBuffer,
00183 OutputBufferLength,
00184 &length
00185 );
00186
00187
break;
00188
00189
#endif
00190
00191
case SysDbgBreakPoint:
00192
if (
KdDebuggerEnabled) {
00193 DbgBreakPointWithStatus(DBG_STATUS_DEBUG_CONTROL);
00194 }
else {
00195 status = STATUS_UNSUCCESSFUL;
00196 }
00197
break;
00198
00199
default:
00200
00201
00202
00203
00204
00205 status = STATUS_INVALID_INFO_CLASS;
00206 }
00207
00208
if ( ARGUMENT_PRESENT(ReturnLength) ) {
00209 *ReturnLength = length;
00210 }
00211 }
00212
00213 except (
EXCEPTION_EXECUTE_HANDLER ) {
00214
00215
if ( releaseModuleResoure ) {
00216
ExReleaseResource( &
PsLoadedModuleResource );
00217
KeLeaveCriticalRegion();
00218 }
00219
00220 status = GetExceptionCode();
00221
00222 }
00223
00224
return status;
00225
00226 }