DbgkCaptureLiveDump
NTSTATUS __stdcall DbgkCaptureLiveDump(
_SYSDBG_TRIAGE_DUMP *TriageDumpRequest,
VOID *DumpBuffer,
UINT64 DumpBufferLength,
VOID *BufferUsed){
unsigned int v4;
unsigned __int64 v7;
_ETHREAD *v8;
PEPROCESS v9;
VOID **PoolWithTag;
UINT64 v11;
int v12;
__int64 v13;
NTSTATUS v14;
unsigned int i;
__int64 v16;
__int64 v17;
__int64 v18;
VOID *v19;
NTSTATUS v20;
UINT64 v21;
int v22;
char v23;
PEPROCESS v24;
int v25;
UINT64 v26;
char AccessMode;
char v29;
unsigned __int64 RegHandle;
PVOID Object;
VOID *InDumpCopy;
__int128 Buffer;
VOID *v34;
_DUMP_FILE_DESCRIPTOR DumpFile[2584];
INT64 a2[2];
v4 = DumpBufferLength;
v34 = BufferUsed;
v7 = 0i64;
AccessMode = KeGetCurrentThread()->PreviousMode;
v8 = 0i64;
v9 = 0i64;
memset(DumpFile, 0i64, sizeof(DumpFile));
PoolWithTag = 0i64;
InDumpCopy = 0i64;
*(_OWORD *)a2 = 0i64;
RegHandle = 0i64;
Buffer = 0i64;
if( !TriageDumpRequest[11] || v4 < 0x40000 || (*TriageDumpRequest & 0xFFFFFFFE) != 0 )
return -1073741811;
if( DbgkpLkmdSqmIsOptedIn() )
{
EtwRegister((_LPCGUID)&CmFcpWnfTypeId.TypeId[1], 0i64, 0i64, &RegHandle);
v7 = RegHandle;
if( RegHandle )
DbgkpLkmdSqmIncrementDword(RegHandle, 0xCDCui64, v11);
}
memset(&DumpFile[2560], 0, 48);
v12 = DbgkpTriageDumpInitialize(
(__int64)&DumpFile[2560],
(__int64)DumpBuffer,
v4,
(INT64(__stdcall **)(VOID *, UINT64, UINT64, UINT64, UINT64, UINT64))&DumpFile[2572]);
v13 = 0i64;
v14 = v12;
if( v12 >= 0 )
{
v14 = (*(__int64(__fastcall **)(_DUMP_FILE_DESCRIPTOR *, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD))&DumpFile[2572])(
&DumpFile[2560],
(unsigned int)TriageDumpRequest[1],
*((_QWORD *)TriageDumpRequest + 1),
*((_QWORD *)TriageDumpRequest + 2),
*((_QWORD *)TriageDumpRequest + 3),
*((_QWORD *)TriageDumpRequest + 4));
if( v14 >= 0 )
{
DbgkpLkmdSnapGlobals(DumpFile);
LODWORD(RegHandle) = 4 * TriageDumpRequest[11] + 4;
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)RegHandle, 1884181323i64);
if( PoolWithTag )
{
for( i = 0; i < TriageDumpRequest[11]; *((_DWORD *)PoolWithTag + v16) = -1073741823 )
v16 = i++;
*((_DWORD *)PoolWithTag + i) = 1112752980;
}
v14 = -1073741790;
v29 = 1;
if( TriageDumpRequest[11] )
{
while( 1 )
{
v17 = *((_QWORD *)TriageDumpRequest + 6);
v18 = (unsigned int)(v13 + TriageDumpRequest[10]);
a2[1] = 0i64;
a2[0] = 3221225473i64;
v19 = *(VOID **)(v17 + 8 * v18);
Object = 0i64;
v20 = ObReferenceObjectByHandle(v19, 0x1FFFFFui64, (_OBJECT_TYPE *)PsThreadType, AccessMode, &Object, 0i64);
v8 = (_ETHREAD *)Object;
v22 = v20;
v23 = v29;
if( v22 != -1073741790 )
v23 = 0;
v29 = v23;
if( v22 >= 0 )
{
if( !v9 )
{
v24 = IoThreadToProcess((PETHREAD)Object);
v9 = v24;
if( v24 )
{
ObfReferenceObjectWithTag(v24, 0x4C676244ui64);
DbgkpLkmdSnapDataEx(DumpFile, v9, 0xA40ui64, ClassProcess, 0i64, 0i64);
}
}
v25 = DbgkpLkmdSnapThread((__int64)DumpFile, (__int64)TriageDumpRequest, v8, (__int64)a2);
if( !v25 )
v25 = a2[0];
if( PoolWithTag )
*((_DWORD *)PoolWithTag + v13) = v25;
DbgkpLkmdFireCallbacks(DumpFile, 2ui64, v8);
if( v7 )
DbgkpLkmdSqmStatus(v7, a2, v26);
HalPutDmaAdapter((PADAPTER_OBJECT)v8);
v8 = 0i64;
if( LODWORD(a2[0]) == -1073741670 )
{
LABEL_32:
if( !v29 )
{
if( v9 )
DbgkpLkmdFireCallbacks(DumpFile, 1ui64, v9);
LODWORD(Buffer) = TriageDumpRequest[11];
*((_QWORD *)&Buffer + 1) = PoolWithTag;
DbgkpLkmdSnapData(DumpFile, &Buffer, 0x10ui64);
if( PoolWithTag )
DbgkpLkmdSnapData(DumpFile, PoolWithTag, (unsigned int)RegHandle);
if( DbgkpLkmdSnapDataEx(
DumpFile,
&DbgkpLkmdLiveDumpDiagnosticInformation,
8ui64,
ClassUnknown,
0i64,
&InDumpCopy) >= 0 )
*(_QWORD *)InDumpCopy = &Buffer;
v14 = (*(__int64(__fastcall **)(_DUMP_FILE_DESCRIPTOR *, VOID *))&DumpFile[2582])(&DumpFile[2560], v34);
}
break;
}
}
else
{
if( PoolWithTag )
*((_DWORD *)PoolWithTag + v13) = v22;
if( v7 )
{
LODWORD(a2[0]) = v22;
DbgkpLkmdSqmStatus(v7, a2, v21);
}
}
v13 = (unsigned int)(v13 + 1);
if( (unsigned int)v13 >= TriageDumpRequest[11] )
goto LABEL_32;
}
}
if( v9 )
ObfDereferenceObjectWithTag(v9, 0x4C676244ui64);
if( v8 )
HalPutDmaAdapter((PADAPTER_OBJECT)v8);
}
}
if( *(_QWORD *)&DumpFile[2568] )
ExFreePoolWithTag(*(PVOID *)&DumpFile[2568], 0x4D574454u);
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x704E534Bu);
if( v7 )
EtwUnregister(v7);
return v14;
}Referenced by:
NtSystemDebugControl