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 }