00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "kdp.h"
00023
00024
#ifdef ALLOC_PRAGMA
00025
#pragma alloc_text(PAGEKD, KdpPrintString)
00026
#pragma alloc_text(PAGEKD, KdpPromptString)
00027
#endif
00028
00029 BOOLEAN
00030 KdpPrintString (
00031 IN PSTRING Output
00032 )
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 {
00052
00053 ULONG Length;
00054 STRING MessageData;
00055 STRING MessageHeader;
00056 DBGKD_DEBUG_IO DebugIo;
00057
00058
00059
00060
00061
00062 Length =
KdpMoveMemory(
00063 (PCHAR)
KdpMessageBuffer,
00064 (PCHAR)Output->Buffer,
00065 Output->Length
00066 );
00067
00068
00069
00070
00071
00072
00073
if ((
sizeof(DBGKD_DEBUG_IO) + Length) > PACKET_MAX_SIZE) {
00074 Length = PACKET_MAX_SIZE -
sizeof(DBGKD_DEBUG_IO);
00075 }
00076
00077
00078
00079
00080
00081 DebugIo.ApiNumber = DbgKdPrintStringApi;
00082 DebugIo.ProcessorLevel =
KeProcessorLevel;
00083 DebugIo.Processor = (
USHORT)
KeGetCurrentPrcb()->Number;
00084 DebugIo.u.PrintString.LengthOfString = Length;
00085 MessageHeader.Length =
sizeof(DBGKD_DEBUG_IO);
00086 MessageHeader.Buffer = (PCHAR)&DebugIo;
00087
00088
00089
00090
00091
00092 MessageData.Length = (
USHORT)Length;
00093 MessageData.Buffer =
KdpMessageBuffer;
00094
00095
00096
00097
00098
00099
KdpSendPacket(
00100 PACKET_TYPE_KD_DEBUG_IO,
00101 &MessageHeader,
00102 &MessageData
00103 );
00104
00105
return KdpPollBreakInWithPortLock();
00106 }
00107
00108
00109 BOOLEAN
00110 KdpPromptString (
00111 IN PSTRING Output,
00112 IN OUT PSTRING Input
00113 )
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 {
00136
00137 ULONG Length;
00138 STRING MessageData;
00139 STRING MessageHeader;
00140 DBGKD_DEBUG_IO DebugIo;
00141 ULONG ReturnCode;
00142
00143
00144
00145
00146
00147 Length =
KdpMoveMemory(
00148 (PCHAR)
KdpMessageBuffer,
00149 (PCHAR)Output->Buffer,
00150 Output->Length
00151 );
00152
00153
00154
00155
00156
00157
00158
if ((
sizeof(DBGKD_DEBUG_IO) + Length) > PACKET_MAX_SIZE) {
00159 Length = PACKET_MAX_SIZE -
sizeof(DBGKD_DEBUG_IO);
00160 }
00161
00162
00163
00164
00165
00166 DebugIo.ApiNumber = DbgKdGetStringApi;
00167 DebugIo.ProcessorLevel =
KeProcessorLevel;
00168 DebugIo.Processor = (
USHORT)
KeGetCurrentPrcb()->Number;
00169 DebugIo.u.GetString.LengthOfPromptString = Length;
00170 DebugIo.u.GetString.LengthOfStringRead = Input->MaximumLength;
00171 MessageHeader.Length =
sizeof(DBGKD_DEBUG_IO);
00172 MessageHeader.Buffer = (PCHAR)&DebugIo;
00173
00174
00175
00176
00177
00178 MessageData.Length = (
USHORT)Length;
00179 MessageData.Buffer =
KdpMessageBuffer;
00180
00181
00182
00183
00184
00185
KdpSendPacket(
00186 PACKET_TYPE_KD_DEBUG_IO,
00187 &MessageHeader,
00188 &MessageData
00189 );
00190
00191
00192
00193
00194
00195
00196 MessageHeader.MaximumLength =
sizeof(DBGKD_DEBUG_IO);
00197 MessageData.MaximumLength =
KDP_MESSAGE_BUFFER_SIZE;
00198
00199
do {
00200 ReturnCode =
KdpReceivePacket(
00201 PACKET_TYPE_KD_DEBUG_IO,
00202 &MessageHeader,
00203 &MessageData,
00204 &Length
00205 );
00206
if (ReturnCode ==
KDP_PACKET_RESEND) {
00207
return TRUE;
00208 }
00209 }
while (ReturnCode !=
KDP_PACKET_RECEIVED);
00210
00211
00212
if (Length > Input->MaximumLength) {
00213 Length = Input->MaximumLength;
00214 }
00215
00216 Input->Length = (
USHORT)
KdpMoveMemory(
00217 (PCHAR)Input->Buffer,
00218 (PCHAR)
KdpMessageBuffer,
00219 Length
00220 );
00221
00222
return FALSE;
00223 }