📄 platform_win32.c
字号:
/*****************************************************************************
*
* This program is free software ; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: platform_win32.c 202 2005-01-25 01:27:33Z picard $
*
* BetaPlayer Core
* Copyright (c) 2004 Gabor Kovacs
*
****************************************************************************/
#include "../stdafx.h"
#if defined(_WIN32)
// before including <windows.h> because it can override STDCALL
#include "../platform_c.h"
#ifndef STRICT
#define STRICT
#endif
#include <windows.h>
#if defined(_MSC_VER) && !defined(_WIN32_WCE)
#include <crtdbg.h>
#endif
#if defined(_WIN32_WCE)
#ifndef DISP_CHANGE_SUCCESSFUL
#define DISP_CHANGE_SUCCESSFUL 0
#endif
#ifndef CDS_TEST
#define CDS_TEST 0x00000002
#endif
#ifndef DM_DISPLAYORIENTATION
#define DM_DISPLAYORIENTATION 0x00800000L
#endif
#ifndef DM_DISPLAYQUERYORIENTATION
#define DM_DISPLAYQUERYORIENTATION 0x01000000L
#endif
#ifndef DMDO_0
#define DMDO_0 0
#endif
#ifndef DMDO_90
#define DMDO_90 1
#endif
#ifndef DMDO_180
#define DMDO_180 2
#endif
#ifndef DMDO_270
#define DMDO_270 4
#endif
#define SPI_GETOEMINFO 258
#define SPI_GETPLATFORMTYPE 257
#define CACHE_SYNC_INSTRUCTIONS 2
#define LOCKFLAG_WRITE 1
#define TBL_CACHE 0x08
#define TBL_BUFFER 0x04
static BOOL (WINAPI* FuncVirtualSetAttributes)( LPVOID lpvAddress, DWORD cbSize, DWORD dwNewFlags, DWORD dwMask, LPDWORD lpdwOldFlags ) = NULL;
static BOOL (WINAPI* FuncFreePhysMem)( LPVOID ) = NULL;
static BOOL (WINAPI* FuncLockPages)(LPVOID lpvAddress,DWORD cbSize,PDWORD pPFNs,int fOptions ) = NULL;
static BOOL (WINAPI* FuncUnlockPages)(LPVOID lpvAddress,DWORD cbSize ) = NULL;
static LPVOID (WINAPI* FuncAllocPhysMem)( DWORD cbSize, DWORD fdwProtect, DWORD dwAlignmentMask, DWORD dwFlags, PULONG pPhysicalAddress ) = NULL;
static HANDLE (WINAPI* FuncSetPowerRequirement)(PVOID,int,ULONG,PVOID,ULONG) = NULL;
static DWORD (WINAPI* FuncReleasePowerRequirement)(HANDLE) = NULL;
static BOOL (WINAPI* FuncSHGetDocumentsFolder)(LPCTSTR,LPTSTR) = NULL;
static BOOL (WINAPI* FuncSHGetSpecialFolderPath)(HWND,LPTSTR,int,BOOL) = NULL;
static LONG (WINAPI* FuncChangeDisplaySettingsEx)(LPCTSTR,LPDEVMODE,HWND,DWORD,LPVOID) = NULL;
static void (WINAPI* FuncCacheSync)(DWORD) = NULL;
static BOOL (WINAPI* FuncVirtualCopy)(LPVOID, LPVOID, DWORD, DWORD) = NULL;
static BOOL (WINAPI* FuncCeSetThreadQuantum)(HANDLE, DWORD ) = NULL;
static BOOL (WINAPI* FuncSetKMode)(BOOL) = NULL;
static BOOL (WINAPI* FuncRedrawWindow)(HWND,CONST RECT*,HRGN,UINT) = NULL;
static void (WINAPI* FuncSHIdleTimerReset)() = NULL;
static HMODULE CoreDLL = NULL;
static HMODULE CEShellDLL = NULL;
static HANDLE BacklightEvent = NULL;
#define ACCESS_LOAD 0
#define ACCESS_SAVE 0
#define MAXPHY 16
typedef struct phymem
{
char* Virt;
uint32_t Phy;
uint32_t Length;
uint32_t RefCount;
phymemblock* Blocks;
int BlockCount;
} phymem;
static phymem PhyMem[MAXPHY] = { 0 };
#else
#define ACCESS_LOAD KEY_READ
#define ACCESS_SAVE KEY_READ | KEY_WRITE | KEY_SET_VALUE
#endif
static HMODULE AygShellDLL = NULL;
static tchar_t DocPath[MAXPATH] = T("");
static tchar_t SysPath[MAXPATH] = T("");
static const tchar_t RegBacklight[] = T("ControlPanel\\Backlight");
static const tchar_t RegBatteryTimeout[] = T("BatteryTimeout");
static const tchar_t RegACTimeout[] = T("ACTimeout");
static const tchar_t RegScreenSaver[] = T("ControlPanel\\ScreenSaver");
static const tchar_t RegMode[] = T("Mode");
static const tchar_t RegPower[] = T("ControlPanel\\Power");
static const tchar_t RegDisplay[] = T("Display");
static const tchar_t RegPowerTimouts[] = T("SYSTEM\\CurrentControlSet\\Control\\Power\\Timeouts");
static const tchar_t RegBattUserIdle[] = T("BattUserIdle");
static const tchar_t RegACUserIdle[] = T("ACUserIdle");
static const tchar_t RegBattSystemIdle[] = T("BattSystemIdle");
static const tchar_t RegACSystemIdle[] = T("ACSystemIdle");
static const tchar_t RegBattSuspend[] = T("BattSuspend");
static const tchar_t RegACSuspend[] = T("ACSuspend");
static const tchar_t RegCASIOBacklight[] = T("Drivers\\CASIO\\BackLight");
static const tchar_t RegTimeoutBattery[] = T("TimeoutBattery");
static const tchar_t RegTimeoutExPower[] = T("TimeoutExPower");
#define GETVFRAMEPHYSICAL 6144
#define GETVFRAMELEN 6145
#define DBGDRIVERSTAT 6146
#define SETPOWERMANAGEMENT 6147
#define GETPOWERMANAGEMENT 6148
typedef struct VIDEO_POWER_MANAGEMENT {
ULONG Length;
ULONG DPMSVersion;
ULONG PowerState;
} VIDEO_POWER_MANAGEMENT;
static rgb Palette[256];
static int PageSize = 4096;
static bool_t WaitCursor = 0;
static void* PhyFrameBuffer = NULL;
static stream* Debug = NULL;
#ifndef NDEBUG
static int BlockCount = 0;
#endif
#if defined( MIPS)
int GetTimeFreq()
{
return 1000;
}
int GetTimeTick()
{
SYSTEMTIME t;
GetSystemTime(&t);
return (t.wDay*24+t.wHour)*60*60*1000+(t.wMinute*60+t.wSecond)*1000+t.wMilliseconds;
}
void GetTimeCycle(int* p)
{
SYSTEMTIME i,j;
int n=0;
GetSystemTime(&i);
do
{
++n;
GetSystemTime(&j);
}
while (j.wMilliseconds==i.wMilliseconds);
p[0] = (j.wDay*24+j.wHour)*60*60*1000+(j.wMinute*60+j.wSecond)*1000+j.wMilliseconds;
p[1] = n;
}
#elif defined(_WIN32_WCE)
int GetTimeFreq()
{
return 1000;
}
int GetTimeTick()
{
return GetTickCount();
}
void GetTimeCycle(int* p)
{
int n=1;
int j;
int i = GetTickCount();
while ((j = GetTickCount())==i)
++n;
p[0] = j;
p[1] = n;
}
#else
int GetTimeFreq()
{
return 1000;
}
int GetTimeTick()
{
return timeGetTime();
}
void GetTimeCycle(int* p)
{
int n=1;
int j;
int i = timeGetTime();
while ((j = timeGetTime())==i)
++n;
p[0] = j;
p[1] = n;
}
#endif
void GetProc(void** Module,void* Ptr,const tchar_t* ProcName,int Optional)
{
FARPROC* Func = (FARPROC*)Ptr;
if (*Module)
{
#if !defined(_WIN32_WCE) && defined(UNICODE)
char ProcName8[256];
wcstombs(ProcName8,ProcName,sizeof(ProcName8));
*Func = GetProcAddress(*Module,ProcName8);
#else
*Func = GetProcAddress(*Module,ProcName);
#endif
if (!*Func && !Optional)
{
FreeLibrary(*Module);
*Module = NULL;
}
}
else
*Func = NULL;
}
void Platform_Init()
{
#if defined(_WIN32_WCE)
tchar_t OemUpper[256];
RECT WorkArea;
#endif
char Lang8[16];
tchar_t Lang[16];
SYSTEM_INFO SysInfo;
OSVERSIONINFO Ver;
platform* p = &Platform;
#if defined(_DEBUG) && defined(_MSC_VER) && !defined(_WIN32_WCE)
int Flag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
Flag |= _CRTDBG_LEAK_CHECK_DF;
//Flag |= _CRTDBG_CHECK_ALWAYS_DF;
_CrtSetDbgFlag( Flag );
#endif
NodeFill(&p->VMT,sizeof(platform),(nodeenum)Platform_Enum,(nodeget)Platform_Get,(nodeset)Platform_Set);
Ver.dwOSVersionInfoSize = sizeof(Ver);
GetVersionEx(&Ver);
GetSystemInfo(&SysInfo);
PageSize = SysInfo.dwPageSize;
p->Ver = Ver.dwMajorVersion*100 + Ver.dwMinorVersion;
p->OemInfo[0] = 0;
p->PlatformType[0] = 0;
#if defined(_WIN32_WCE)
AygShellDLL = LoadLibrary(T("aygshell.dll"));
if (AygShellDLL)
*(FARPROC*)&FuncSHIdleTimerReset = GetProcAddress(AygShellDLL,MAKEINTRESOURCE(2006));
CoreDLL = LoadLibrary(T("coredll.dll"));
if (CoreDLL)
{
*(FARPROC*)&FuncChangeDisplaySettingsEx = GetProcAddress(CoreDLL,T("ChangeDisplaySettingsEx"));
*(FARPROC*)&FuncCacheSync = GetProcAddress(CoreDLL,T("CacheSync"));
*(FARPROC*)&FuncVirtualCopy = GetProcAddress(CoreDLL,T("VirtualCopy"));
*(FARPROC*)&FuncCeSetThreadQuantum = GetProcAddress(CoreDLL,T("CeSetThreadQuantum"));
*(FARPROC*)&FuncSetKMode = GetProcAddress(CoreDLL,T("SetKMode"));
*(FARPROC*)&FuncRedrawWindow = GetProcAddress(CoreDLL,T("RedrawWindow"));
*(FARPROC*)&FuncSHGetSpecialFolderPath = GetProcAddress(CoreDLL,T("SHGetSpecialFolderPath"));
*(FARPROC*)&FuncSetPowerRequirement = GetProcAddress(CoreDLL,T("SetPowerRequirement"));
*(FARPROC*)&FuncReleasePowerRequirement = GetProcAddress(CoreDLL,T("ReleasePowerRequirement"));
*(FARPROC*)&FuncVirtualSetAttributes = GetProcAddress(CoreDLL,T("VirtualSetAttributes"));
*(FARPROC*)&FuncFreePhysMem = GetProcAddress(CoreDLL,T("FreePhysMem"));
*(FARPROC*)&FuncAllocPhysMem = GetProcAddress(CoreDLL,T("AllocPhysMem"));
*(FARPROC*)&FuncLockPages = GetProcAddress(CoreDLL,T("LockPages"));
*(FARPROC*)&FuncUnlockPages = GetProcAddress(CoreDLL,T("UnlockPages"));
}
CEShellDLL = LoadLibrary(T("ceshell.dll"));
if (CEShellDLL)
*(FARPROC*)&FuncSHGetDocumentsFolder = GetProcAddress(CEShellDLL,MAKEINTRESOURCE(75));
if (FuncSHGetSpecialFolderPath)
FuncSHGetSpecialFolderPath(NULL,SysPath,0x24/*CSIDL_WINDOWS*/,FALSE);
if (!FuncSHGetDocumentsFolder || !FuncSHGetDocumentsFolder(T("\\"),DocPath))
DocPath[0] = 0;
p->Type = TYPE_WINCE;
if (SystemParametersInfo(SPI_GETPLATFORMTYPE,sizeof(p->PlatformType),p->PlatformType,0)!=0)
{
if (TcsICmp(p->PlatformType,T("PocketPC"))==0)
p->Type = TYPE_POCKETPC;
else
if (TcsICmp(p->PlatformType,T("Smartphone"))==0)
p->Type = TYPE_SMARTPHONE;
}
else
if (GetLastError()==ERROR_ACCESS_DENIED)
{
tcscpy(p->PlatformType,T("Smartphone"));
p->Type = TYPE_SMARTPHONE;
}
else
tcscpy(p->PlatformType,T("Windows CE"));
SystemParametersInfo(SPI_GETOEMINFO,sizeof(p->OemInfo),p->OemInfo,0);
if (!AygShellDLL && p->Ver < 300)
p->Caps |= CAPS_OLDSHELL;
// detect fake navigator bar and use old style menu
if (p->Type != TYPE_SMARTPHONE && AygShellDLL &&
SystemParametersInfo(SPI_GETWORKAREA,0,&WorkArea,0) && WorkArea.top==0)
p->Caps |= CAPS_OLDSHELL;
tcscpy(OemUpper,p->OemInfo);
TcsUpr(OemUpper);
BacklightEvent = CreateEvent(NULL, FALSE, FALSE, T("TIMEOUTDISPLAYOFF"));
#else
p->Type = TYPE_WIN32;
#endif
DetectCPU(p);
p->Model = MODEL_DEFAULT;
#if defined(_WIN32_WCE)
#if defined(ARM)
if (tcsstr(OemUpper,T("TYPHOON")))
p->Model = MODEL_SPV_C500_ORIGROM;
else
if (tcsstr(OemUpper,T("PW10B")) ||
tcsstr(OemUpper,T("PW10A")))
{
p->Model = MODEL_O2_XDA;
p->Caps |= CAPS_ONLY12BITRGB;
}
else
if (tcsstr(OemUpper,T("Compal P6C")))
p->Model = MODEL_AMIGO_600C;
else
if (tcsstr(OemUpper,T("Pocket PC J710")))
p->Model = MODEL_CASIO_E200;
else
if (tcsstr(OemUpper,T("JORNADA")))
{
p->Caps |= CAPS_LANDSCAPE;
if (tcsstr(OemUpper,T("680")))
p->Model = MODEL_JORNADA_680;
else
if (tcsstr(OemUpper,T("690")))
p->Model = MODEL_JORNADA_690;
else
if (tcsstr(OemUpper,T("710")))
p->Model = MODEL_JORNADA_710;
else
if (tcsstr(OemUpper,T("720")))
p->Model = MODEL_JORNADA_720;
}
else
if (tcsstr(OemUpper,T("IPAQ")))
{
p->Caps |= CAPS_PORTRAIT;
if (tcsstr(OemUpper,T("H3600")))
{
p->Model = MODEL_IPAQ_H3600;
p->Caps |= CAPS_ONLY12BITRGB;
}
else
if (tcsstr(OemUpper,T("H3700")))
{
p->Model = MODEL_IPAQ_H3700;
p->Caps |= CAPS_ONLY12BITRGB;
}
else
if (tcsstr(OemUpper,T("H3800")))
p->Model = MODEL_IPAQ_H3800;
else
if (tcsstr(OemUpper,T("H3900")))
p->Model = MODEL_IPAQ_H3900;
else
if (tcsstr(OemUpper,T("HX4700")))
p->Model = MODEL_IPAQ_HX4700;
}
else
if (tcsstr(OemUpper,T("TOSHIBA")))
{
p->Caps |= CAPS_PORTRAIT;
if (tcsstr(OemUpper,T("E740")))
p->Model = MODEL_TOSHIBA_E740;
else
if (tcsstr(OemUpper,T("E750")))
p->Model = MODEL_TOSHIBA_E750;
else
if (tcsstr(OemUpper,T("E80")))
p->Model = MODEL_TOSHIBA_E800;
}
else
if (tcsstr(OemUpper,T("AXIM")))
{
if (tcscmp(OemUpper+tcslen(OemUpper)-2,T("X5"))==0)
p->Model = MODEL_AXIM_X5;
if (tcscmp(OemUpper+tcslen(OemUpper)-3,T("X50"))==0)
p->Model = MODEL_AXIM_X50;
}
else
if (tcsstr(OemUpper,T("LOOX")))
{
if (tcsstr(OemUpper,T("720")))
p->Model = MODEL_LOOX_720;
}
#elif defined(MIPS)
if (tcsstr(OemUpper,T("BSQUARE")))
{
tcscpy(OemUpper,p->PlatformType);
TcsUpr(OemUpper);
if (tcsstr(OemUpper,T("ALCHEMY")))
p->Model = MODEL_BSQUARE_ALCHEMY;
tcscpy(OemUpper,p->OemInfo);
TcsUpr(OemUpper);
}
if (tcsstr(OemUpper,T("POCKET")))
{
if (tcsstr(OemUpper,T(" J74")))
{
p->Model = MODEL_CASIO_BE300;
p->Caps |= CAPS_OLDSHELL;
}
}
if (tcsstr(OemUpper,T("POCKET PC")))
{
p->Caps |= CAPS_PORTRAIT;
if (tcsstr(OemUpper,T(" J67")))
p->Model = MODEL_CASIO_E125;
else
if (tcsstr(OemUpper,T(" J76")))
p->Model = MODEL_CASIO_EM500;
else
if (tcsstr(OemUpper,T(" J58")))
p->Model = MODEL_CASIO_E115;
else
if (tcsstr(OemUpper,T(" J53")) || tcsstr(OemUpper,T(" JX53")))
p->Model = MODEL_CASIO_E105;
}
if (tcsstr(OemUpper,T("JVC")))
{
if (tcsstr(OemUpper,T("C33")))
p->Model = MODEL_JVC_C33;
}
#elif defined(SH3)
if (tcsstr(OemUpper,T("JORNADA")))
{
if (tcsstr(OemUpper,T(" 43")))
{
p->Caps |= CAPS_ONLY12BITRGB;
}
if (tcsstr(OemUpper,T(" 54")))
{
p->Model = MODEL_JORNADA_540;
p->Caps |= CAPS_ONLY12BITRGB | CAPS_PORTRAIT;
}
}
#endif
#endif
if (GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SABBREVLANGNAME,Lang,sizeof(Lang)/sizeof(tchar_t)) >= 2)
{
TcsUpr(Lang);
if (tcscmp(Lang,T("JPN"))==0) tcscpy(Lang,T("JA"));
if (tcscmp(Lang,T("GER"))==0) tcscpy(Lang,T("DE"));
if (tcscmp(Lang,T("SPA"))==0) tcscpy(Lang,T("ES"));
// special three letter cases: Chinese traditional (CHT) and Chinese simplified (CHS)
if (tcscmp(Lang,T("CHS"))==0 || tcscmp(Lang,T("ZHI"))==0 || tcscmp(Lang,T("ZHM"))==0)
StringLang = FOURCC('C','H','S','_');
else
if (tcscmp(Lang,T("CHT"))==0 || tcscmp(Lang,T("ZHH"))==0)
StringLang = FOURCC('C','H','T','_');
else
{
// two letter version
TcsToAscii(Lang8,Lang,sizeof(Lang8));
StringLang = FOURCC(Lang8[0],Lang8[1],'_','_');
}
}
NodeRegister(&p->VMT,PRI_MAXIMUM+650);
BacklightTimeout(0); // restore backlight settings (example if last time crashed)
}
void Platform_Done()
{
NodeUnRegister(&Platform.VMT);
UnlockFrameBuffer();
SetDisplayPower(1,0);
#if defined(_WIN32_WCE)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -