Exemplo n.º 1
0
//---------------------------------------------------------- main thread ---
void win32_debmod_t::handle_pdb_request()
{
  if ( pdbthread.req_kind == 1 )
  {
    // read input file
    bytevec_t cmd;
    append_dq(cmd, pdbthread.off_ea);
    append_dd(cmd, pdbthread.count);
    void *outbuf = NULL;
    ssize_t outsize = 0;
    // send request to IDA
    int rc = send_ioctl(WIN32_IOCTL_READFILE, &cmd[0], cmd.size(), &outbuf, &outsize);
    if ( rc == 1 && outbuf != NULL )
    {
      // OK
      size_t copylen = qmin(pdbthread.count, outsize);
      memcpy(pdbthread.buffer, outbuf, copylen);
      pdbthread.count = copylen;
      pdbthread.req_result = true;
    }
    else
    {
      pdbthread.req_result = false;
    }
    if ( outbuf != NULL )
      qfree(outbuf);
  }
  else if ( pdbthread.req_kind == 2 )
  {
    // read memory
    ssize_t rc = _read_memory(ea_t(pdbthread.off_ea), pdbthread.buffer, pdbthread.count);
    if ( rc >= 0 )
      pdbthread.count = rc;
    pdbthread.req_result = rc >= 0;
  }
  else
  {
    // unknown request
    pdbthread.req_result = false;
  }
}
Exemplo n.º 2
0
//-------------------------------------------------------------------------
bool varser_t::serialize(bytevec_t &out, const VARIANT &var)
{
  append_dw(out, var.vt);
  if ( (var.vt & VT_BYREF) == VT_BYREF
    || (var.vt & VT_ARRAY) == VT_ARRAY )
  {
    return false;
  }

  const size_t sz_before = out.size();
  switch ( var.vt )
  {
    case VT_EMPTY: // = 0x0000,
    case VT_NULL: // = 0x0001,
      break;
    case VT_I2: // = 0x0002,
    case VT_UI2: // = 0x0012,
      append_dw(out, var.uiVal);
      break;
    case VT_I4: // = 0x0003,
    case VT_UI4: // = 0x0013,
      append_dd(out, var.ulVal);
      break;
    case VT_R4: // = 0x0004,
      append_dd(out, *(uint32*)&var.fltVal);
      break;
    case VT_R8: // = 0x0005,
      append_dq(out, *(uint64*)&var.dblVal);
      break;
    case VT_CY: // = 0x0006,
    case VT_DATE: // = 0x0007,
      break;
    case VT_BSTR: // = 0x0008,
      {
        uint8 *ptr = (uint8*) var.bstrVal;
        ptr -= 4;
        uint32 bcnt = * (uint32*) ptr;
        append_dd(out, bcnt);
        append_memory(out, ptr + 4, bcnt);
      }
      break;
    case VT_DISPATCH: // = 0x0009,
    case VT_ERROR: // = 0x000A,
    case VT_BOOL: // = 0x000B,
    case VT_VARIANT: // = 0x000C,
    case VT_UNKNOWN: // = 0x000D,
    case VT_DECIMAL: // = 0x000E,
    case VT_I1: // = 0x0010,
    case VT_UI1: // = 0x0011,
      append_db(out, var.bVal);
      break;
    case VT_I8: // = 0x0014,
    case VT_UI8: // = 0x0015,
      append_dq(out, var.ullVal);
      break;
    case VT_INT: // = 0x0016,
    case VT_UINT: // = 0x0017,
    case VT_HRESULT: // = 0x0019,
      append_dd(out, var.uintVal);
      break;
    case VT_VOID: // = 0x0018,
    case VT_PTR: // = 0x001A,
    case VT_SAFEARRAY: // = 0x001B,
    case VT_CARRAY: // = 0x001C,
    case VT_USERDEFINED: // = 0x001D,
    case VT_LPSTR: // = 0x001E,
    case VT_LPWSTR: // = 0x001F,
    case VT_RECORD: // = 0x0024,
    case VT_INT_PTR: // = 0x0025,
    case VT_UINT_PTR: // = 0x0026,
      break;
    default: break;
  }
  return out.size() > sz_before;
}