LZNT1DecompressChunkNewThread
NTSTATUS __fastcall LZNT1DecompressChunkNewThread(
INT64 a1,
BYTE *a2,
BYTE *a3,
BYTE *a4,
INT64 EndOfCompressedBufferPlus1,
INT64 a6){
WORK_QUEUE_ITEM *v10;
WORK_QUEUE_ITEM *v11;
INT64 v12;
NTSTATUS PriorityThread;
INT32 FinalUncompressedChunkSize;
FinalUncompressedChunkSize = 0;
if( (unsigned __int64)a2 <= 0x7FFFFFFF0000i64 )
return LZNT1DecompressChunk(a2, a3, a4, EndOfCompressedBufferPlus1, &FinalUncompressedChunkSize);
if( (unsigned __int64)a4 <= 0x7FFFFFFF0000i64 )
return LZNT1DecompressChunk(a2, a3, a4, EndOfCompressedBufferPlus1, &FinalUncompressedChunkSize);
if( a3 - a2 < (int)a6 )
return LZNT1DecompressChunk(a2, a3, a4, EndOfCompressedBufferPlus1, &FinalUncompressedChunkSize);
LODWORD(v10) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)RtlLznt1DecompressChunkLookaside);
v11 = v10;
if( !v10 )
return LZNT1DecompressChunk(a2, a3, a4, EndOfCompressedBufferPlus1, &FinalUncompressedChunkSize);
v10->List.Flink = 0i64;
v12 = EndOfCompressedBufferPlus1;
v10->WorkerRoutine = (void(__fastcall *)(void *))LZNT1DecompressChunkWorkItem;
v10->Parameter = v10;
v10[1].Parameter = (void *)v12;
v10[2].List.Flink = (_LIST_ENTRY *)&v10[2].List.Blink;
v10[1].List.Flink = (_LIST_ENTRY *)a2;
v10[1].List.Blink = (_LIST_ENTRY *)a3;
v10[1].WorkerRoutine = (void(__fastcall *)(void *))a4;
v10[2].WorkerRoutine = (void(__fastcall *)(void *))a1;
_InterlockedIncrement((volatile signed __int32 *)(a1 + 24));
PriorityThread = KeQueryPriorityThread(KeGetCurrentThread());
ExQueueWorkItem(v11, (WORK_QUEUE_TYPE)(PriorityThread + 32));
return 0;
}Referenced by:
RtlDecompressBufferLZNT1
RtlDecompressFragmentLZNT1