public uint ReadHash(
            SRV_READ_HASH_Request_HashType_Values hashType,
            SRV_READ_HASH_Request_HashVersion_Values hashVersion,
            SRV_READ_HASH_Request_HashRetrievalType_Values hashRetrievalType,
            ulong offset,
            uint length,
            out HASH_HEADER hashHeader,
            out byte[] hashData)
        {
            hashHeader = new HASH_HEADER();
            hashData = null;

            SRV_READ_HASH_Request readHashRequest = new SRV_READ_HASH_Request();
            readHashRequest.HashType = hashType;
            readHashRequest.HashVersion = hashVersion;
            readHashRequest.HashRetrievalType = hashRetrievalType;
            readHashRequest.Offset = offset;
            readHashRequest.Length = length;

            byte[] requestInput = TypeMarshal.ToBytes(readHashRequest);

            byte[] responseOutput;

            uint status;
            SendIoctlPayload(CtlCode_Values.FSCTL_SRV_READ_HASH, requestInput);
            ExpectIoctlPayload(out status, out responseOutput);

            if (status != Smb2Status.STATUS_SUCCESS)
                return status;

            byte[] hashHeaderDataBuffer = null;
            switch (hashRetrievalType)
            {
                case SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_HASH_BASED:
                    hashHeaderDataBuffer = TypeMarshal.ToStruct<SRV_HASH_RETRIEVE_HASH_BASED>(responseOutput).Buffer;
                    break;

                case SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_FILE_BASED:
                    hashHeaderDataBuffer = TypeMarshal.ToStruct<SRV_HASH_RETRIEVE_FILE_BASED>(responseOutput).Buffer;
                    break;

                default:
                    throw new NotImplementedException();
            }

            int hashHeaderLength = 0;
            hashHeader = TypeMarshal.ToStruct<HASH_HEADER>(hashHeaderDataBuffer, ref hashHeaderLength);
            hashData = hashHeaderDataBuffer.Skip(hashHeaderLength).ToArray();

            return status;
        }
Exemplo n.º 2
0
        private uint ReadHash(
            Smb2Client client,
            Packet_Header_Flags_Values headerFlags,
            ulong messageId,
            uint treeId,
            ulong sessionId,
            FILEID fileId,
            SRV_READ_HASH_Request_HashType_Values hashType,
            SRV_READ_HASH_Request_HashVersion_Values hashVersion,
            SRV_READ_HASH_Request_HashRetrievalType_Values hashRetrievalType,
            ulong offset,
            uint length,
            out HASH_HEADER hashHeader,
            out byte[] hashData)
        {
            hashHeader = new HASH_HEADER();
            hashData   = null;

            SRV_READ_HASH_Request readHashRequest = new SRV_READ_HASH_Request();

            readHashRequest.HashType          = hashType;
            readHashRequest.HashVersion       = hashVersion;
            readHashRequest.HashRetrievalType = hashRetrievalType;
            readHashRequest.Offset            = offset;
            readHashRequest.Length            = length;

            byte[] requestInput = TypeMarshal.ToBytes(readHashRequest);
            byte[] responseOutput;

            uint status;

            SendIoctlPayload(client, CtlCode_Values.FSCTL_SRV_READ_HASH, requestInput, Packet_Header_Flags_Values.FLAGS_SIGNED, messageId, treeId, sessionId, fileId);
            ExpectIoctlPayload(client, out status, out responseOutput);

            if (status != Smb2Status.STATUS_SUCCESS)
            {
                return(status);
            }

            byte[] hashHeaderDataBuffer = null;
            switch (hashRetrievalType)
            {
            case SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_HASH_BASED:
                hashHeaderDataBuffer = TypeMarshal.ToStruct <SRV_HASH_RETRIEVE_HASH_BASED>(responseOutput).Buffer;
                break;

            case SRV_READ_HASH_Request_HashRetrievalType_Values.SRV_HASH_RETRIEVE_FILE_BASED:
                hashHeaderDataBuffer = TypeMarshal.ToStruct <SRV_HASH_RETRIEVE_FILE_BASED>(responseOutput).Buffer;
                break;

            default:
                throw new NotImplementedException(hashRetrievalType.ToString());
            }

            int hashHeaderLength = 0;

            hashHeader = TypeMarshal.ToStruct <HASH_HEADER>(hashHeaderDataBuffer, ref hashHeaderLength);
            hashData   = hashHeaderDataBuffer.Skip(hashHeaderLength).ToArray();

            return(status);
        }