📄 com_support.cpp
字号:
if(realloc)
::CopyMemory(storage, old_storage, old_size);
if(allocated)
::GlobalFree(old_storage);
}
leave_system_critiacl_section(&lock);
allocated = true;
size = _size;
return true;
}
//撪梕傪曐帩偟偨傑傑嵞傾儘働乕僩
inline bool reallocate(unsigned int _size)
{ return allocate(_size, true); }
//曐帩椞堟偵懳偡傞彂崬傒
inline void set(void * data, unsigned int sz, unsigned int offset = 0)
{
if(size < sz)
reallocate(sz + offset);
::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 Request::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);
}
}
}
void signal(int _result = 0)
{
result = _result;
if(signalobject != INVALID_HANDLE_VALUE)
::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偼丄僲儞僽儘僢僉儞僌側傜嶌嬈僗儗僢僪愑擟丄僽儘僢僉儞僌側傜偙偙偱傗傞
delete this;
}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);
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)
{
if(FileHandle != INVALID_HANDLE_VALUE)
::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)
::WriteFile(FileHandle, storage, size, &written, NULL);
delete this;
leave_system_critiacl_section(&lock);
return 0;
}
};
// typedef class EventDumpRequest EventRequest;
typedef class Request EventRequest; //僀儀儞僩儘僌弌椡梫媮偱巊梡偝傟傞儕僋僄僗僩
typedef class Request DeviceRequest; //僨僶僀僗捠怣梫媮偱巊梡偝傟傞儕僋僄僗僩
//==============================================================================
LONG Request::RequestCount = -1; //僉儏乕偵偮側偑偭偰偄傞儕僋僄僗僩偺悢
Request * Request::top = NULL; //儕僋僄僗僩僉儏乕偺愭摢 (傕偭偲傕屆偄儕僋僄僗僩)
Request * Request::tail = NULL; //儕僋僄僗僩僉儏乕偺枛旜 (傕偭偲傕怴偟偄儕僋僄僗僩)
CRITICAL_SECTION Request::cs; //攔懠僉儏乕憖嶌梡婋尟椞堟僆僽僕僃僋僩
HANDLE EventDumpRequest::FileHandle = INVALID_HANDLE_VALUE;
//==============================================================================
/*
* 嶌嬈僗儗僢僪偑巊梡偡傞嶌嬈娭悢偺掕媊
*/
//僐僱僋僔儑儞億僀儞僩傊偺愙懕
bool Advise(IUnknown * container, REFIID iid, IUnknown * sink, DWORD * cookie, IConnectionPoint ** p_cp = NULL)
{
IConnectionPointContainer * cp_container;
IConnectionPoint * cp;
if(p_cp == NULL)
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:
succeeded = false;
}
request->Finalize(succeeded);
return true;
}
/*
* COM捠怣傪峴偆偨傔偺嶌嬈僗儗僢僪 杮懱
*/
DWORD WINAPI WorkerThreadProcess(LPVOID _param)
{
IKernel * manager;
IKernelEvents * sink;
IConnectionPoint * cp;
DWORD cookie;
BOOL Success;
/* 弶婜壔 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -