////////////////////////////////////////////////////////////////////////// // generic pointer HRESULT CBPersistMgr::Transfer(char* Name, void* Val) { int ClassID=-1, InstanceID=-1; if(m_Saving) { CSysClassRegistry::GetInstance()->GetPointerID(*(void**)Val, &ClassID, &InstanceID); if(*(void**)Val!= NULL && (ClassID==-1 || InstanceID==-1)) { Game->LOG(0, "Warning: invalid instance '%s'", Name); } PutDWORD(ClassID); PutDWORD(InstanceID); } else { ClassID = GetDWORD(); InstanceID = GetDWORD(); *(void**)Val = CSysClassRegistry::GetInstance()->IDToPointer(ClassID, InstanceID); } return S_OK; }
void CBDynBuffer::PutString(const char* Val) { if(!Val) PutString("(null)"); else{ PutDWORD(strlen(Val)+1); PutBytes((BYTE*)Val, strlen(Val)+1); } }
void ScanPCI() { // формат адресного регистра: // ---- ---- BBBB BBBB DDDD DFFF RRRR RR00 // B - bus, D - device, F - function, R - register PutString("# PCI Device List:\n"); for (unsigned int addr=0; addr<0x01000000; addr+=256) { unsigned int id = ReadPCI(addr); if ((id & 0xFFFF) != 0xFFFF) { unsigned int sub = ReadPCI(addr+0x2C); PutString("Addr="); PutDWORD(addr); PutString(" Vendor="); PutWORD(id & 0xFFFF); PutString(" ID="); PutWORD((id >> 16) & 0xFFFF); //PutString(" SubVendor="); //PutWORD(sub & 0xFFFF); //PutString(" SubID="); //PutWORD((sub >> 16) & 0xFFFF); /*PutString("\nBAR="); for (int i=0; i<6; i++) { WritePCI(addr+0x10+i*4, 0xFFFFFFFF); PutDWORD(ReadPCI(addr+0x10+i*4)); PutString(" "); }*/ unsigned int cls = ReadPCI(addr+0x08); unsigned int baseClass = (cls >> 24) & 0xFF; unsigned int subClass = (cls >> 16) & 0xFF; unsigned int iface = (cls >> 8) & 0xFF; for (int i=0; i<sizeof(classes)/sizeof(PciDevClass); i++) { if (classes[i].baseClass == baseClass && classes[i].subClass == subClass && classes[i].iface == 0xFF) { PutString(" "); PutString(classes[i].name); break; } } //PutBYTE(baseClass); //PutBYTE(subClass); //PutBYTE(iface); PutString("\n"); } }
HRESULT CBPersistMgr::InitSave(char* Desc) { if(!Desc) return E_FAIL; HRESULT res; Cleanup(); m_Saving = true; m_Buffer = (BYTE*)malloc(SAVE_BUFFER_INIT_SIZE); if(m_Buffer) { m_BufferSize = SAVE_BUFFER_INIT_SIZE; res = S_OK; } else res = E_FAIL; if(SUCCEEDED(res)) { // get thumbnails if(!Game->m_CachedThumbnail) { Game->m_CachedThumbnail = new CBSaveThumbHelper(Game); if(FAILED(Game->m_CachedThumbnail->StoreThumbnail(true))) { SAFE_DELETE(Game->m_CachedThumbnail); } } // rich saved game stuff if(Game->m_RichSavedGames) FillRichBuffer(Desc); DWORD magic = DCGF_MAGIC; PutDWORD(magic); magic = SAVE_MAGIC_2; PutDWORD(magic); BYTE VerMajor, VerMinor, ExtMajor, ExtMinor; Game->GetVersion(&VerMajor, &VerMinor, &ExtMajor, &ExtMinor); DWORD Version = MAKELONG(MAKEWORD(VerMajor, VerMinor), MAKEWORD(ExtMajor, ExtMinor)); PutDWORD(Version); // new in ver 2 PutDWORD((DWORD)DCGF_VER_BUILD); PutString(Game->m_Name); // thumbnail data size bool ThumbnailOK = false; if(Game->m_CachedThumbnail) { if(Game->m_CachedThumbnail->m_Thumbnail) { DWORD Size = 0; BYTE* Buffer = Game->m_CachedThumbnail->m_Thumbnail->CreateBMPBuffer(&Size); PutDWORD(Size); if(Size>0) PutBytes(Buffer, Size); delete [] Buffer; ThumbnailOK = true; } } if(!ThumbnailOK) PutDWORD(0); // in any case, destroy the cached thumbnail once used SAFE_DELETE(Game->m_CachedThumbnail); DWORD DataOffset = m_Offset + sizeof(DWORD) + // data offset sizeof(DWORD) + strlen(Desc) + 1 + // description sizeof(DWORD); // timestamp PutDWORD(DataOffset); PutString(Desc); time_t Timestamp; time(&Timestamp); PutDWORD((DWORD)Timestamp); } return res; }
BOOL CMenuOrder::WriteMenuOrder(LPCSTR sFolderPath) { //sort dir and files by string if(len<=0) return FALSE; try { index = new int[len]; } catch(...) { // if(e!=NULL)e->Delete(); return FALSE; } int i, j; index[0]=0; for(i = 1; i<len; i++) { for(j=i-1; j>=0; j--) { if(lstrcmpiA(mois[i].longname, mois[index[j]].longname)<0) { index[j+1]=index[j]; if(j==0) index[j]=i; } else { index[j+1]=i; break; } } } cbsize = 12; reserved = 1; for(i =0; i<len; i++) { //calculate length if(mois[i].longname!=NULL && mois[i].shortname!=NULL) mois[i].cbsize = strlen(mois[i].longname)+1 + strlen(mois[i].shortname)+1; mois[i].cbsize += 22+6; cbsize += mois[i].cbsize; } HKEY hKey; BOOL ret = FALSE; lpSubKey = MENU_ORDER_KEY; lpSubKey += sFolderPath; HRESULT hr = RegCreateKeyEx(HKEY_CURRENT_USER, lpSubKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); int slen; if(hr == ERROR_SUCCESS) { LPBYTE lpbuf; try { lpbuf = new BYTE[cbsize + 8]; } catch(...) { // if(e!=NULL)e->Delete(); lpbuf = NULL; } if(lpbuf!=NULL) { LPBYTE lpt = lpbuf; PutDWORD(0x08, lpt); PutDWORD(0x02, lpt); PutDWORD(cbsize, lpt); PutDWORD(reserved, lpt); PutDWORD(len, lpt); for(j=0; j<len; j++) { i = index[j]; if(mois[i].itemtype != 0x31) continue; PutDWORD(mois[i].cbsize, lpt); PutDWORD(mois[i].order, lpt); slen = 0; if(mois[i].longname!=NULL) slen = strlen(mois[i].longname); if(mois[i].shortname!=NULL) slen += strlen(mois[i].shortname); PutWORD(slen+1+1+14, lpt); PutWORD(mois[i].itemtype, lpt); PutDWORD(mois[i].filesize, lpt); PutWORD(mois[i].filedate, lpt); PutWORD(mois[i].filetime, lpt); PutWORD(mois[i].filetype, lpt); PutString(mois[i].longname, lpt); PutString(mois[i].shortname, lpt); PutWORD((WORD)0, lpt); // end with two 0 PutDWORD((DWORD)0, lpt); //item end } for(j=0; j<len; j++) { i = index[j]; if(mois[i].itemtype != 0x32) continue; PutDWORD(mois[i].cbsize, lpt); PutDWORD(mois[i].order, lpt); slen = 0; if(mois[i].longname!=NULL) slen = strlen(mois[i].longname); if(mois[i].shortname!=NULL) slen += strlen(mois[i].shortname); PutWORD(slen+1+1+14, lpt); PutWORD(mois[i].itemtype, lpt); PutDWORD(mois[i].filesize, lpt); PutWORD(mois[i].filedate, lpt); PutWORD(mois[i].filetime, lpt); PutWORD(mois[i].filetype, lpt); PutString(mois[i].longname, lpt); PutString(mois[i].shortname, lpt); PutWORD((WORD)0, lpt); // end with two 0 PutDWORD((DWORD)0, lpt); //item end } //save RegSetValueEx(hKey, "Order", 0, REG_BINARY, lpbuf, cbsize+8); //release delete[] lpbuf; ret = TRUE; } } RegCloseKey(hKey); return ret; }