platform_win32.c

来自「betaplayer_0.096源码 tcpmp老版本」· C语言 代码 · 共 2,601 行 · 第 1/5 页

C
2,601
字号
			CloseHandle(Handle);
		}

		// support for sample Power Manager implementation 
		// maybe if they use the sample code, there might be bugs with SystemIdleTimerReset()...

		if (ChangeRegEntry(0,RegPowerTimouts,RegACUserIdle,Disable,0,PLATFORM_ACUSERIDLE))
		{
			ChangeRegEntry(0,RegPowerTimouts,RegBattUserIdle,Disable,0,PLATFORM_BATTUSERIDLE);
			ChangeRegEntry(0,RegPowerTimouts,RegACSystemIdle,Disable,0,PLATFORM_ACSYSTEMIDLE);
			ChangeRegEntry(0,RegPowerTimouts,RegBattSystemIdle,Disable,0,PLATFORM_BATTSYSTEMIDLE);
			ChangeRegEntry(0,RegPowerTimouts,RegACSuspend,Disable,0,PLATFORM_ACSUSPEND);
			ChangeRegEntry(0,RegPowerTimouts,RegBattSuspend,Disable,0,PLATFORM_BATTSUSPEND);

			Handle = CreateEvent( NULL, FALSE, FALSE, T("PowerManager/ReloadActivityTimeouts") );
			if (Handle) 
			{
				SetEvent(Handle);
				CloseHandle(Handle);
			}
		}

#if defined(_WIN32_WCE)

		if (FuncSetPowerRequirement && FuncReleasePowerRequirement)
		{
			static HANDLE PowerHandle = NULL;
			if (Disable && !PowerHandle)
			{
				PowerHandle = FuncSetPowerRequirement(T("BKL1:"),0,1,NULL,0);
			}
			else if (!Disable && PowerHandle)
			{
				FuncReleasePowerRequirement(PowerHandle);
				PowerHandle = NULL;
			}
		}
#endif
	}
}

void* LockFrameBuffer( video* p )
{
	void* Ptr = NULL;

	memset(p,0,sizeof(video));

	//set default values (for most of the models)
	p->Width = 240;
	p->Height = 320;
	p->Pitch = 480;
	p->Aspect = ASPECT_ONE;
	p->Direction = 0;

	if (QueryPlatform(PLATFORM_CAPS) & CAPS_ONLY12BITRGB)
		DefaultRGB(&p->Pixel,16,4,4,4,1,2,1);
	else
		DefaultRGB(&p->Pixel,16,5,6,5,0,0,0);

	switch (QueryPlatform(PLATFORM_MODEL))
	{
	case MODEL_BSQUARE_ALCHEMY:
		Ptr = PhyFrameBuffer = PhyMemBegin(0x15000000,320*480,1);
		p->Width = 240;
		p->Height = 320;
		p->Pitch = 480;
		break;

	case MODEL_IPAQ_H3600:
	case MODEL_IPAQ_H3700:
		p->Direction = DIR_SWAPXY | DIR_MIRRORLEFTRIGHT;
		Ptr = (void*)0xAC050020;
		p->Width = 320;
		p->Height = 240;
		p->Pitch = 640;
		break;

	case MODEL_IPAQ_H3800:
		p->Direction = DIR_SWAPXY | DIR_MIRRORUPDOWN;
		Ptr = (void*)0xAC050020;
		p->Width = 320;
		p->Height = 240;
		p->Pitch = 640;
		break;

	case MODEL_CASIO_BE300:
	case MODEL_CASIO_E105:
	case MODEL_CASIO_E115:
		Ptr = (void*)0xAA200000;
		p->Pitch = 512;
		break;

	case MODEL_JORNADA_710:
	case MODEL_JORNADA_720:
		Ptr = PhyFrameBuffer = PhyMemBegin(0x48200000,240*1280,1);
		p->Width = 640;
		p->Height = 240;
		p->Pitch = 1280;
		break;

	case MODEL_JORNADA_680:
	case MODEL_JORNADA_690: 
		Ptr = (void*)0xB2000000; //only japan???
		p->Width = 640;
		p->Height = 240;
		p->Pitch = 1280;
		break;

	case MODEL_MOBILEGEAR2_550:
	case MODEL_MOBILEGEAR2_450:
	case MODEL_MOBILEGEAR2_530:
	case MODEL_MOBILEGEAR2_430:
	case MODEL_MOBILEPRO_780:
		Ptr = (void*)0xAA180100;
		p->Width = 640;
		p->Height = 240;
		p->Pitch = 1280;
		break;

	case MODEL_MOBILEPRO_770:
		Ptr = (void*)0xAA000000;
		p->Width = 640;
		p->Height = 240;
		p->Pitch = 1600;
		break;

	case MODEL_JVC_C33:
		Ptr = (void*)0x445C0000;
		p->Width = 1024;
		p->Height = 600;
		p->Pitch = 2048;
		break;

	case MODEL_SIGMARION:
		Ptr = (void*)0xAA000000;
		p->Width = 640;
		p->Height = 240;
		p->Pitch = 1280;
		break;

	case MODEL_SIGMARION2:
		Ptr = (void*)0xB0800000;
		p->Width = 640;
		p->Height = 240;
		p->Pitch = 1280;
		break;

	case MODEL_SIGMARION3:
		Ptr = PhyFrameBuffer = PhyMemBegin(0x14800000,480*1600,1);
		p->Width = 800;
		p->Height = 480;
		p->Pitch = 1600;
		break;

	case MODEL_INTERMEC_6651:
		Ptr = PhyFrameBuffer = PhyMemBegin(0x6C000000,480*1600,1);
		p->Width = 800;
		p->Height = 480;
		p->Pitch = 1600;
		break;
	}

	if (((int)Ptr & 15)==0 && (p->Pitch & 15)==0)
		p->Pixel.Flags |= PF_16ALIGNED;
	return Ptr;
}

void UnlockFrameBuffer()
{
	if (PhyFrameBuffer)
	{
		PhyMemEnd(PhyFrameBuffer);
		PhyFrameBuffer = NULL;
	}
}

void* CodeAlloc(int Size)
{
	void* p;
	int h = 1;
	do 
	{
		p = VirtualAlloc(NULL,Size,MEM_COMMIT,PAGE_EXECUTE_READ);
	}
	while (!p && Size && NodeHibernate(h--));
	return p;
}

void CodeFree(void* Code,int Size)
{
	VirtualFree(Code,Size,MEM_DECOMMIT);
	VirtualFree(Code,0,MEM_RELEASE);
}

void CodeLock(void* Code,int Size)
{
	DWORD Protect;
	VirtualProtect(Code,Size,PAGE_READWRITE|PAGE_NOCACHE,&Protect);
}

void CodeUnlock(void* Code,int Size)
{
	DWORD Protect;
	VirtualProtect(Code,Size,PAGE_EXECUTE_READ,&Protect);
#if defined(_WIN32_WCE)
	if (FuncCacheSync)
		FuncCacheSync(CACHE_SYNC_INSTRUCTIONS);
#endif
}

void CodeFindPages(void* Ptr,uint8_t** Min,uint8_t** Max,int* PageSize)
{
#if defined(MIPS)
	*PageSize = 1024;
#else
	*PageSize = 4096;
#endif

	*Min = *Max = (uint8_t*) ((int)Ptr & ~(*PageSize-1));
	while (!IsBadCodePtr((FARPROC)(*Min-*PageSize)))
		*Min -= *PageSize;
	while (!IsBadCodePtr((FARPROC)*Max))
		*Max += *PageSize;
}

void Assert(const char* Exp,const char* File,int Line)
{
	TCHAR TExp[MAXPATH];
	TCHAR TFile[MAXPATH];
	StrToTcs(TExp,File,MAXPATH);
	stprintf(TFile,T("%d:%s"),Line,TExp);
	StrToTcs(TExp,Exp,MAXPATH);
#ifndef NDEBUG
	DebugBreak();
#endif
	MessageBox(NULL,TExp,TFile,MB_OK);
}

void* LockCreate()
{
	void* p = Alloc(sizeof(CRITICAL_SECTION));
	InitializeCriticalSection((LPCRITICAL_SECTION)p);
	return p;
}

void LockDelete(void* p)
{
	if (p)
	{
		DeleteCriticalSection((LPCRITICAL_SECTION)p);
		Free(p);
	}
}

void LockEnter(void* p)
{
	EnterCriticalSection((LPCRITICAL_SECTION)p);
}

void LockLeave(void* p)
{
	LeaveCriticalSection((LPCRITICAL_SECTION)p);
}

void ThreadPriority(void* Thread,int Priority)
{
	SetThreadPriority(Thread,THREAD_PRIORITY_NORMAL + Priority);
}

void* ThreadCreate(int(*Start)(void*),void* Parameter,int Quantum)
{
	DWORD Id;
	HANDLE Handle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Start,Parameter,0,&Id);

#if defined(_WIN32_WCE)
	if (FuncCeSetThreadQuantum)
		FuncCeSetThreadQuantum(Handle,Quantum);
#endif
	return Handle;
}

void CheckHeap()
{
#if defined(_DEBUG) && defined(_MSC_VER)
	assert(_CrtCheckMemory());
#endif
}

//#define FIND 0x009F15A0

int AvailMemory()
{
	MEMORYSTATUS Status;
	Status.dwLength = sizeof(Status);

	GlobalMemoryStatus(&Status); 

	return Status.dwAvailPhys;
}

void FreeBlock(void* p)
{
	if (p)
	{
#ifndef NDEBUG
		if (VirtualFree(p,0,MEM_RELEASE))
			--BlockCount;
#else
		VirtualFree(p,0,MEM_RELEASE);
#endif
	}
}

void* AllocBlock(int n,bool_t Optional)
{
	void* p;
	int h = 1;

	if (Optional && AvailMemory() < 256*1024+n) // we want to avoid OS low memory warning
		return NULL;

	do
	{
		p = VirtualAlloc(NULL,n,MEM_COMMIT,PAGE_READWRITE);
	}
	while (!p && !Optional && n && NodeHibernate(h--));

#ifndef NDEBUG
	if (p) ++BlockCount;
#endif

	return p;
}

void* Alloc(int n)
{
	void* p;
	int h = 1;
	do
	{
		p = malloc(n);
	}
	while (!p && n && NodeHibernate(h--));

	//DEBUG_MSG1(-1,T("Alloc %d"),n);

#ifdef FIND
	if ((int)p == FIND) DebugBreak();
#endif

	return p;
}

void* CAlloc(int n,int m)
{
	void* p;
	int h = 1;
	n *= m;

	do
	{
		p = malloc(n);
	}
	while (!p && n && NodeHibernate(h--));
	
	if (p)
		memset(p,0,n);

#ifdef FIND
	if ((int)p == FIND) DebugBreak();
#endif

	return p;
}

void* ReAlloc(void* p,int n)
{
	int h = 1;
	do
	{
		p = realloc(p,n);
	}
	while (!p && n && NodeHibernate(h--));

#ifdef FIND
	if ((int)p == FIND) DebugBreak();
#endif

	return p;
}

void Free(void* p)
{
	free(p);
}

void ShowMessage(const tchar_t* Title,const tchar_t* Msg,...)
{
	bool_t Wait = WaitCursor;
	tchar_t s[1024];
	vstprintf( s, Msg, (VA_LIST)(&Msg+1) );
	if (Wait) WaitEnd();
	MessageBox(NULL,s,Title,MB_OK|MB_SETFOREGROUND);
	if (Wait) WaitBegin();
}

void DebugTime(const tchar_t* Name)
{
	SYSTEMTIME t;
	GetSystemTime(&t);
	DebugMessage(T("%02d:%02d:%02d.%03d %s"),t.wHour,t.wMinute,t.wSecond,t.wMilliseconds,Name);
}

//#if !defined(_WIN32_WCE)
static file Debug = NULL;
//#endif

void DebugMessage(const tchar_t* Msg,...)
{
	tchar_t s[1024];

#ifndef NDEBUG
	if (!Debug)	
		Debug = FileOpen(T("\\debug.txt"),1);
#else
	if (!Debug)
	{
		stprintf(s,T("%s\\log.txt"),DocPath);
		Debug = FileOpen(s,1);
	}
#endif

	s[0]=0;
#ifndef NDEBUG
//	stprintf(s,T("%04x "),(int)GetCurrentThreadId());
#endif
	vstprintf( s+tcslen(s), Msg, (VA_LIST)(&Msg+1) );
	tcscat(s,T("\n"));

#ifndef NDEBUG
	OutputDebugString(s);
#endif
	FilePrintf(Debug,T("%s"),s);
}

typedef struct contextreg
{
	int Ofs;
	const tchar_t* Name;
} contextreg;

#if defined( _M_IX86 )
static contextreg Reg[] = 
{
	OFS(CONTEXT,Eax), T("eax"),
	OFS(CONTEXT,Ebx), T("ebx"),
	OFS(CONTEXT,Ecx), T("ecx"),
	OFS(CONTEXT,Edx), T("edx"),
	OFS(CONTEXT,Esi), T("esi"),
	OFS(CONTEXT,Edi), T("edi"),
	OFS(CONTEXT,Ebp), T("ebp"),
	OFS(CONTEXT,Esp), T("esp"),
	OFS(CONTEXT,Eip), T("eip"),
	OFS(CONTEXT,EFlags), T("flags"),

	OFS(CONTEXT,Esp), NULL, 
};
#elif defined( MIPS )
static contextreg Reg[] = 
{
	OFS(CONTEXT,IntZero), T("Zero"),
	OFS(CONTEXT,IntAt), T("At"),
	OFS(CONTEXT,IntV0), T("V0"),
	OFS(CONTEXT,IntV1), T("V1"),
	OFS(CONTEXT,IntA0), T("A0"),
	OFS(CONTEXT,IntA1), T("A1"),
	OFS(CONTEXT,IntA2), T("A2"),
	OFS(CONTEXT,IntA3), T("A3"),
	OFS(CONTEXT,IntT0), T("T0"),
	OFS(CONTEXT,IntT1), T("T1"),
	OFS(CONTEXT,IntT2), T("T2"),
	OFS(CONTEXT,IntT3), T("T3"),
	OFS(CONTEXT,IntT4), T("T4"),
	OFS(CONTEXT,IntT5), T("T5"),
	OFS(CONTEXT,IntT6), T("T6"),
	OFS(CONTEXT,IntT7), T("T7"),
	OFS(CONTEXT,IntS0), T("S0"),
	OFS(CONTEXT,IntS1), T("S1"),
	OFS(CONTEXT,IntS2), T("S2"),
	OFS(CONTEXT,IntS3), T("S3"),
	OFS(CONTEXT,IntS4), T("S4"),
	OFS(CONTEXT,IntS5), T("S5"),
	OFS(CONTEXT,IntS6), T("S6"),
	OFS(CONTEXT,IntS7), T("S7"),
	OFS(CONTEXT,IntT8), T("T8"),
	OFS(CONTEXT,IntT9), T("T9"),
	OFS(CONTEXT,IntK0), T("K0"),
	OFS(CONTEXT,IntK1), T("K1"),
	OFS(CONTEXT,IntGp), T("Gp"),
	OFS(CONTEXT,IntSp), T("Sp"),
	OFS(CONTEXT,IntS8), T("S8"),
	OFS(CONTEXT,IntRa), T("Ra"),
	OFS(CONTEXT,IntLo), T("Lo"),
	OFS(CONTEXT,IntHi), T("Hi"),
	OFS(CONTEXT,IntSp), NULL,
};
#elif defined( ARM )
static contextreg Reg[] = 
{
	OFS(CONTEXT,R0), T("R0"),
	OFS(CONTEXT,R1), T("R1"),
	OFS(CONTEXT,R2), T("R2"),
	OFS(CONTEXT,R3), T("R3"),
	OFS(CONTEXT,R4), T("R4"),
	OFS(CONTEXT,R5), T("R5"),
	OFS(CONTEXT,R6), T("R6"),
	OFS(CONTEXT,R7), T("R7"),
	OFS(CONTEXT,R8), T("R8"),
	OFS(CONTEXT,R9), T("R9"),
	OFS(CONTEXT,R10),T("R10"),
	OFS(CONTEXT,R11),T("R11"),

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?