📄 debugmsgreceiver.cpp
字号:
// DebugMsgReceiver.cpp : implementation file
//
#include "stdafx.h"
#include "VisualJava.h"
#include "DebugMsgReceiver.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//static genStack<int> outstandingIDs;
static idgen = 0;
#define FIELD_ID_SIZE 0
#define METHOD_ID_SIZE 1
#define OBJECT_ID_SIZE 2
#define REFTYPE_ID_SIZE 3
#define FRAME_ID_SIZE 4
/////////////////////////////////////////////////////////////////////////////
// CDebugMsgReceiver
CDebugMsgReceiver::CDebugMsgReceiver()
{
m_nAmountRead = 0;
m_pPacket = NULL;
m_bLengthRead = FALSE;
m_nMsgLength = 0;
m_bHandShaken = FALSE;
memset(m_cHandShake,0,14);
m_iIDSizes[0] =4;
m_iIDSizes[1] =4;
m_iIDSizes[2] =8;
m_iIDSizes[2] =8;
m_iIDSizes[2] =4;
}
CDebugMsgReceiver::~CDebugMsgReceiver()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CDebugMsgReceiver, CSocket)
//{{AFX_MSG_MAP(CDebugMsgReceiver)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CDebugMsgReceiver member functions
void CDebugMsgReceiver::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
if(!m_bHandShaken)
{
CSocketFile f(this,FALSE);
f.Read(m_cHandShake,14);
m_bHandShaken = TRUE;
}
else
{
{
CSocketFile socf(this,FALSE);
socf.Read(&m_nMsgLength,sizeof(int));
m_nMsgLength = ntohl(m_nMsgLength);
m_nMsgLength -= sizeof(int);
//allocate packet buffer
m_pPacket = new BYTE[m_nMsgLength];
int id =0;
socf.Read(&id,sizeof(int));
id = ntohl(id);
if(id == 0)
{
socf.Read(m_pPacket,m_nMsgLength-(sizeof(int)));
free(m_pPacket);
SetBreakPoint();
return;
}
else
{
memcpy(m_pPacket,&id,sizeof(int));
socf.Read(m_pPacket+sizeof(int),m_nMsgLength-(sizeof(int)));
//process packet
ProcessPacket();
}
}
}
}
void CDebugMsgReceiver::RunToCursor()
{
}
#define DB_COMMANDSET_VM 1
#define DB_COMMAND_GETCLASSREF 2
#define DB_CMDID_GETCLASSREF 27
#define DB_COMMAND_GETSIZES 7
#define DB_CMDID_GETSIZES 17
#define DB_CMDSET_EVENTREQUEST 15
#define CMDSET_EVENTREQUEST_SET 1
#define DB_COMMAND_GETALLCLASSREF 3
#define DB_CMNDID_BREAKPOINT 28
#define DB_CMNDID_SETEVENT 29
#define HEADER_SIZE 11
#define EVENT_THREAD 1
void CDebugMsgReceiver::SetBreakPoint()
{
{
int nSize = HEADER_SIZE;
m_pPacket = new BYTE[nSize];
//packet header
packetheader header(11,DB_CMDID_GETCLASSREF,0,1,3);
header.create(m_pPacket);
send(m_hSocket,(char*)m_pPacket,nSize,0);
//request loaded class references
/*
int id = DB_CMDID_GETCLASSREF;
memcpy(m_pPacket+sizeof(int),&id,sizeof(int));
m_pPacket[11] = 3;
send(m_hSocket,(char*)m_pPacket,nSize,0);
*/
free(m_pPacket);
m_pPacket = NULL;
}
/*
{
int nSize = HEADER_SIZE+(sizeof(BYTE)*3)+(sizeof(int)*2);
m_pPacket = new BYTE[nSize];
//packet header
packetheader header(11,DB_CMNDID_SETEVENT,0,DB_CMDSET_EVENTREQUEST,1);
header.create(m_pPacket);
//event request packet header size:
EventRequestPacket evPacket(8,EVENT_THREAD,1);
evPacket.create(m_pPacket+HEADER_SIZE);
//kind of event
int offset = HEADER_SIZE+(sizeof(BYTE)*2)+sizeof(int);
BYTE modKind = 1;
int count = 1;
memcpy(m_pPacket+offset,&modKind,sizeof(BYTE));
memcpy(m_pPacket+offset+sizeof(BYTE),&count,sizeof(int));
send(m_hSocket,(char*)m_pPacket,nSize,0);
free(m_pPacket);
m_pPacket = NULL;
}*/
}
static CDebugMsgReceiver soc;
void CDebugMsgReceiver::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);
if(Accept(soc))
{
TRACE("NEW CONNECTION\n");
char handshake[] = _T("JDWP-Handshake");
::send(soc.m_hSocket,handshake,14,0);
}
}
void CDebugMsgReceiver::ProcessPacket()
{
char* ptrSave = (char*)m_pPacket;
int id =0;
memcpy(&id,m_pPacket,sizeof(int));
m_pPacket += sizeof(int);//skip id
++m_pPacket;//skip flag
WORD error = 0;
memcpy(&error,m_pPacket,sizeof(WORD));
error = ntohs(error);
m_pPacket +=sizeof(WORD);//skip errercode
if(id == DB_CMDID_GETCLASSREF)
{
struct refInfo
{
BYTE refTypeTag;
BYTE* typeID;
char* pclassSig;
int stat;
};
CList<BYTE*,BYTE*>list;
int classCount = 0;
memcpy(&classCount,m_pPacket,sizeof(int));
classCount = ntohl(classCount);
m_pPacket += sizeof(int);
for(int I=0; I<classCount; I++)
{
refInfo* info = new refInfo;
info->typeID = new BYTE[m_iIDSizes[REFTYPE_ID_SIZE]];
memcpy(&info->refTypeTag,m_pPacket,sizeof(BYTE));++m_pPacket;
memcpy(info->typeID,m_pPacket,sizeof(BYTE)*m_iIDSizes[REFTYPE_ID_SIZE]);
m_pPacket += m_iIDSizes[REFTYPE_ID_SIZE];
int len = 0;
memcpy(&len,m_pPacket,sizeof(int));m_pPacket += sizeof(int);len = ntohl(len);
if(len>0)
{
info->pclassSig = new char[len];
memcpy(info->pclassSig,m_pPacket,len); m_pPacket += len;
}
memcpy(&info->stat,m_pPacket,sizeof(int));
info->stat = ntohl(info->stat);
list.AddTail((BYTE*)info);
}
for(POSITION p = list.GetHeadPosition(); p != NULL;)
{
refInfo *ref = (refInfo*)list.GetNext(p);
free(ref->pclassSig);
free(ref->typeID);
delete ref;
}
}
else
if(id == DB_CMDID_GETSIZES)
{
memcpy(m_iIDSizes,m_pPacket,5*sizeof(int));
for(int i=0; i<5;i++)
m_iIDSizes[i] = ntohl(m_iIDSizes[i]);
}
else
if(id == DB_CMNDID_SETEVENT)
{
++m_pPacket;
WORD error = 0;
memcpy(&error,m_pPacket,sizeof(WORD));
error = ntohs(error);
int x = error;
}
else
if(id == DB_CMNDID_BREAKPOINT)
{
}
free(ptrSave);//this guys has had enough:)
}
/*
if(!m_bHandShaken)
{
int nLength = strlen(m_cHandShake);
nLength += Receive(m_cHandShake+nLength,14-nLength);
m_cHandShake[nLength] = '\0';
nLength = strlen(m_cHandShake);
if(nLength == 14)
m_bHandShaken = TRUE;
}
else
{
if(!m_bLengthRead)
{
CSocketFile socf(this,FALSE);
CArchive ar(&soc,CArchive::load);
ar>>m_nMsgLength;
m_nMsgLength = ntohl(m_nMsgLength);
m_bLengthRead = TRUE;
//allocate packet buffer
m_pPacket = new BYTE[m_nMsgLength];
m_nMsgLength = htonl(m_nMsgLength);
memcpy(m_pPacket,&m_nMsgLength,sizeof(int));
m_nMsgLength = ntohl(m_nMsgLength);
m_nAmountRead = sizeof(int);
}
else
if(m_nAmountRead<m_nMsgLength)
{
int r = Receive(m_pPacket+m_nAmountRead,m_nMsgLength-m_nAmountRead);
m_nAmountRead += r;
}
else
{
m_bLengthRead = FALSE;//finished retrieving packet
}
}
int nLength = strlen(m_cHandShake);
nLength += Receive(m_cHandShake+nLength,14-nLength);
m_cHandShake[nLength] = '\0';
nLength = strlen(m_cHandShake);
if(nLength == 14)
m_bHandShaken = TRUE;
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -