📄 com_support.cpp
字号:
::CopyMemory(reinterpret_cast<char *>(storage) + offset, data, sz); } //瘦积挝拌に滦する粕哈み inline bool get(void * data, unsigned int sz, unsigned int offset = 0) { if(size < sz + offset) return false; ::CopyMemory(data, reinterpret_cast<char *>(storage) + offset, sz); } //瘦积挝拌の扦罢の疤弥に滦するポインタ艰评 // offset : 黎片からのバイトオフセット void * getptr(unsigned int offset = 0) { if(offset > size || storage == NULL) return NULL; return reinterpret_cast<void *>(reinterpret_cast<char *>(storage) + offset); } /* * Requestオブジェクトファクトリ * Q: どうしてファクトリが涩妥なのか? * A: メモリ澄瘦よりも黎にCPUをロックする涩妥があるため (拒嘿は惧淡CPUロックする妄统を徊救) */ static Request * Create(enum tagRequestType _type, bool _block, unsigned int _size = 0, void * _storage = NULL, unsigned long _address = 0) { Request * request; BOOL lock; enter_system_critical_section(&lock); request = new Request(_type, _block, _size, _storage, _address); leave_system_critiacl_section(&lock); return request; } static Request * GetRequest(void) { Request * result; ::EnterCriticalSection(&cs); result = top; if(top != NULL) { top = top->next; if(top == NULL) tail = NULL; } ::LeaveCriticalSection(&cs); ::InterlockedDecrement(&RequestCount); return result; } void Finalize(bool succeeded) { if(this != 0) { if(isBlockingRequest()) signal(succeeded ? getSize() : -1); else { BOOL lock; enter_system_critical_section(&lock); delete this; leave_system_critiacl_section(&lock); } } } virtual void signal(int _result = 0) { result = _result; if(signalobject != NULL) ::PostThreadMessage((DWORD)signalobject, WM_QUIT, 0, 0); } /* * 糠しい妥滇の券乖 * (この簇眶を蝗うスレッド : 瓷妄スレッド, 充哈みスレッド, タスクスレッド) */ virtual int invoke(void) { int _result; BOOL lock; MSG msg; _result = 0; if(!IsValid()) return -1; enter_system_critical_section(&lock); connect(); //妥滇の悸乖略ち if(blocking) { signalobject = (HANDLE)::GetCurrentThreadId(); //糠しい妥滇をだしたことを奶梦 ::ReleaseSemaphore(request_semaphore,1,NULL); leave_system_critiacl_section(&lock); //WM_QUITメッセ〖ジを蝗って票袋を艰る while(::GetMessage(&msg, 0, 0, 0) != 0) ::DispatchMessage(&msg); //このオブジェクトを撬逮するのでバックアップを艰る _result = result; //キュ〖からはずす借妄は侯度スレッドがやる //delete requestは、ノンブロッキングなら侯度スレッド勒扦、ブロッキングならここでやる enter_system_critical_section(&lock); delete this; leave_system_critiacl_section(&lock); }else { //糠しい妥滇をだしたことを奶梦 ::ReleaseSemaphore(request_semaphore,1,NULL); leave_system_critiacl_section(&lock); } return _result; } }; class EventDumpRequest : public Request { protected: static HANDLE FileHandle; EventDumpRequest(enum tagRequestType _type, bool _block, unsigned int _size = 0, void * _storage = NULL, unsigned long _address = 0) : Request(_type, _block, _size, _storage, _address) {} public: static void initialize(void) { SYSTEMTIME systim; DWORD written; char buffer[1024]; char * top; char * work; ::GetLocalTime(&systim); ::wsprintf(buffer, "kernel-log-%04d%02d%02d-%02d%02d%02d.log", systim.wYear, systim.wMonth, systim.wDay, systim.wHour, systim.wMinute, systim.wSecond); FileHandle = ::CreateFile(buffer, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL); kprintf(("EventDumpRequest : initialize (filename = '%s')\n", buffer)); T_RGLOG_HEADER log; log.logtype = LOG_TIMESTAMP; log.logtim = 0; log.bufsz = sizeof(SYSTEMTIME); log.valid = 1; ::WriteFile(FileHandle, &log, sizeof(log), &written, NULL); ::WriteFile(FileHandle, &systim, sizeof(SYSTEMTIME), &written, NULL); /* モジュ〖ル叹を艰り叫す */ ::lstrcpyn(buffer, ::GetCommandLine(), 1023); top = buffer; buffer[1023] = '\x0'; //サ〖チ脱戎始 if(*top == '"') { ++ top; for(work = top; *work != '\x0' && *work != '"'; ++work); } else for(work = top; *work != '\x0' && *work != ' '; ++work); *work = '\x0'; //タ〖ミネ〖ト借妄 log.logtype = LOG_MODULENAME; log.logtim = 0; log.bufsz = work - top + 1; //タ〖ミネ〖タの尸 log.valid = 1; ::WriteFile(FileHandle, &log, sizeof(log), &written, NULL); ::WriteFile(FileHandle, top, log.bufsz, &written, NULL); } static void finalize(void) { kprintf(("EventDumpRequest : finalize()\n")); if(FileHandle != INVALID_HANDLE_VALUE) //CreateFile returns INVALID_HANDLE_VALUE if it failed ::CloseHandle(FileHandle); } static EventDumpRequest * Create(enum tagRequestType _type, bool _block, unsigned int _size = 0, void * _storage = NULL, unsigned long _address = 0) { EventDumpRequest * request; BOOL lock; enter_system_critical_section(&lock); request = new EventDumpRequest(_type, _block, _size, _storage, _address); leave_system_critiacl_section(&lock); return request; } virtual int invoke(void) { DWORD written; BOOL lock; enter_system_critical_section(&lock); if(FileHandle != INVALID_HANDLE_VALUE) //CreateFile return INVALID_HANDLE_VALUE, not NULL, if it failed its operatation. ::WriteFile(FileHandle, storage, size, &written, NULL); delete this; leave_system_critiacl_section(&lock); return 0; } }; class ExclusiveDeviceRequest : public Request { protected: static HANDLE blocker; public: static void initialize(void) throw() { kprintf(("ExclusiveDeviceRequest::initialize()\n")); if(blocker == NULL) { blocker = ::CreateEvent(NULL, FALSE, FALSE, NULL); } } static void finalize(void) throw() { kprintf(("ExclusiveDeviceRequest::finalize()\n")); if(blocker != NULL) { ::CloseHandle(blocker); } } virtual void signal(int _result = 0) { result = _result; ::SetEvent(blocker); } virtual int invoke(void) { int _result = 0; BOOL lock; BOOL cpustate; //充り哈みを敦贿する if((cpustate = CPUStatus) == 0) dis_int(0); enter_system_critical_section(&lock); //妥滇をキュ〖の黎片につなぐ ::EnterCriticalSection(&cs); next = top; top = this; if(tail == NULL) tail = this; ::LeaveCriticalSection(&cs); ::InterlockedIncrement(&RequestCount); ::ReleaseSemaphore(request_semaphore, 1, NULL); leave_system_critiacl_section(&lock); if(blocking) { ::WaitForSingleObject(blocker, INFINITE); _result = result; enter_system_critical_section(&lock); delete this; leave_system_critiacl_section(&lock); } if(cpustate == 0) ena_int(0); return _result; } };// typedef class EventDumpRequest EventRequest; typedef class Request EventRequest; //イベントログ叫蜗妥滇で蝗脱されるリクエスト// typedef class Request DeviceRequest; //デバイス奶慨妥滇で蝗脱されるリクエスト typedef class ExclusiveDeviceRequest DeviceRequest; //デバイス奶慨妥滇で蝗脱されるリクエスト //============================================================================== LONG Request::RequestCount = -1; //キュ〖につながっているリクエストの眶 Request * Request::top = NULL; //リクエストキュ〖の黎片 (もっとも概いリクエスト) Request * Request::tail = NULL; //リクエストキュ〖の琐萨 (もっとも糠しいリクエスト) CRITICAL_SECTION Request::cs; //怯戮キュ〖拎侯脱错副挝拌オブジェクト HANDLE EventDumpRequest::FileHandle = INVALID_HANDLE_VALUE; //CreateFile uses INVALID_HANDLE_VALUE for identifying an invalid instance HANDLE ExclusiveDeviceRequest::blocker = NULL; //============================================================================== /* * 侯度スレッドが蝗脱する侯度簇眶の年盗 */ //コネクションポイントへの儡鲁 bool Advise(IUnknown * container, REFIID iid, IUnknown * sink, DWORD * cookie, IConnectionPoint ** p_cp = NULL) { IConnectionPointContainer * cp_container; IConnectionPoint * cp; if(container == 0 || sink == 0 || cookie == 0) return false; if(p_cp == 0) p_cp = &cp; //IUnknownインタフェ〖スからIConnectionPointContainerへキャスト container->QueryInterface(IID_IConnectionPointContainer, (void **)&cp_container); if(cp_container == 0) return false; //ConnectionPointContainerから妥滇に圭うConnectionPointを玫す cp_container->FindConnectionPoint(iid, p_cp); cp_container->Release(); if(*p_cp == 0) return false; //コネクションポイント儡鲁 if(FAILED((*p_cp)->Advise(sink, cookie))) return false; if(p_cp == &cp) cp->Release(); return true; } //============================================================================== /* * PerformRequest : 妥滇の悸乖 * 手笛猛 : イベント借妄を费鲁する(true) or 侯度スレッドを匿贿させる(false) */ bool PerformRequest(IKernel * manager) { Request * request; bool succeeded; //キュ〖からリクエストを却き艰る request = Request::GetRequest(); FatalAssertion(request != NULL,""); //姜位妥滇 if(request->getType() == Request::QuitThread) { if(!request->isBlockingRequest()) { BOOL lock; enter_system_critical_section(&lock); delete request; leave_system_critiacl_section(&lock); } return false; } //妥滇髓の借妄 switch(request->getType()) { case Request::Confirmation: succeeded = true; break; case Request::DeviceRead: succeeded = SUCCEEDED(manager->Read(request->getAddress(), request->getSize(), reinterpret_cast<char *>(request->getStorage()))); break; case Request::DeviceWrite: succeeded = SUCCEEDED(manager->Write(request->getAddress(), request->getSize(), reinterpret_cast<char *>(request->getStorage()))); break; case Request::EventLog: succeeded = SUCCEEDED(manager->OnLogEvent(request->getSize(), reinterpret_cast<unsigned char *>(request->getStorage()))); //シャットダウン面ならログを链婶はき姜るまで略ってもらう ShutdownPostponementRequest = TRUE; break; default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -