Export (0) Print
Expand All

4.1.10.6.18 DecompressMessage

procedure DecompressMessage(
  pInBuffer: sequence of BYTE,
  cbInBufferCompress: DWORD,
  cbInBufferDecompress: DWORD,
  DRS_COMP_ALG_TYPE: compressionAlg
  ref pOutputBuffer: sequence of BYTE)

Informative summary of behavior: Compression subdivides a data stream into sequences of bytes called chunks. The DecompressMessage procedure decompresses the data stream.

The following table identifies the chunk size for each algorithm type.

Algorithm

Chunk size

COMP_ALG_NONE

Not applicable

COMP_ALG_MSZIP

32768

COMP_ALG_W2K3

65536

Each chunk in the compressed byte sequence is represented by means of a COMPRESSED_DATA structure.

pInBlock: ADDRESS OF COMPRESSED_DATA
cbInputProcessed: DWORD
cbDecompressedData: DWORD

if (cbInBufferCompress = cbInBufferDecompress) then
  /* No decompression required here. */
  pOutBuffer := pInBuffer
  cbOutBuffer := cbInBufferDeCompress
else
  cbInputProcessed := 0
  while (cbInputProcessed ≤ cbInBufferCompress)
      pInBlock :=  ADR(pInputBuffer[cbInputProcessed])
      if (pInBlock^.cbDecompressedSize = 
            pInBlock^.cbCompressedSize) then
        pDecompressedData := pInBlock^.data
        cbDecompressedData := pInBlock^.cbDecompressedSize
      else
        if (compressionAlg = DRS_COMP_ALG_MSZIP) then
          pDecompressedData := 
            Decompress pInBlock^.data in accordance
            with [RFC1951]. 
        else
          pDecompressedData := new sequence of BYTE of length 
                               pInBlock^.cbDecompressedSize 
          CompressOrDecompressWin2k3(pInBlock^.data,
              pInBlock^.cbDecompressedSize,
              pDecompressedData, FALSE)
        endif
        cbDecompressedData := pInBlock^.cbDecompressedSize
      endif
      pOutputBuffer := Append sequence of BYTE pDeCompressedData of
                       size cbDecompressedData to sequence of BYTE 
                       pOutputBuffer
      cbOutputBuffer := 
          cbOutputBuffer + pInBlock^.cbDecompressedSize 
      cbInputProcessed := cbInputProcessed + 
                          pInBlock^.cbCompressedSize
      Round up value in cbInputProcessed such that 
        ADR(pInBlock[cbInputProcessed]) align on double word 
        boundary.
  endwhile
endif
 
Show:
© 2014 Microsoft