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; }
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); }