示例#1
0
bool GzippedFileReader::Open(const wxString& fileName) {
	Close();
	m_filename = fileName;
	if (!(m_src = PX_fopen_rb(m_filename)) || !CanHandle(fileName) || !OkIndex()) {
		Close();
		return false;
	};

	AsyncPrefetchOpen();
	return true;
};
示例#2
0
bool cCardClientRadegast::ProcessECM(const cEcmInfo *ecm, const unsigned char *source, unsigned char *cw)
{
  cMutexLock lock(this);
  if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false;
  so.Flush();
  int len=SCT_LEN(source);
  int keynr=-1;
  switch(ecm->caId>>8) {
    case 0x01: // Seca
      keynr=cParseSeca::KeyNr(source)&0x0F; break;
    case 0x05: // Viaccess
      keynr=cParseViaccess::KeyNr(source); break;
    case 0x18: // Nagra2
      if(ecm->caId>=0x1801) keynr=(source[7]&0x10) | 0x86;
      break;
    }
  unsigned char buff[512], tmp[10];
  StartMsg(buff,1);			// CMD_ECM_KEY_ASK
  AddNano(buff,2,1,ecm->caId>>8);       // ECM_NANO_CAID_INDEX (old)
  AddNano(buff,10,2,ecm->caId);		// ECM_NANO_CAID
  sprintf((char *)tmp,"%08X",ecm->provId);
  AddNano(buff,6,8,tmp);		// ECM_NANO_PROVIDER
  if(keynr>=0) {
    sprintf((char *)tmp,"%04X",keynr);
    AddNano(buff,7,4,tmp);		// ECM_NANO_KEYNO
    }
  if(!CheckLength(buff,len)) return false;
  AddNano(buff,3,len,source);		// ECM_NANO_PACKET

  if(!Send(buff) || (len=Recv(buff,sizeof(buff)))<0) return false;
  if(buff[0]==2) {
    for(int l=GetNanoStart(buff); l<len; l+=buff[l+1]+2) {
      switch(buff[l]) {
        case 0x05:
          if(buff[l+1]==16) {
            // check for zero cw, as someone may not send both cw's every time
            if(!CheckNull(buff+l+ 2,8)) memcpy(cw+0,buff+l+ 2,8);
            if(!CheckNull(buff+l+10,8)) memcpy(cw+8,buff+l+10,8);
            return true;
            }
          else PRINTF(L_CC_RDGD,"wrong cw length %d from server",buff[l+1]);
          break;
        case 0x04:
          PRINTF(L_CC_ECM,"%s: key not available from server",name);
          break;
        default:
          PRINTF(L_CC_RDGD,"unknown nano %02x in ECM response",buff[l]);
          break;
        }
      }
    }
  else PRINTF(L_CC_RDGD,"bad ECM response from server %02x != 02",buff[0]);
  return false;
}
示例#3
0
void stdXmlHandler::CreateChildrenPrivately(xmlNode *rootnode)
{
	xmlNode *root;
	if (rootnode == NULL) root = m_node; else root = rootnode;
	xmlNode *n = root->children;

	while (n != NULL)
	{
		if (CanHandle(n))
		{
			CreateResource(n,stdEmptyString, NULL);
		}
		n = n->next;
    }
}
示例#4
0
文件: gbox.c 项目: attuska/Sasc-ng
bool cCardClientGbox::ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw, int cardnum)
{
  cMutexLock lock(this);
  if((!so.Connected() && !Login()) || !CanHandle(ecm->caId)) return false;
  so.Flush();

  const int caid=ecm->caId;
  const int pid =ecm->ecm_pid;
  int n;
  const unsigned char *descr=ecm->GetCaDescr(&n);
  if(!descr) {
    PRINTF(L_CC_GBOX,"no CA descriptor for caid %04x sid %d prov %04x",caid,ecm->prgId,ecm->provId);
    return false;
    }

  static const unsigned char pmt[] = {
    0x87,
    0x02,0xb0,0x25, 	// tid, sct len
    0x17,0x74, 		// sid
    0xc3,0x00,0x00, 	// vers, sctnr
    0xff,0xec, 		// pcr pid
    0xf0,0x00,		// prg info len
    0x02, 0xff,0xec, 0xf0,0x00
    };
  unsigned char buff[512];
  if(sizeof(pmt)+n+8>sizeof(buff)) {
    PRINTF(L_CC_GBOX,"CA descriptor buffer overflow %d",sizeof(pmt)+n+8);
    return false;
    }
  memcpy(buff,pmt,sizeof(pmt));
  buff[4]=ecm->prgId >> 8;
  buff[5]=ecm->prgId & 0xFF;
  memcpy(&buff[sizeof(pmt)],descr,n);
  buff[16]=0xF0 | ((n>>8)&0x0F);
  buff[17]=n & 0xFF;
  SetSctLen(&buff[1],sizeof(pmt)-4+n+4);
  buff[2]=(buff[2]&0x0F)|0xB0;

  if(so.SendTo("127.0.0.1",8004,buff,sizeof(pmt)+n+4)<0) {
    PRINTF(L_CC_GBOX,"failed to send PMT data. GBOX running?");
    return false;
    }

  if((n=GetMsg(0x8a,buff,sizeof(buff)))<0) {
    PRINTF(L_CC_GBOX,"failed to get ECM port. GBOX running?");
    return false;
    }
  int pidnum=-1;
  if(n>=2) {
    for(int i=0 ; i<buff[1]; i++) {
      if(WORD(buff,2+i*2,0x1FFF)==pid) {
        pidnum=i;
        break;
        }
      }
    }
  if(pidnum<0) {
    PRINTF(L_CC_ECM,"%s: unable to decode for CAID %04X/PID %04X",name,caid,pid);
    return false;
    }

  n=SCT_LEN(data);
  if(n>=256) {
    PRINTF(L_CC_ECM,"%s: ECM section too long %d > 255",name,n);
    return false;
    }
  buff[0]=0x88;
  buff[1]=(pid>>8)&0x1F;
  buff[2]=pid & 0xFF;
  buff[3]=n;
  memcpy(&buff[4],data,n);
  n+=4;
  if(so.SendTo("127.0.0.1",8005+pidnum,buff,n)<0) {
    PRINTF(L_CC_GBOX,"failed to send ECM data. GBOX running?");
    return false;
    }

  if(GetMsg(0x89,buff,sizeof(buff))<0) {
    PRINTF(L_CC_GBOX,"failed to get CW. GBOX running?");
    return false;
    }
  if(n<17) {
    PRINTF(L_CC_GBOX,"bad CW answer from GBOX");
    return false;
    }
  memcpy(cw,&buff[1],16);
  return true;
}