⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 com_support.cpp

📁 toppers操作系统源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			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 + -