📄 com_support.cpp
字号:
succeeded = false; } request->Finalize(succeeded); return true; } /* * COM奶慨を乖うための侯度スレッド 塑挛 */ DWORD WINAPI WorkerThreadProcess(LPVOID _param) { IKernel * manager; IKernelEvents * sink; IConnectionPoint * cp; DWORD cookie; BOOL Success; kprintf(("WorkerThreadProcess : start\n")); /* 介袋步 */ ::CoInitialize(NULL); // デバイスマネ〖ジャと儡鲁 manager = 0; if(FAILED(::CoCreateInstance(CLSID_Kernel, NULL, CLSCTX_ALL, IID_IKernel, (void **)&manager))) goto _WorkerThreadProc_Cleanup; cp = 0; sink = new(std::nothrow) IKernelEvents; if(!Advise(manager, IID_IKernelEvents, sink, &cookie,&cp)) { if(sink != 0) delete sink; goto _WorkerThreadProc_Cleanup; } /* メインル〖チン */ manager->IsValid(&Success); if(Success != 0) { MSG msg; DWORD work; bool loop_flag = true; do { /* * 嘲婶からCOMをたたくとメッセ〖ジとして若んでくるため、WaitForSingleObjectでセマフォを略つと嘲婶からの妥滇を悸乖できなくなる。 * そのため、MsgWaitFor...を脱い、メッセ〖ジが若んできた眷圭はこれに滦借できるようにする。 */ /* * cygwin茨董だとQS_ALLPOSTMESSAGEが年盗されないので、これで滦借 */#ifndef QS_ALLPOSTMESSAGE#define QS_ALLPOSTMESSAGE (0x0100)#endif //妥滇略ち work = ::MsgWaitForMultipleObjects(1, &request_semaphore, FALSE, INFINITE, QS_ALLPOSTMESSAGE); switch(work) { //借妄妥滇の悸乖 case WAIT_OBJECT_0: loop_flag = PerformRequest(manager); break; //嘲婶からの妥滇 (充哈みなど) case WAIT_OBJECT_0 + 1: GetMessage(&msg, 0, 0, 0); TranslateMessage(&msg); DispatchMessage(&msg); break; default: loop_flag = false; } } while(loop_flag); } /* * Finalize */ if(cp != 0) { cp->Unadvise(cookie); cp->Release(); cp = 0; sink = 0; } _WorkerThreadProc_Cleanup: if(manager != 0) manager->Release(); CloseHandle(worker_thread_handle); worker_thread_handle = NULL; manager = 0l; ::CoUninitialize(); /* キュ〖を鄂にする (略ち豺近) */ Request * request; while((request = Request::GetRequest()) != 0) request->Finalize(false); kprintf(("WorkerThreadProcess : exit\n")); return 0; }}//==============================================================================/**************************************************** * * * TOPPERS/JSP - Windowsシミュレ〖ション茨董 * * COMを脱いたデバイスエミュレ〖ション怠墙 * * * ****************************************************/#ifdef DEVICE_ENABLEextern "C"int _cdecl DeviceRead(unsigned long address, unsigned long size, void * storage){ if(!IsValid() || storage == NULL) return -1; return DeviceRequest::Create(Request::DeviceRead, true, size, storage, address)->invoke();}extern "C"int _cdecl DeviceWrite(unsigned long address, unsigned long size, void * storage){ if(!IsValid() || storage == NULL) return -1; return DeviceRequest::Create(Request::DeviceWrite, true, size, storage, address)->invoke();}#endif/**************************************************** * * * TOPPERS/JSP - Windowsシミュレ〖ション茨董 * * COMを脱いたカ〖ネルログ艰评怠墙 * * * ****************************************************/#ifdef EVENTLOG_ENABLE /* 驴脚ログ叫蜗松贿脱セマフォ : 1を颅した冯蔡が1であったときだけ、ログを叫蜗できる */static LONG event_write_semaphore = 0;void event_write(unsigned int logtype, unsigned int valid, UINT bufsz, ... ){ EventRequest * event_request; DBIFLOG * log; va_list vl; if(IsValid() && TlsGetValue(TLS_LOGMASK) == 0) { // リクエスト挝拌澄瘦 event_request = EventRequest::Create(EventRequest::EventLog, false, sizeof(T_RGLOG_HEADER) + bufsz); log = reinterpret_cast<DBIFLOG *>(event_request->getptr()); // ヘッダ栏喇 log->header.logtype = logtype; log->header.logtim = _kernel_systim_offset + _kernel_current_time; log->header.valid = valid; log->header.bufsz = bufsz; // 塑挛の呈羌 va_start(vl, bufsz); for(unsigned int i=0;i<bufsz/sizeof(int);i++) *((int *)&log->body + i) = va_arg(vl, int); // 妥滇の流烧 (Non-blocking) event_request->invoke(); }}extern "C"void event_write_svc_enter(int fncd, unsigned int params, ... ){ EventRequest * event_request; DBIFLOG * log; va_list vl; unsigned int i; if(IsValid() && TlsGetValue(TLS_LOGMASK) == 0) { //挝拌澄瘦 : 澄瘦するサイズはパラメ〖タ另眶より办改尸驴い (钙び叫し傅アドレスを呈羌) event_request = EventRequest::Create(EventRequest::EventLog, false, sizeof(T_RGLOG_HEADER) + sizeof(T_RGLOG_SVC) + params * sizeof(VP_INT)); log = reinterpret_cast<DBIFLOG *>(event_request->getptr()); //パケット栏喇 log->header.logtype = LOG_TYPE_SVC; log->header.logtim = _kernel_systim_offset + _kernel_current_time; log->header.valid = 0x7fffffff >> (29 - params); log->header.bufsz = (params+3) * sizeof(int); va_start(vl, params); log->body.svc.fncno = fncd; log->body.svc.prmcnt = params; /* 办搀ル〖プが驴いのは呵稿に钙叫傅アドレスを姥んでいるため */ for(i=0;i<params+1;i++) log->body.svc.prmary[i] = va_arg(vl, VP_INT); event_request->invoke(); }}extern "C"void event_write_svc_leave(int fncd, unsigned int ercd, unsigned int retaddr){ EventRequest * event_request; DBIFLOG * log; if(IsValid() && TlsGetValue(TLS_LOGMASK) == 0) { //挝拌澄瘦 : 澄瘦するサイズはパラメ〖タ另眶(手笛猛のみなので1つ)より办改尸驴い (钙び叫し傅アドレスを呈羌) event_request = EventRequest::Create(EventRequest::EventLog, false, sizeof(T_RGLOG_HEADER) + sizeof(T_RGLOG_SVC) + sizeof(VP_INT)); log = reinterpret_cast<DBIFLOG *>(event_request->getptr()); //ヘッダ婶栏喇 log->header.logtype = LOG_TYPE_SVC|LOG_LEAVE; log->header.logtim = _kernel_systim_offset + _kernel_current_time; log->header.valid = 0x7; log->header.bufsz = 4 * sizeof(int); //ボディ婶栏喇 log->body.svc.fncno = fncd; log->body.svc.prmcnt = 1; log->body.svc.prmary[0] = (VP_INT)ercd; log->body.svc.prmary[1] = (VP_INT)retaddr; event_request->invoke(); }}extern "C" void decode_taskstatus(void * tcb, int * tskid, unsigned int * tskstat, unsigned int * objtype, int * objid);extern "C" void event_write_tskstat(void * tcb){ EventRequest * event_request; DBIFLOG * log; if(IsValid()) //これはカ〖ネル拎侯なのでTLS_LOGMASKを斧てはいけない { //挝拌澄瘦 event_request = EventRequest::Create(EventRequest::EventLog, false, sizeof(T_RGLOG_HEADER) + sizeof(T_RGLOG_TSKSTAT)); log = reinterpret_cast<DBIFLOG *>(event_request->getptr()); log->header.logtype = LOG_TYPE_TSKSTAT; log->header.logtim = _kernel_systim_offset + _kernel_current_time; log->header.valid = 0xf; log->header.bufsz = 4 * sizeof(int); decode_taskstatus(tcb, &log->body.tskstat.tskid, &log->body.tskstat.tskstat, &log->body.tskstat.tskwait, &log->body.tskstat.wobjid); event_request->invoke(); }}#endifstatic BOOL CALLBACK NotifyDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam){ switch(Msg) { case WM_INITDIALOG: { LONG count; HWND hCtrl; hCtrl = ::GetDlgItem(hDlg, IDC_PROGRESS1); count = Request::getRequestCount(); ::SetWindowLong(hDlg, GWL_USERDATA, count); ::SendMessage(hCtrl, PBM_SETRANGE32, 0, count); ::SendMessage(hCtrl, PBM_SETPOS, count - Request::getRequestCount(), 0); ::SetTimer(hDlg, 100, 200, NULL); break; } case WM_TIMER: if(wParam == 100) { LONG count; HWND hCtrl; hCtrl = ::GetDlgItem(hDlg, IDC_PROGRESS1); count = ::GetWindowLong(hDlg, GWL_USERDATA); ::SendMessage(hCtrl, PBM_SETPOS, count - Request::getRequestCount(), 0); if(Request::getRequestCount() <= 0) ::PostQuitMessage(0); } break; case WM_CLOSE: break; default: return FALSE; } return TRUE;}extern "C"void _cdecl InitializeComSupportModule(void){ kprintf(("InitializeComSupportModule()\n")); Request::initialize(); DeviceRequest::initialize(); EventRequest::initialize(); request_semaphore = ::CreateSemaphore(0, 0, 65536, 0); FatalAssertion(request_semaphore != NULL, "Object Creation Error : request_semaphore"); worker_thread_handle = ::CreateThread(0, 0, WorkerThreadProcess, 0, 0, 0); FatalAssertion(worker_thread_handle != NULL, "Object Creation Error : worker_thread"); Request * request = Request::Create(Request::Confirmation, true); request->invoke();}extern "C"void _cdecl FinalizeComSupportModule(void){ kprintf(("FinalizeComSupportModule()\n")); if(IsValid()) { HWND hDlgitem; HWND NotifyDialog; MSG msg; //ログが委まりすぎるとログ徘きに箕粗がかかり、プログラムが私瘤したように斧えるので //≈ログを徘いてるから略て∽と焚桂を叫す。 NotifyDialog = ::CreateDialog(ProcessInstance, MAKEINTRESOURCE(QUITNOTICEDIALOG), NULL, NotifyDialogProc); hDlgitem = ::GetDlgItem(NotifyDialog, IDC_NOTIFYMSG); ::SetWindowText(hDlgitem, "海 办栏伏炭カ〖ネルのイベントログを叫しているので、姜るまで警し略ってください"); ::ShowWindow(NotifyDialog, SW_NORMAL); Request * request = Request::Create(Request::QuitThread, false); request->invoke(); //姜位ダイアログ脱のメッセ〖ジポンプ if(NotifyDialog != NULL) { while(GetMessage(&msg, NULL, 0, 0) != 0) { TranslateMessage(&msg); DispatchMessage(&msg); } } //ちゃんとスレッドが姜位するまで略怠 if(worker_thread_handle != NULL) ::WaitForSingleObject(worker_thread_handle, INFINITE); ::CloseHandle(request_semaphore); request_semaphore = NULL; EventRequest::finalize(); DeviceRequest::finalize(); Request::finalize(); ::DestroyWindow(NotifyDialog); }}#else // __COM_NOT_REQUIRED__extern "C"void _cdecl InitializeComSupportModule(void){}extern "C"void _cdecl FinalizeComSupportModule(void){}#endif // __COM_NOT_REQUIRED__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -