📄 edbgprot.c
字号:
}
KITL_DEBUGMSG(ZONE_RECV,("KITL(%u): Received frame Seq: %u, len: %u, putting in slot %u\n",
ClientIdx, pMsg->SeqNum, wMsgLen, RxBufOffset));
// If frames were dropped, send NACK (only allow one outstanding NACK)
if (pMsg->SeqNum != pClient->RxSeqNum) {
KITL_DEBUGMSG(ZONE_WARNING,("!KITL(%u): Dropped frame (seq: %u, win: %u,%u)\n",
ClientIdx,pMsg->SeqNum,pClient->RxSeqNum, pClient->RxWinEnd));
if (!(pClient->State & KITL_NACK_SENT)) {
SendAckNack(FALSE, pClient, pClient->RxSeqNum);
pClient->State |= KITL_NACK_SENT;
}
}
else
pClient->State &= ~KITL_NACK_SENT;
// Copy data to receive buffer, unblock anyone waiting, and close receive window
wDataLen = wMsgLen - sizeof(KITL_HDR);
if (wDataLen == 0)
KITL_DEBUGMSG(ZONE_WARNING,("!KITL: Received data message with 0 length!\n"));
if (pClient->ProcPerms) {
// acquire permission of pClient and add it to current thread
ACCESSKEY aKey = GETCURKEY() | pClient->ProcPerms;
SWITCHKEY (OldProcPerms, aKey);
}
memcpy(pClient->pRxBufferPool + RxBufOffset * KITL_MTU, KITLDATA(pMsg), wDataLen);
if (pClient->ProcPerms) {
SETCURKEY (OldProcPerms);
}
pClient->RxFrameLen[RxBufOffset] = wDataLen;
if (pClient->State & KITL_USE_SYSCALLS)
// If we get here, we know that fUseSysCalls is TRUE
SetClientEvent(pClient,pClient->evRecv);
// Close receive window
while (pClient->RxFrameLen[pClient->RxSeqNum % pClient->WindowSize] &&
(SEQ_DELTA(pClient->RxSeqNum, pClient->RxWinEnd) >= 1)) {
KITL_DEBUGMSG(ZONE_RECV,("Rx win: %u,%u, usesyscalls: %u\n",pClient->RxSeqNum, pClient->RxWinEnd, fUseSysCalls));
SEQ_INC(pClient->RxSeqNum);
}
}
ProcessKITLMsg_exit:
if (fUseSysCalls && (pClient->State & KITL_USE_SYSCALLS))
LeaveCriticalSection(&pClient->ClientCS);
return fRet;
}
static BOOL ProcessAdminMsg(KITL_HDR *pHdr, WORD wMsgLen, BOOL fUseSysCalls, PFN_TRANSMIT pfnTransmit, LPVOID pData)
{
KITL_CLIENT *pClient = NULL;
switch (pHdr->Cmd)
{
case KITL_CMD_SVC_CONFIG:
{
KITL_SVC_CONFIG_DATA *pCfg = (KITL_SVC_CONFIG_DATA *) KITLDATA (pHdr);
int i, iStart;
if (wMsgLen != (sizeof(KITL_HDR) + sizeof(KITL_SVC_CONFIG_DATA))) {
KITL_DEBUGMSG(ZONE_WARNING,("!ProcessAdminMsg: Invalid legnth for CONFIG msg: %u\n",wMsgLen));
return FALSE;
}
// Find client struct
if ((i = ChkDfltSvc (pCfg->ServiceName)) < 0)
i = HASH(pCfg->ServiceName[0]);
iStart = i;
while (KITLClients[i]) {
// For multi instanced services, skip clients that are already registered
if (!strcmp(KITLClients[i]->ServiceName,pCfg->ServiceName) &&
(!(KITLClients[i]->State & KITL_CLIENT_REGISTERED) || !(KITLClients[i]->CfgFlags & KITL_CFGFL_MULTIINST))) {
pClient = KITLClients[i];
break;
}
if (i < NUM_DFLT_KITL_SERVICES)
// no dups for default services
break;
if (MAX_KITL_CLIENTS == ++ i)
i = NUM_DFLT_KITL_SERVICES;
if (iStart == i)
break; // couldn't find a client
}
if (!pClient || !(pClient->State & (KITL_CLIENT_REGISTERING|KITL_CLIENT_REGISTERED))) {
KITL_DEBUGMSG(ZONE_WARNING,("!Received config for unrecognized service %s\n",
pCfg->ServiceName));
return TRUE;
}
if (fUseSysCalls)
EnterCriticalSection(&pClient->ClientCS);
// Send config to peer, unless this was a response to our cmd
if (!(pHdr->Flags & KITL_FL_ADMIN_RESP)) {
// ack this config message
SendConfig(pClient,TRUE);
// Stop any pending transfers, reset sequence #s, etc
// WARNING - can cause lost transmit data if the other side doesn't get
// our config, and retries the config command.
if (pClient->State & KITL_SYNCED) {
ResetClientState(pClient);
}
}
//
// we got the response from desktop, connecting the client
//
KITL_DEBUGMSG(ZONE_INIT, ("ProcessAdminMsg: Receive Config message for service %s\n", pClient->ServiceName));
pClient->State &= ~(KITL_WAIT_CFG|KITL_CLIENT_REGISTERING);
pClient->State |= KITL_CLIENT_REGISTERED;
// Set our event in case anyone is waiting for config info
if (fUseSysCalls)
SetClientEvent(pClient,pClient->evCfg);
if (fUseSysCalls)
LeaveCriticalSection(&pClient->ClientCS);
break;
}
case KITL_CMD_RESET:
{
KITL_RESET_DATA *pResetData = (KITL_RESET_DATA *) KITLDATA (pHdr);
KITLOutputDebugString("KITL: Got RESET command\n");
// Set for clean boot if requested
if (pResetData->Flags & KITL_RESET_CLEAN)
SC_SetCleanRebootFlag();
// This function never returns
KernelIoctl(IOCTL_HAL_REBOOT, NULL,0,NULL,0,NULL);
KITLOutputDebugString("KITL: IOCTL_HAL_REBOOT not supported on this platform\n");
break;
}
case KITL_CMD_DEBUGBREAK:
if (fUseSysCalls && IsDesktopDbgrExist ())
DoDebugBreak ();
break;
case KITL_CMD_TRAN_CONFIG:
{
int i;
PKITL_HOST_TRANSCFG pCfg = (PKITL_HOST_TRANSCFG) KITLDATA(pHdr);
wMsgLen -= sizeof(KITL_HDR);
if (pCfg->dwLen != wMsgLen) {
KITLOutputDebugString ("!Host config message size mismatch %d, %d\r\n", pCfg->dwLen, wMsgLen);
return FALSE;
}
wMsgLen -= sizeof (KITL_HOST_TRANSCFG);
if (!Kitl.pfnSetHostCfg ((LPBYTE) (pCfg+1), wMsgLen))
return FALSE;
Kitl.dwBootFlags = pCfg->dwFlags;
if (pCfg->dwKeySig == HOST_TRANSCFG_KEYSIG) {
for (i = 0; i < HOST_TRANSCFG_NUM_REGKEYS; i++) {
g_dwKeys[i] = pCfg->dwKeys[i];
KITL_DEBUGMSG (ZONE_INIT, (" KeyIndex %d = %d \n", i, g_dwKeys[i]));
}
}
KITLGlobalState |= KITL_ST_DESKTOP_CONNECTED;
}
break;
// in case we're polling (pfnTransmit && pData only set to non-null if we're polling)
// we'll use desktop as our timer (desktop sends a retransmit packet to us every 2 seconds).
case KITL_CMD_RETRASMIT:
if (pfnTransmit && pData) {
// KITLOutputDebugString ("Retrasmitting packets....\n");
pfnTransmit (pData, fUseSysCalls);
}
break;
default:
KITL_DEBUGMSG(ZONE_WARNING,("!ProcessAdminMsg: Unhandled command 0x%X\n",pHdr->Cmd));
return FALSE;
}
return TRUE;
}
static void
KITLDecodeFrame(char *LeadingText, KITL_HDR *pHdr, WORD wLen)
{
// Watch for reentrancy - we may be calling in to do a debug message from within
// EnterCriticalSection() for example.
BOOL fUseSysCalls = (KITLGlobalState & KITL_ST_MULTITHREADED) && !InSysCall() && (KITLODScs.OwnerThread != hCurThread);
LARGE_INTEGER liPerfCnt;
if (fUseSysCalls) {
DWORD ms;
EnterCriticalSection(&KITLODScs);
SC_QueryPerformanceCounter(&liPerfCnt);
ms = liPerfCnt.LowPart/1000;
// Print out ms count
KITLOutputDebugString("(%u.%u) ",ms/1000,ms%1000);
}
if (LeadingText)
KITLOutputDebugString(LeadingText);
switch (pHdr->Service)
{
case KITL_SVC_DBGMSG:
KITLOutputDebugString(" DBGMSG ");
break;
case KITL_SVC_PPSH:
KITLOutputDebugString(" PPSH ");
break;
case KITL_SVC_KDBG:
KITLOutputDebugString(" KDBG ");
break;
case KITL_SVC_ADMIN:
KITLOutputDebugString(" ADMIN ");
switch (pHdr->Cmd)
{
case KITL_CMD_BOOTME:
KITLOutputDebugString("BOOTME ");
break;
case KITL_CMD_JUMPIMG:
KITLOutputDebugString("JUMPIMG ");
break;
case KITL_CMD_RESET:
KITLOutputDebugString("RESET ");
break;
case KITL_CMD_SVC_CONFIG:
KITLOutputDebugString("CFG");
if (pHdr->Flags & KITL_FL_FROM_DEV) {
KITL_SVC_CONFIG_DATA *pCfg = (KITL_SVC_CONFIG_DATA *)KITLDATA(pHdr);
KITLOutputDebugString("DEV %s, ProtoVer:%u, Service: %s, Id: %u, Window: %u, Fl:0x%X",
(pHdr->Flags & KITL_FL_ADMIN_RESP)? "RESP":"CMD",
pCfg->ProtocolVersion,pCfg->ServiceName,pCfg->ServiceId,
pCfg->WindowSize,pCfg->Flags);
}
else {
KITL_SVC_CONFIG_DATA *pCfg = (KITL_SVC_CONFIG_DATA *)KITLDATA(pHdr);
KITLOutputDebugString("DESK %s, ProtoVer:%u, Service: %s, Id: %u",
(pHdr->Flags & KITL_FL_ADMIN_RESP)? "RESP":"CMD",
pCfg->ProtocolVersion,pCfg->ServiceName, pCfg->ServiceId);
}
break;
case KITL_CMD_RETRASMIT:
KITLOutputDebugString("RETRANSMIT ");
break;
default:
KITLOutputDebugString("Unrecognized cmd: 0x%X ",pHdr->Cmd);
break;
}
break;
default:
KITLOutputDebugString(" Svc:0x%X",pHdr->Service);
break;
}
if (pHdr->Service != KITL_SVC_ADMIN) {
KITLOutputDebugString(" Seq:%u(0x%X), Flags:0x%X ",pHdr->SeqNum,pHdr->SeqNum,pHdr->Flags);
if (pHdr->Flags) {
KITLOutputDebugString("(");
if (pHdr->Flags & KITL_FL_ACK)
KITLOutputDebugString("ACK ");
if (pHdr->Flags & KITL_FL_NACK)
KITLOutputDebugString("NACK ");
if (pHdr->Flags & KITL_FL_FROM_DEV)
KITLOutputDebugString("DEV ");
KITLOutputDebugString(")");
}
}
KITLOutputDebugString(", DataLen: %u\n",wLen - sizeof(KITL_HDR));
if (fUseSysCalls)
LeaveCriticalSection(&KITLODScs);
}
//
// KitlSendRawData:
// calling the transport Send Function, with the necessary protection
//
BOOL KitlSendRawData (LPBYTE pbData, WORD wLength)
{
BOOL fRet;
if (!(KITLGlobalState & KITL_ST_MULTITHREADED) || InSysCall())
fRet = Kitl.pfnSend (pbData, wLength);
else if (IsDesktopDbgrExist ())
fRet = KCall((PKFN) Kitl.pfnSend, pbData, wLength);
else {
EnterCriticalSection (&KITLKCallcs);
fRet = Kitl.pfnSend (pbData, wLength);
LeaveCriticalSection (&KITLKCallcs);
}
return fRet;
}
// NOTE: pFrame is pointing to the start of the frame, cbData is ONLY the size of the data
// NOT the size of the frame
// ----------------
// | Frame Header |
// |--------------|
// | Data | // of size cbData
// |--------------|
// | Frame Tailer |
// |--------------|
BOOL KitlSendFrame (LPBYTE pbFrame, WORD cbData)
{
if (!Kitl.pfnEncode (pbFrame, cbData)) {
KITLOutputDebugString ("!KitlSendFrame: transport failed to encode the data frame\r\n");
return FALSE;
}
return KitlSendRawData (pbFrame, (USHORT) (cbData + Kitl.FrmHdrSize + Kitl.FrmTlrSize));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -