IopErrorLogThread
VOID __stdcall IopErrorLogThread(VOID *StartContext){
__int64 Blink;
int v2;
unsigned __int16 Length;
wchar_t *Buffer;
__int16 v5;
char v6;
VOID **p_P;
UINT64 v8;
UINT64 v9;
_ADAPTER_OBJECT *Flink;
_LIST_ENTRY *Entry;
_LIST_ENTRY *v12;
NTSTATUS v13;
const wchar_t *v14;
__int16 v15;
UINT64 SidLength;
_UNICODE_STRING v17;
UINT64 PacketSize;
_LIST_ENTRY **SidData;
_UNICODE_STRING v20;
__int64 v21;
_UNICODE_STRING DestinationString;
_UNICODE_STRING v23;
__int16 pszDest[256];
__int16 DeviceName[256];
char P;
v17 = 0i64;
WORD2(SidLength) = 0;
v20 = 0i64;
SidData = 0i64;
DestinationString = 0i64;
if( *(&stru_140C452E0 + 612) )
{
while( 1 )
{
LABEL_29:
LODWORD(SidLength) = 0;
Entry = IopErrorLogGetEntry();
v12 = Entry;
if( !Entry )
return;
Blink = (__int64)Entry[1].Blink;
v2 = WORD1(Entry[-1].Blink) - 48;
v21 = Blink;
LODWORD(PacketSize) = v2;
if( Blink )
{
RtlInitUnicodeString(&v17, 0i64);
if( *(_QWORD *)(Blink + 64) )
v17 = *(_UNICODE_STRING *)(Blink + 56);
Length = v17.Length;
if( v17.Length )
{
LABEL_8:
Buffer = &v17.Buffer[((unsigned __int64)Length >> 1) - 1];
if( *Buffer == 92 )
goto LABEL_12;
do
{
if( Buffer == v17.Buffer )
break;
--Buffer;
}
while( *Buffer != 92 );
if( *Buffer == 92 )
LABEL_12:
++Buffer;
v5 = LOWORD(v17.Buffer) - (_WORD)Buffer;
v17.Buffer = Buffer;
Length += v5;
v17.Length = Length;
goto LABEL_14;
}
LODWORD(SidLength) = 0;
if( ObQueryNameStringMode((VOID *)Blink, (_OBJECT_NAME_INFORMATION *)&v23, 0x110ui64, &SidLength, 0) >= 0
&& (_DWORD)SidLength )
{
v17 = v23;
goto LABEL_41;
}
v14 = (const wchar_t *)&dword_1407CF120;
}
else
{
v14 = L"Application Popup";
}
RtlInitUnicodeString(&v17, v14);
LABEL_41:
Length = v17.Length;
if( v17.Length )
goto LABEL_8;
Buffer = v17.Buffer;
LABEL_14:
LODWORD(SidLength) = 0;
v6 = 0;
p_P = (VOID **)&P;
v8 = 272i64;
if( !v12[1].Flink )
goto LABEL_15;
while( 1 )
{
v13 = ObQueryNameStringMode(v12[1].Flink, (_OBJECT_NAME_INFORMATION *)p_P, v8, &SidLength, 0);
if( v13 != -1073741820 )
break;
if( v6 )
goto LABEL_15;
p_P = IopVerifierExAllocatePool_4(1ui64, (unsigned int)SidLength);
if( !p_P )
goto LABEL_15;
v8 = (unsigned int)SidLength;
v6 = 1;
}
v9 = 0i64;
if( v13 >= 0 && (_DWORD)SidLength )
{
v20 = *(_UNICODE_STRING *)p_P;
}
else
{
LABEL_15:
RtlInitUnicodeString(&v20, (PCWSTR)&dword_1407CF120);
v9 = 0i64;
}
pszDest[0] = 0;
DeviceName[0] = 0;
if( Buffer )
RtlStringCchCopyNW((WCHAR *)pszDest, 0x100ui64, Buffer, (unsigned __int64)Length >> 1);
if( v20.Buffer )
RtlStringCchCopyNW((WCHAR *)DeviceName, 0x100ui64, v20.Buffer, (unsigned __int64)v20.Length >> 1);
if( v6 == 1 )
ExFreePoolWithTag(p_P, 0);
if( (unsigned int)(HIDWORD(v12[3].Flink) - 1074004004) <= 1 && !wcsicmp((const wchar_t *)pszDest, L"NTFS") )
{
v15 = WORD2(v12[5].Flink);
WORD1(v12[2].Blink) -= v15;
WORD2(SidLength) = v15;
SidData = &v12[7].Blink;
}
if( EtwWriteErrorLogEntry(
v9,
(_IO_ERROR_LOG_PACKET *)&v12[2].Blink,
(unsigned int)PacketSize,
(_LARGE_INTEGER *)&v12[2],
(PWCHAR)pszDest,
(PWCHAR)DeviceName,
WORD2(SidLength),
SidData) < 0 )
{
IopErrorLogRequeueEntry(v12);
goto LABEL_49;
}
_InterlockedExchangeAdd((_DWORD *)&stru_140C452E0 + 246, -WORD1(v12[-1].Blink));
Flink = (_ADAPTER_OBJECT *)v12[1].Flink;
if( Flink )
HalPutDmaAdapter(Flink);
if( v21 )
HalPutDmaAdapter((PADAPTER_OBJECT)v12[1].Blink);
ExFreePoolWithTag(&v12[-1].Blink, 0);
}
}
RtlInitUnicodeString(&DestinationString, L"Eventlog-System");
if( EtwQueryTraceHandleByLoggerName(&DestinationString, &TraceHandle) >= 0 )
{
*(&stru_140C452E0 + 612) = 1;
goto LABEL_29;
}
LABEL_49:
IopErrorLogQueueRequest();
}Referenced by:
No references.