/// <summary>
        /// Construct DIGEST_VALIDATION_RESP structure from Dpsp pass-through validation data 
        /// returned from domain controller.
        /// </summary>
        /// <param name="validationInfo">validation information 
        /// returned from domain controller in Dpsp pass-through authentication
        /// </param>
        /// <returns>DIGEST_VALIDATION_RESP structure</returns>
        /// <exception cref="ArgumentException">
        /// throw when validationInfo input is invalid.
        /// </exception>        
        public static DIGEST_VALIDATION_RESP ConvertDataToDigestValidationResponse(_NETLOGON_VALIDATION validationInfo)
        {
            if (validationInfo.ValidationGeneric2 == null)
            {
                throw new ArgumentException(
                    "ValidationGeneric2 array should not be null",
                    "validationInfo");
            }

            if (validationInfo.ValidationGeneric2[0].ValidationData == null)
            {
                throw new ArgumentException(
                    "ValidationData byte array in ValidationGeneric2 should not be null",
                    "validationInfo");
            }

            DIGEST_VALIDATION_RESP digestValidationResp = new DIGEST_VALIDATION_RESP();
            byte[] validationData = validationInfo.ValidationGeneric2[0].ValidationData;

            using (BinaryReader binaryReader = new BinaryReader(new MemoryStream(validationData)))
            {
                digestValidationResp.MessageType = (MessageType_Values)binaryReader.ReadInt32();
                digestValidationResp.Version = (Version_Values)binaryReader.ReadInt16();
                digestValidationResp.Pad2 = (Pad2_Values)binaryReader.ReadInt16();
                digestValidationResp.Status = (uint)binaryReader.ReadInt32();
                digestValidationResp.SessionKeyLength = (ushort)binaryReader.ReadInt16();

                digestValidationResp.Pad3 = (Pad3_Values)binaryReader.ReadInt16();
                digestValidationResp.AuthDataSize = (uint)binaryReader.ReadInt32();
                digestValidationResp.AcctNameSize = (ushort)binaryReader.ReadInt16();
                digestValidationResp.Reserved1 = (Reserved1_Values)binaryReader.ReadInt16();
                digestValidationResp.MessageSize = (uint)binaryReader.ReadInt32();

                digestValidationResp.Reserved3 = (Reserved3_Values)binaryReader.ReadInt32();
                digestValidationResp.SessionKey = binaryReader.ReadBytes(DIGEST_SESSION_KEY_LENGTH);
                digestValidationResp.SessionKey_NULL_terminator =
                    (SessionKey_NULL_terminator_Values)binaryReader.ReadByte();
                digestValidationResp.Pad4 = new Pad4_Values[DIGEST_VALIDATION_RESPONSE_PAD4_LENGTH];
                byte[] pad4Data = binaryReader.ReadBytes(DIGEST_VALIDATION_RESPONSE_PAD4_LENGTH);
                for (int i = 0; i < DIGEST_VALIDATION_RESPONSE_PAD4_LENGTH; i++)
                {
                    digestValidationResp.Pad4[i] = (Pad4_Values)pad4Data[i];
                }
                digestValidationResp.Pad1 = (Pad1_Values)binaryReader.ReadInt64();
                digestValidationResp.AuthData = binaryReader.ReadBytes((int)digestValidationResp.AuthDataSize);
                digestValidationResp.AccountName = binaryReader.ReadBytes((int)digestValidationResp.AcctNameSize);
            }

            return digestValidationResp;
        }