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