void CUSBLogDoc::InsertURBs(LONG nNumOfURBs, PVOID data)
{
for(int i = 0; i < nNumOfURBs; i++)
{
PPACKET_HEADER ph = (PPACKET_HEADER) data;
m_arURB.UnserializeURB(ph);
data = ((PUCHAR) data) + ph->uLen;
}
}
BOOL CArrayURB::UnserializeURB(PPACKET_HEADER ph){
CURB *pURB = new CURB_BulkOrInterruptTransfer();
pURB->GrabData(ph);
}
void CURB_BulkOrInterruptTransfer::GrabData(PPACKET_HEADER ph){
...
PUCHAR pData = (PUCHAR)(&ph->UrbHeader);
CopyMemory(&m_BulkOrInterruptTransfer, pData, sizeof(m_BulkOrInterruptTransfer));
pData += m_BulkOrInterruptTransfer.Hdr.Length;
GrabTransferBuffer(pData, m_BulkOrInterruptTransfer.TransferBufferLength);
...
}
void CURB_TransferBuffer::GrabTransferBuffer(PUCHAR pData, int nLength){
...
m_TransferLength = nLength;
PUCHAR m_TransferBuffer = new BYTE [m_TransferLength];
CopyMemory(m_TransferBuffer, pData, m_TransferLength);
...
}
void CURB_TransferBuffer::RenderProperties(void){
...
GenerateHexDump(m_TransferBuffer, m_TransferLength);
...
}
void CURB::GenerateHexDump(PVOID pBuffer, int nSize)
{
PUCHAR pData = (PUCHAR) pBuffer;
const int nBytesPerLine = 16;
TCHAR sLine[7 + 3 * nBytesPerLine];
int nAddress = 0;
while(nSize > 0)
{
LPTSTR sBuffer = sLine;
for(int nByte = 0; nByte < min(nBytesPerLine, max(0, nSize)); ++nByte)
{
PokeHexNumber(sBuffer, pData[nAddress + nByte], 2);
}
nAddress += nBytesPerLine;
nSize -= nBytesPerLine;
}
}