//////////////////////////////////////////////////////////////////////////
// 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;
}
Exemplo n.º 2
0
void CBDynBuffer::PutString(const char* Val)
{
	if(!Val) PutString("(null)");
	else{
		PutDWORD(strlen(Val)+1);
		PutBytes((BYTE*)Val, strlen(Val)+1);
	}
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 5
0
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;
}