VOID CLog::ThreadStart( __in PVOID StartContext ) { LARGE_INTEGER WaitTime = {0}; ULONG ulCount = 0; NTSTATUS ntStatus = STATUS_UNSUCCESSFUL; CKrnlStr LogInfo; CLog Log; KdPrintKrnl(LOG_PRINTF_LEVEL_INFO, LOG_RECORED_LEVEL_NEEDNOT, L"begin"); __try { Log.GetLock(); WaitTime.QuadPart = - 100 * 1000; do { Log.FreeLock(); ntStatus = KeWaitForSingleObject( &ms_UnloadEvent, Executive, KernelMode, FALSE, &WaitTime ); Log.GetLock(); switch (ntStatus) { case STATUS_SUCCESS: { Log.FreeLock(); if (Log.LogFileReady()) { Log.GetLock(); do { if (!Log.Pop(&LogInfo)) { // KdPrintKrnl(LOG_PRINTF_LEVEL_ERROR, LOG_RECORED_LEVEL_NEEDNOT, L"[STATUS_SUCCESS] Log.Pop failed"); break; } Log.FreeLock(); if (!Log.Write(&LogInfo)) { Log.GetLock(); KdPrintKrnl(LOG_PRINTF_LEVEL_ERROR, LOG_RECORED_LEVEL_NEEDNOT, L"[STATUS_SUCCESS] Log.Write failed. Log(%wZ)", LogInfo.Get()); __leave; } Log.GetLock(); } while (TRUE); } else Log.GetLock(); __leave; } case STATUS_TIMEOUT: { Log.FreeLock(); if (Log.LogFileReady()) { Log.GetLock(); do { if (!Log.Pop(&LogInfo)) { // KdPrintKrnl(LOG_PRINTF_LEVEL_ERROR, LOG_RECORED_LEVEL_NEEDNOT, L"[STATUS_TIMEOUT] Log.Pop failed"); break; } Log.FreeLock(); if (!Log.Write(&LogInfo)) { Log.GetLock(); KdPrintKrnl(LOG_PRINTF_LEVEL_ERROR, LOG_RECORED_LEVEL_NEEDNOT, L"[STATUS_TIMEOUT] Log.Write failed. Log(%wZ)", LogInfo.Get()); __leave; } Log.GetLock(); ulCount++; } while (MAX_EVERY_TIME_LOG_COUNT > ulCount); } else { Log.InitLogFile(TRUE); Log.GetLock(); } break; } default: { KdPrintKrnl(LOG_PRINTF_LEVEL_ERROR, LOG_RECORED_LEVEL_NEEDNOT, L"KeWaitForSingleObject failed. (%x)", ntStatus); __leave; } } ulCount = 0; } while (TRUE); } __finally { Log.FreeLock(); if (!Log.ReleaseLogFile()) KdPrintKrnl(LOG_PRINTF_LEVEL_ERROR, LOG_RECORED_LEVEL_NEEDNOT, L"RleaseLogFile failed"); } KdPrintKrnl(LOG_PRINTF_LEVEL_INFO, LOG_RECORED_LEVEL_NEEDNOT, L"end"); return; }