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 + -
显示快捷键?