All pastes #604981 Raw Edit

Stuff

public text v1 · immutable
·published 2007-07-05 21:44 UTC
rendered paste body
int __usercall sendCommandToDevice<eax>(AMRecoveryModeDevice *amrecd<esi>,void *cfsCommand)
{
  char *_szCommand; // eax@1
  unsigned int v3; // eax@3
  int result; // eax@4
  unsigned int _cmdLen; // ebp@5
  signed int v6; // eax@10
  int _writeSize; // edi@13
  char v8; // cl@2
  unsigned __int8 v9; // dl@9
  AppleDevice *v10; // ebx@9
  AppleDevice *v11; // ebx@14
  char *buffer; // [sp+Ch] [bp-434h]@1
  unsigned int v13; // [sp+43Ch] [bp-4h]@1
  char szCommand[1028]; // [sp+38h] [bp-408h]@1
  int v15; // [sp+18h] [bp-428h]@8
  ControlRequest cmdRequest; // [sp+20h] [bp-420h]@9
  DWORD pbufsize; // [sp+10h] [bp-430h]@9
  ControlResponse cmdResponse; // [sp+2Ch] [bp-414h]@10
  char ctlNo; // [sp+1Ch] [bp-424h]@14

  v13 = (unsigned int)&buffer ^ security_cookie;
  CFStringGetCString(cfsCommand, szCommand, 1024, 134217984);
  strcat_s(szCommand, 0x400u, L"\n");
  _szCommand = szCommand;
  do
    v8 = *_szCommand++;
  while ( v8 );
  v3 = _szCommand - &szCommand[1];
  if ( v3 < 0x400 )
  {
    _cmdLen = (v3 + 15) & 0xFFFFFFF0;
    if ( _cmdLen > v3 )
      memset(&szCommand[v3], 0, _cmdLen - v3);
    buffer = szCommand;
    if ( _cmdLen > 0 )
    {
      v15 = 0;
      do
      {
        v9 = amrecd->nControlWrite;
        v10 = amrecd->m_pAppleDevicePipe;
        cmdRequest.userData2 = v15;
        pbufsize = 12;
        cmdRequest.nReqNo = 3;
        cmdRequest.wMagic = 4660;
        cmdRequest.nExtraSize = 8;
        cmdRequest.userData1 = _cmdLen;
        if ( AMRUSBInterfaceWritePipe(&cmdRequest, 0xCu, v10, v9) )
          break;
        v6 = AMRUSBInterfaceReadPipe(&cmdResponse, &pbufsize, amrecd->m_pAppleDevicePipe, amrecd->nControlRead);
        if ( v6 )
          break;
        if ( pbufsize == v6 || (_BYTE)cmdResponse.nExtraSize != 8 )
          break;
        _writeSize = cmdResponse.userData1;
        if ( cmdResponse.userData1 )
        {
          v11 = amrecd->m_pAppleDevicePipe;
          ctlNo = amrecd->nExtraDataWrite;
          if ( AMRUSBInterfaceWritePipe(buffer, cmdResponse.userData1, v11, ctlNo) )
            break;
          _cmdLen -= _writeSize;
          buffer += _writeSize;
        }
      }
      while ( _cmdLen );
    }
    result = -(_cmdLen != 0) & 6;
  }
  else
  {
    result = 1;
  }
  return result;
}