Esempio n. 1
0
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;
}