LZNT1DecompressChunkNewThread

NTSTATUS __stdcall LZNT1DecompressChunkNewThread(
        _ASYNC_DECOMPRESS_CONTEXT *AsyncDecompressContext,
        UINT8 *UncompressedBuffer,
        UINT8 *EndOfUncompressedBufferPlus1,
        UINT8 *CompressedBuffer,
        UINT8 *EndOfCompressedBufferPlus1,
        UINT64 ExplicitChunkSize){
  _WORK_QUEUE_ITEM *v10; 
  _WORK_QUEUE_ITEM *v11; 
  UINT8 *v12; 
  int v13; 
  INT32 FinalUncompressedChunkSize; 

  FinalUncompressedChunkSize = 0;
  if( (unsigned __int64)UncompressedBuffer <= 0x7FFFFFFF0000i64 )
    return LZNT1DecompressChunk(
             UncompressedBuffer,
             EndOfUncompressedBufferPlus1,
             CompressedBuffer,
             (INT64)EndOfCompressedBufferPlus1,
             &FinalUncompressedChunkSize);
  if( (unsigned __int64)CompressedBuffer <= 0x7FFFFFFF0000i64 )
    return LZNT1DecompressChunk(
             UncompressedBuffer,
             EndOfUncompressedBufferPlus1,
             CompressedBuffer,
             (INT64)EndOfCompressedBufferPlus1,
             &FinalUncompressedChunkSize);
  if( EndOfUncompressedBufferPlus1 - UncompressedBuffer < (int)ExplicitChunkSize )
    return LZNT1DecompressChunk(
             UncompressedBuffer,
             EndOfUncompressedBufferPlus1,
             CompressedBuffer,
             (INT64)EndOfCompressedBufferPlus1,
             &FinalUncompressedChunkSize);
  v10 = (_WORK_QUEUE_ITEM *)ExAllocateFromNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable
                                                                                       + 680));
  v11 = v10;
  if( !v10 )
    return LZNT1DecompressChunk(
             UncompressedBuffer,
             EndOfUncompressedBufferPlus1,
             CompressedBuffer,
             (INT64)EndOfCompressedBufferPlus1,
             &FinalUncompressedChunkSize);
  v10->List.Flink = 0i64;
  v12 = EndOfCompressedBufferPlus1;
  v10->WorkerRoutine = (void(__fastcall *)(void *))LZNT1DecompressChunkWorkItem;
  v10->Parameter = v10;
  v10[1].Parameter = v12;
  v10[2].List.Flink = (_LIST_ENTRY *)&v10[2].List.Blink;
  v10[1].List.Flink = (_LIST_ENTRY *)UncompressedBuffer;
  v10[1].List.Blink = (_LIST_ENTRY *)EndOfUncompressedBufferPlus1;
  v10[1].WorkerRoutine = (void(__fastcall *)(void *))CompressedBuffer;
  v10[2].WorkerRoutine = (void(__fastcall *)(void *))AsyncDecompressContext;
  _InterlockedIncrement((volatile signed __int32 *)&AsyncDecompressContext[1]);
  KeQueryPriorityThread((_ETHREAD *)KeGetCurrentThread());
  ExQueueWorkItem(v11, (_WORK_QUEUE_TYPE)(v13 + 32));
  return 0;
}

Referenced by:

RtlDecompressBufferLZNT1
RtlDecompressFragmentLZNT1