📄 primary_thread.c
字号:
CurrentRunningThreadHandle = INVALID_HANDLE_VALUE;
/* 妱崬傒傪奐偗傞 */
ena_int(0);
}
break;
}
/*
*乽妱傝崬傒傪敪惗偝偣偰偔偩偝偄乿儊僢僙乕僕
* lParam : 妱崬傒斣崋 (>0)
*/
case HALMSG_INTERRUPT:
{
HANDLE work;
DWORD count;
if(lParam != 0)
ras_int((unsigned int)lParam);
/* 尰嵼幚峴偟偰偄傞僗儗僢僪傪掆巭 */
wait_for_thread_suspension_completion(CurrentRunningThreadHandle);
/* 妱崬傒僗儗僢僪惗惉 and 僨傿僗僷僢僠 */
if((work = sch_int()) != INVALID_HANDLE_VALUE)
{
if(runtsk != 0 && runtsk->tskctxb.ThreadHandle == CurrentRunningThreadHandle)
vget_ims(&runtsk->tskctxb.InterruptLevel);
CurrentRunningThreadHandle = work;
}
if(CurrentRunningThreadHandle != 0)
do { count = ResumeThread(CurrentRunningThreadHandle); } while(count > 1);
break;
}
/*
*乽娗棟僗儗僢僪偺尃尷偱傕偭偰娭悢傪幚峴偟偰偔偩偝偄乿儊僢僙乕僕
* lParam : 僷儔儊乕僞傪奿擺偡傞峔憿懱傊偺億僀儞僞
* 僷儔儊乕僞峔憿懱撪栿
* func : 幚峴偟偨偄娭悢
* param : 僷儔儊乕僞偲偟偰搉偡壗偱傕傾儕("void *")側抣
*
* 拲) 僞僗僋偱僂傿儞僪僂偲偐傪嶌傞偲丄僞僗僋攋婞偱僂傿儞僪僂偑徚偊偰偟傑偆傛
*/
case HALMSG_EXECUTEPROCEDURE:
{
void ** work = (void **)lParam;
((void (*)(void *))(*work))(*(work+1));
break;
}
/*
*乽嵟屻偺嵟屻偵偙偺張棟傪摦偐偟偰偔偩偝偄(onExit僴儞僪儔)乿儊僢僙乕僕
* lParam : 娭悢幚峴儊僢僙乕僕偲偄偭偟傚 ( func,param傊偺億僀儞僞 )
*/
case HALMSG_ADDDESTRUCTIONPROCEDURE:
{
struct tagDestructionProcedureQueue * scope;
void ** work = (void **)lParam;
scope = DestructionProcedureQueue;
if((DestructionProcedureQueue = GlobalAlloc(GMEM_FIXED, sizeof(struct tagDestructionProcedureQueue))) != NULL)
{
DestructionProcedureQueue->DestructionProcedure = *(work);
DestructionProcedureQueue->Parameter = *(work+1);
DestructionProcedureQueue->Next = scope;
}else
FatalAssertion(TRUE, "GlobalAlloc could not acquire a memory block at " __FILE__);
break;
}
/*
*乽僾儘僌儔儉傪巭傔偰偔偩偝偄乿儊僢僙乕僕
*/
case HALMSG_QUITREQUEST:
{
struct tagDestructionProcedureQueue * destqueue;
void * destarea;
dis_int(0); // 妱崬傒庴晅傕偙偺僗儗僢僪偑傗傞偺偱丄暿偵嬛巭偟側偔偰傕戝忎晇
// WorkerThreadHandle = CreateThread(NULL, 0, ForceShutdownHandler, 0, NULL, NULL);
hw_timer_terminate();
if(CurrentRunningThreadHandle != NULL)
wait_for_thread_suspension_completion(CurrentRunningThreadHandle);
destqueue = DestructionProcedureQueue;
while(destqueue != NULL)
{
(*destqueue->DestructionProcedure)(destqueue->Parameter);
destarea = destqueue;
destqueue = destqueue->Next;
GlobalFree((HGLOBAL)destarea);
}
DestroyWindow(PrimaryDialogHandle);
break;
}
default:
return FALSE;
}
return TRUE;
}
/*
* 僇乕僱儖僔儈儏儗乕僞偺拞妀偲側傞僗儗僢僪偺儊僢僙乕僕僴儞僪儔
*/
LRESULT CALLBACK PrimaryDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam)
{
switch(Msg)
{
/* 僞僗僋僩儗僀傾僀僐儞偱塃僋儕僢僋 */
case HALMSG_MESSAGE+1:
if(lParam == WM_RBUTTONUP)
kernel_exit();
break;
/* 僇乕僱儖儊僢僙乕僕 */
case HALMSG_MESSAGE:
return HALMessageHandler(wParam,lParam);
/* 僨僶僢僌梡僟僀傾儘僌忋偺傾僀僥儉偺儊僢僙乕僕 */
case WM_COMMAND:
return PrimaryDialogCommandHandler(wParam,lParam);
/* 僟僀傾儘僌惗惉(儊僢僙乕僕僴儞僪儕儞僌梡) */
case WM_INITDIALOG:
{
DWORD ThreadID;
NOTIFYICONDATA nid;
PrimaryDialogHandle = hDlg; //堦帪揑
/* 僞僗僋僩儗僀偵傾僀僐儞傪搊榐 */
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE;
nid.uID = ID_NOTIFYICON;
lstrcpy(nid.szTip,"TOPPERS/JSP");
nid.hWnd = hDlg;
nid.uCallbackMessage = HALMSG_MESSAGE+1;
nid.hIcon = LoadIcon(ProcessInstance,MAKEINTRESOURCE(IDI_ERTLICON));
Shell_NotifyIcon(NIM_ADD,&nid);
/* 僇乕僱儖傪暿僗儗僢僪偱婲摦偡傞 */
PrimaryThreadHandle = (HANDLE)hDlg;
CurrentRunningThreadHandle = CreateThread(NULL,0,KernelStarter,NULL,0,&ThreadID);
FatalAssertion(CurrentRunningThreadHandle != NULL, "CreateThread at " __FILE__);
break;
}
/* 僟僀傾儘僌傪暵偠傛偆偲偟偰偄傑偡 */
case WM_CLOSE:
HALQuitRequest();
break;
/* 僟僀傾儘僌偑攋婞偝傟傑偟偨 */
case WM_DESTROY:
{
/* 僞僗僋僩儗僀巒枛 */
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.uFlags = 0;
nid.hWnd = hDlg;
nid.uID = ID_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE,&nid);
PrimaryThreadHandle = INVALID_HANDLE_VALUE;
PostQuitMessage(0);
break;
}
/* 僞僀儅張棟 */
case WM_TIMER:
/* 忋埵16價僢僩偑慡晹1 -> 僇乕僱儖偺僞僀儅 */
if((wParam & 0xffff0000) == 0xffff0000)
{
/* 壓埵16價僢僩偼妱崬傒斣崋 */
return HALMessageHandler(HALMSG_INTERRUPT,(wParam & 0x0000ffff));
}
default:
return FALSE;
}
return TRUE;
}
/*
* 儊僀儞娭悢
*/
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShow)
{
MSG msg;
HANDLE hDlg;
ProcessInstance = hInstance;
DestructionProcedureQueue = NULL;
PrimaryThreadHandle = INVALID_HANDLE_VALUE;
CurrentRunningThreadHandle = INVALID_HANDLE_VALUE;
InitializeComSupportModule();
OnDebug InitializeDebugServices(hInstance,PrimaryDialogHandle);
TlsSetValue(TLS_LOGMASK, 0);
hDlg = CreateDialog(hInstance,"PrimaryDialog",NULL,PrimaryDialogProc);
if(hDlg != NULL)
{
ShowWindow(PrimaryDialogHandle,SW_HIDE);
OnDebug ShowWindow(PrimaryDialogHandle,SW_SHOW);
while(GetMessage(&msg,NULL,0,0) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(msg.message == WM_QUIT)
msg.message = 0;
}
}
else
FatalAssertion(hDlg != NULL, "CreateDialog at " __FILE__ "(" ")");
OnDebug FinalizeDebugServices();
FinalizeComSupportModule();
/* 攋婞偝傟偰側偄僞僗僋偺屻巒枛 */ {
int i;
for(i=0;i<_kernel_tmax_tskid;i++)
{
if(_kernel_tcb_table[i].tskctxb.ThreadHandle != INVALID_HANDLE_VALUE)
{
TerminateThread(_kernel_tcb_table[i].tskctxb.ThreadHandle,0);
CloseHandle(_kernel_tcb_table[i].tskctxb.ThreadHandle);
_kernel_tcb_table[i].tskctxb.ThreadHandle = INVALID_HANDLE_VALUE;
}
}
}
if(WorkerThreadHandle != INVALID_HANDLE_VALUE)
{
TerminateThread(WorkerThreadHandle ,0);
CloseHandle(WorkerThreadHandle);
WorkerThreadHandle = INVALID_HANDLE_VALUE;
}
fin_int();
fin_exc();
ExitProcess(msg.wParam);
return msg.wParam;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -