📄 primary_thread.c
字号:
{ //これまで瓢かしていたタスクの充哈みマスクレベルを锣闰 if(isTaskThreadRunning(runtsk)) vget_ims(&runtsk->tskctxb.InterruptLevel); ResumeThread(CurrentRunningThreadHandle); //充哈みスレッド弹瓢 } else { // タスクへと提る task_dispatcher(reqflg); reqflg = 0; } 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,CREATE_SUSPENDED,&ThreadID); ResumeThread(CurrentRunningThreadHandle); 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 = NULL; PostQuitMessage(0); break; } /* タイマ借妄 */ case WM_TIMER: /* 惧疤16ビットが链婶1 -> カ〖ネルのタイマ */ if((wParam & 0xffff0000) == 0xffff0000) { /* 布疤16ビットは充哈み戎规 */ return HALMessageHandler(HALMSG_INTERRUPT,(wParam & 0x0000ffff)); } default: return FALSE; } return TRUE;} /* マルチプロセッサでも奥年するよう、わざと帽办のプロセッサのみで借妄させるようにする */void setAffinityMask(void){ DWORD process; DWORD system; DWORD newaffinitymask; if(GetProcessAffinityMask(GetCurrentProcess(), &process, &system) != 0) { newaffinitymask = 1; while((process & newaffinitymask) == 0) newaffinitymask <<= 1; SetProcessAffinityMask(GetCurrentProcess(), newaffinitymask); } kprintf(("setAffinityMask : 0x%08x\n", newaffinitymask));}static void initialize(HANDLE hInstance){ ProcessInstance = hInstance; DestructionProcedureQueue = NULL; PrimaryThreadHandle = NULL; CurrentRunningThreadHandle = NULL;#ifdef KERNEL_DEBUG_MODE AllocConsole();#endif /* プロセッサを充り烧ける */ setAffinityMask();}static void finalRelease(void){ int i; kprintf(("finalRelease()\n")); /* 撬逮されてないタスクの稿幌琐 */ for(i=0;i<_kernel_tmax_tskid;i++) { if(_kernel_tcb_table[i].tskctxb.ThreadHandle != NULL) { if(TerminateThread(_kernel_tcb_table[i].tskctxb.ThreadHandle,0) != 0) CloseHandle(_kernel_tcb_table[i].tskctxb.ThreadHandle); _kernel_tcb_table[i].tskctxb.ThreadHandle = NULL; } } /* COM奶慨をしているスレッドを动扩匿贿 */ if(WorkerThreadHandle != NULL) { TerminateThread(WorkerThreadHandle ,0); CloseHandle(WorkerThreadHandle); WorkerThreadHandle = NULL; }#ifdef KERNEL_DEBUG_MODE MessageBox(NULL, "The kernel will be shut down.", "TOPPERS/JSP", MB_OK); FreeConsole();#endif}/* * メイン簇眶 */int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShow){ MSG msg; HANDLE hDlg; TlsAlloc(); initialize(hInstance); 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) { if(msg.message == WM_QUIT) msg.message = 0; TranslateMessage(&msg); DispatchMessage(&msg); } } else FatalAssertion(hDlg != NULL, "CreateDialog at " __FILE__ "(" ")"); finalRelease(); ExitProcess(msg.wParam); return msg.wParam;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -