www.pudn.com > WinGOS.rar > WinHAL.cpp


#include "..\gpmp.h" 
#include "WinHal.h" 
#include "SimDisplay.h" 
#include "SimDisplay.h" 
 
#include  
#include  
#include  
 
#undef Sleep 
#undef SwitchToThread 
 
#define GlobalHeapSize (2<<20) 
 
#define PAGE_READWRITE         0x04      
#define MEM_COMMIT           0x1000      
#define MEM_RELEASE          0x8000      
#define PRI_SWITCH 15 //1-15 
#define PRI_NORMAL 0 //0 
 
#define TH(pThread) HANDLE(*PDWORD(pThread->m_pStack)) 
 
static BOOL m_bIdle=FALSE; 
static HANDLE m_evtSwitch; 
 
CHAL* g_pHAL; 
CDesktop* g_pDesktop=NULL; 
HANDLE m_hMouseMsg; 
 
//Win32API函数 
extern "C"{ 
 
VOID __stdcall Sleep(DWORD dwMilliseconds); 
DWORD __stdcall SuspendThread(HANDLE hThread); 
DWORD __stdcall ResumeThread(HANDLE hThread); 
BOOL __stdcall SetThreadPriority(HANDLE hThread,int nPriority); 
BOOL __stdcall SwitchToThread(void); 
PVOID __stdcall VirtualAlloc(PVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect); 
BOOL __stdcall VirtualFree(PVOID lpAddress,SIZE_T dwSize,DWORD dwFreeType); 
DWORD __stdcall WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); 
HANDLE __stdcall CreateEventA(PVOID lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName); 
BOOL __stdcall SetEvent(HANDLE hEvent); 
BOOL __stdcall ResetEvent(HANDLE hEvent); 
BOOL __stdcall CloseHandle(HANDLE hObject); 
BOOL __stdcall TerminateThread(HANDLE hThread,DWORD dwExitCode); 
void __stdcall ExitThread(DWORD dwExitCode); 
HANDLE __stdcall CreateThread(PVOID lpThreadAttributes,SIZE_T dwStackSize,PVOID lpStartAddress,PVOID lpParameter,DWORD dwCreationFlags,PDWORD lpThreadId); 
 
}//extern "C" 
#ifdef _DEBUG 
#undef TRACE 
void TRACE(LPCTSTR pszFormat,...) 
{ 
	TCHAR szTrace[1024]; 
	va_list args; 
 
	va_start(args,pszFormat); 
	vsprintf(szTrace,pszFormat,args); 
	_CrtDbgReport(0, NULL, 0, NULL, szTrace); 
	va_end(args); 
} 
#endif 
 
//#define TRACE(x) 
 
extern "C" LRESULT HalMain(UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	/* 
	CKernel kernel; 
	CHAL hal; 
	g_pKernel=&kernel; 
	g_pHAL=&hal; 
 
	初始化关键的中断或设备寄存器; 
	初始化全局堆栈 
	初始化驱动 
	g_pKernel->Run(); 
	... 
	*/ 
	switch(message) 
	{ 
	case halCreate:{ 
		HANDLE hThread=::CreateThread(NULL,0,CHAL::RunGOS,0,CreateSuspend,NULL); 
		TRACE("创建GOS内核线程0x%08x\r\n",hThread); 
		m_evtSwitch=hThread; 
		::ResumeThread(hThread); 
		}break; 
	case halMouseEvent: 
		switch(wParam) 
		{ 
		case 0x200: message=WM_MOUSEMOVE;break; 
		case 0x201: message=WM_LBUTTONDOWN;break; 
		case 0x202: message=WM_LBUTTONUP;break; 
		} 
		g_pDesktop->PulseMessageEvent(m_hMouseMsg,message,lParam); 
		break; 
	case halSetWallpaper:{ 
		g_pDesktop->SetWallpaper(PBITMAPFILEHEADER(wParam)); 
		}break; 
	} 
	return 0; 
} 
 
DWORD CHAL::RunGOS(PVOID pParam) 
{ 
	CKernel kernel; 
	CHAL hal; 
	CSimDisplay sd; 
	CPMPDesktop scr; 
 
	g_pKernel=&kernel; 
	g_pHAL=&hal; 
	g_pDesktop=&scr; 
 
	PDWORD pGlobalHeapStack=(PDWORD)::VirtualAlloc(0,GlobalHeapSize,MEM_COMMIT,PAGE_READWRITE); 
	*pGlobalHeapStack=GlobalHeapSize-4; 
	g_pKernel->CreateThread(pGlobalHeapStack+1); 
	*PDWORD(kernel.m_pStack)=DWORD(m_evtSwitch); 
	 
	m_evtSwitch=::CreateEventA(NULL,FALSE,FALSE,NULL); 
	HANDLE hThread=::CreateThread(NULL,0,SimSWI,0,CreateSuspend,NULL); 
	::SetThreadPriority(hThread,PRI_SWITCH); 
	::ResumeThread(hThread); 
 
	scr.Create(g_pKernel,&sd,NULL,NULL); 
	m_hMouseMsg=scr.SetMessageEvent(PriorityHighest); 
	RunThread(g_pKernel); 
 
	::CloseHandle(m_evtSwitch); 
	::VirtualFree(pGlobalHeapStack,0,MEM_RELEASE); 
	return 0; 
} 
 
DWORD CHAL::RunThread(PVOID pParam) 
{ 
	PTHREAD pThread=PTHREAD(pParam); 
	PDWORD pSP=PDWORD(pThread->m_pStack)-1; 
	pParam=PVOID(*pSP); 
	__asm 
	{ 
		mov eax,pSP; 
		mov pSP,esp; 
		mov esp,eax; 
	} 
	pParam=(PVOID)pThread->Run(pParam); 
	__asm 
	{ 
		mov esp,pSP; 
	} 
	return DWORD(pParam); 
} 
 
DWORD CHAL::SimSWI(PVOID pParam) 
{ 
	LONG nTime; 
	for(;;) 
	{ 
		if(m_bIdle) 
		{ 
			//TRACE("HAL挂起线程0x%08x(0x%04x)\r\n",GetCurrentThread(),TH(GetCurrentThread())); 
			SuspendThread(TH(GetCurrentThread())); 
		} 
		nTime=LONG(g_pKernel->GetSwitchTime()-GetTickCount()); 
		while(nTime>0) 
		{ 
			::WaitForSingleObject(m_evtSwitch,nTime); 
			nTime=g_pKernel->IsLockSwitch()?ThreadSwitchInterval:0; 
		} 
		if(m_bIdle) 
		{ 
			::ResumeThread(TH(GetCurrentThread())); 
		} 
		g_pKernel->SwitchThread(); 
	} 
	return 0; 
} 
 
void CHAL::CreateThread(CThread* pThread,PVOID pParam) 
{ 
	/* 
	sp=pThread->m_pStack; 
	将所有寄存器入栈 
	*/ 
	HANDLE hThread=::CreateThread(NULL,0,RunThread,pThread,CreateSuspend,NULL); 
	::SetThreadPriority(hThread,PRI_NORMAL); 
	*PDWORD(pThread->m_pStack)=DWORD(hThread); 
	*(PDWORD(pThread->m_pStack)-1)=DWORD(pParam); 
	TRACE("HAL创建线程0x%08x(0x%04x)\r\n",pThread,TH(pThread)); 
} 
 
void CHAL::ExitThread(CThread* pThread) 
{ 
	TRACE("HAL终止线程0x%08x(0x%04x)\r\n",pThread,TH(pThread)); 
	::TerminateThread(TH(pThread),pThread->GetLastError()); 
} 
 
BOOL CHAL::SwitchThread(void) 
{ 
	/* 
	激活软中断,以调用切换函数 
	*/ 
 
	::SetEvent(m_evtSwitch); 
#if PRI_SWITCH-PRI_NORMAL<3 
	::SwitchToThread(); 
#endif 
	return TRUE; 
} 
 
void CHAL::SwitchThread(CThread* pFromThread,CThread* pToThread) 
{ 
	/* 
	将所有寄存器入栈 
	pFromThread->m_pStack=sp; 
	sp=pToThread; 
	将所在寄存器出栈 
	*/ 
	//TRACE("HAL切换线程0x%08x(0x%04x) -> 0x%08x(0x%04x)\r\n",pFromThread,TH(pFromThread),pToThread,TH(pToThread)); 
	::SuspendThread(TH(pFromThread)); 
	::ResumeThread(TH(pToThread)); 
} 
 
void CHAL::OnSwitchThread(BOOL bIdle) 
{ 
	/*计算下个换醒时间,配置唤醒定时器 
	if(bIdle) 
	{ 
		调用系统休眠函数,系统休眠 
		... 
		调用系统唤醒函数 
	} 
	//最后,定时器引发软中断,将调用g_pKernel->SwitchThread() 
	*/ 
	m_bIdle=bIdle; 
} 
 
LRESULT CHAL::MsgProc(UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	return CMsgObject::MsgProc(message,wParam,lParam); 
}