URB->TransferBufferの抽出

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;
    }
}