00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "dbgdllp.h"
00022
00023 #define DbgStateChangeSemaphore (NtCurrentTeb()->DbgSsReserved[0])
00024 #define DbgUiApiPort (NtCurrentTeb()->DbgSsReserved[1])
00025
00026
NTSTATUS
00027 DbgUiConnectToDbg( VOID )
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 {
00049
NTSTATUS st;
00050 UNICODE_STRING
PortName;
00051 ULONG ConnectionInformationLength;
00052 SECURITY_QUALITY_OF_SERVICE
DynamicQos;
00053
00054
00055
00056
00057 st = STATUS_SUCCESS;
00058
if ( !
DbgUiApiPort ) {
00059
00060
00061
00062
00063
00064
00065
DynamicQos.ImpersonationLevel = SecurityImpersonation;
00066
DynamicQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
00067
DynamicQos.EffectiveOnly =
TRUE;
00068
00069
00070
RtlInitUnicodeString(&
PortName,
L"\\DbgUiApiPort");
00071 ConnectionInformationLength =
sizeof(
DbgStateChangeSemaphore);
00072 st =
NtConnectPort(
00073 &
DbgUiApiPort,
00074 &
PortName,
00075 &
DynamicQos,
00076
NULL,
00077
NULL,
00078
NULL,
00079 (PVOID)&
DbgStateChangeSemaphore,
00080 &ConnectionInformationLength
00081 );
00082
if (
NT_SUCCESS(st) ) {
00083
NtRegisterThreadTerminatePort(
DbgUiApiPort);
00084 }
else {
00085
DbgUiApiPort =
NULL;
00086 }
00087 }
00088
return st;
00089
00090 }
00091
00092
NTSTATUS
00093 DbgUiWaitStateChange (
00094 OUT PDBGUI_WAIT_STATE_CHANGE StateChange,
00095 IN PLARGE_INTEGER Timeout OPTIONAL
00096 )
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 {
00118
NTSTATUS st;
00119 DBGUI_APIMSG ApiMsg;
00120 PDBGUI_WAIT_STATE_CHANGE args;
00121
00122
00123
00124
00125
00126
00127 top:
00128 st =
NtWaitForSingleObject(
DbgStateChangeSemaphore,
TRUE,Timeout);
00129
if ( st != STATUS_SUCCESS ) {
00130
return st;
00131 }
00132
00133
00134
00135
00136
00137 args = &ApiMsg.u.WaitStateChange;
00138
00139 DBGUI_FORMAT_API_MSG(ApiMsg,DbgUiWaitStateChangeApi,
sizeof(*args));
00140 st =
NtRequestWaitReplyPort(
00141
DbgUiApiPort,
00142 (PPORT_MESSAGE) &ApiMsg,
00143 (PPORT_MESSAGE) &ApiMsg
00144 );
00145
00146
if (
NT_SUCCESS(st) ) {
00147
if ( ApiMsg.ReturnedStatus == DBG_NO_STATE_CHANGE ) {
00148
DbgPrint(
"DBGUISTB: Waring No State Change\n");
00149
goto top;
00150 }
00151 *StateChange = *args;
00152
return ApiMsg.ReturnedStatus;
00153 }
else {
00154
DbgPrint(
"NTDLL: DbgUiWaitStateChange failing with status %x\n", st);
00155
return st;
00156 }
00157 }
00158
00159
NTSTATUS
00160 DbgUiContinue (
00161 IN PCLIENT_ID AppClientId,
00162 IN NTSTATUS ContinueStatus
00163 )
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 {
00201
NTSTATUS st;
00202 DBGUI_APIMSG ApiMsg;
00203 PDBGUI_CONTINUE args;
00204
00205
00206 args = &ApiMsg.u.Continue;
00207 args->AppClientId = *AppClientId;
00208 args->ContinueStatus = ContinueStatus;
00209
00210 DBGUI_FORMAT_API_MSG(ApiMsg,DbgUiContinueApi,
sizeof(*args));
00211
00212 st =
NtRequestWaitReplyPort(
00213
DbgUiApiPort,
00214 (PPORT_MESSAGE) &ApiMsg,
00215 (PPORT_MESSAGE) &ApiMsg
00216 );
00217
00218
if (
NT_SUCCESS(st) ) {
00219
if ( !(
NT_SUCCESS(ApiMsg.ReturnedStatus))) {
00220
DbgPrint(
"NTDLL: DbgUiContinue success with status %x\n", ApiMsg.ReturnedStatus);
00221 }
00222
return ApiMsg.ReturnedStatus;
00223 }
else {
00224
DbgPrint(
"NTDLL: DbgUiContinue failing with status %x\n", st);
00225
return st;
00226 }
00227 }