Beispiel #1
0
        public void BVT_ChangeTracking()
        {
            // The log file used in change tracking request must be an existing file.
            // So create one file before running the case.
            string logFileName = string.Format("log_{0}.txt", System.Guid.NewGuid());

            sutProtocolController.CreateFile(TestConfig.FullPathShareContainingSharedVHD, logFileName, "");

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "1.	Client opens a shared virtual disk file and expects success.");
            OpenSharedVHD(TestConfig.NameOfSharedVHDS, RSVD_PROTOCOL_VERSION.RSVD_PROTOCOL_VERSION_2);

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "2.	Client sends the tunnel operation SVHDX_CHANGE_TRACKING_START_REQUEST to start change tracking.");
            SVHDX_CHANGE_TRACKING_START_REQUEST request = new SVHDX_CHANGE_TRACKING_START_REQUEST();

            request.TransactionId     = System.Guid.NewGuid();
            request.LogFileId         = System.Guid.NewGuid();
            request.LogFileNameOffset = 56;
            request.LogFileName       = logFileName;
            request.LogFileNameLength = (uint)(request.LogFileName.Length + 1) * 2;
            byte[] payload = client.CreateChangeTrackingStartRequest(request);
            SVHDX_TUNNEL_OPERATION_HEADER?header;
            SVHDX_TUNNEL_OPERATION_HEADER?response;
            //For RSVD_TUNNEL_META_OPERATION_START operation code, the IOCTL code should be FSCTL_SVHDX_ASYNC_TUNNEL_REQUEST
            uint status = client.TunnelOperation <SVHDX_TUNNEL_OPERATION_HEADER>(
                false,//true for Async operation, false for non-async operation
                RSVD_TUNNEL_OPERATION_CODE.RSVD_TUNNEL_CHANGE_TRACKING_START,
                ++RequestIdentifier,
                payload,
                out header,
                out response);

            BaseTestSite.Assert.AreEqual(
                (uint)Smb2Status.STATUS_SUCCESS,
                status,
                "Ioctl should succeed, actual status: {0}",
                GetStatus(status));
            VerifyTunnelOperationHeader(header.Value, RSVD_TUNNEL_OPERATION_CODE.RSVD_TUNNEL_CHANGE_TRACKING_START, (uint)RsvdStatus.STATUS_SVHDX_SUCCESS, RequestIdentifier);

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "3.	Client sends Write request to change the vhds file.");
            payload = Smb2Utility.CreateRandomByteArray(512);
            status  = client.Write(0, payload);

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "4.	Client sends the tunnel operation RSVD_TUNNEL_CHANGE_TRACKING_GET_PARAMETERS to get the change tracking status.");
            SVHDX_CHANGE_TRACKING_GET_PARAMETERS_RESPONSE?getParamResponse;

            status = client.TunnelOperation <SVHDX_CHANGE_TRACKING_GET_PARAMETERS_RESPONSE>(
                false,//true for Async operation, false for non-async operation
                RSVD_TUNNEL_OPERATION_CODE.RSVD_TUNNEL_CHANGE_TRACKING_GET_PARAMETERS,
                ++RequestIdentifier,
                null,
                out header,
                out getParamResponse);

            VerifyTunnelOperationHeader(header.Value, RSVD_TUNNEL_OPERATION_CODE.RSVD_TUNNEL_CHANGE_TRACKING_GET_PARAMETERS, (uint)RsvdStatus.STATUS_SVHDX_SUCCESS, RequestIdentifier);
            BaseTestSite.Assert.AreEqual(
                RsvdStatus.STATUS_SVHDX_SUCCESS,
                (RsvdStatus)getParamResponse.Value.ChangeTrackingStatus,
                "Status of change tracking should be STATUS_SVHDX_SUCCESS.");

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "5.	Client sends the tunnel operation SVHDX_CHANGE_TRACKING_STOP_REQUEST to stop change tracking.");
            status = client.TunnelOperation <SVHDX_TUNNEL_OPERATION_HEADER>(
                false,//true for Async operation, false for non-async operation
                RSVD_TUNNEL_OPERATION_CODE.RSVD_TUNNEL_CHANGE_TRACKING_STOP,
                ++RequestIdentifier,
                null,
                out header,
                out response);
            VerifyTunnelOperationHeader(header.Value, RSVD_TUNNEL_OPERATION_CODE.RSVD_TUNNEL_CHANGE_TRACKING_STOP, (uint)RsvdStatus.STATUS_SVHDX_SUCCESS, RequestIdentifier);

            BaseTestSite.Log.Add(LogEntryKind.TestStep, "6.	Client closes the file.");
            client.CloseSharedVirtualDisk();
        }
 /// <summary>
 /// Marshal an SVHDX_CHANGE_TRACKING_START_REQUEST structure
 /// </summary>
 /// <param name="request">SVHDX_CHANGE_TRACKING_START_REQUEST structure</param>
 /// <returns>The marshalled byte array</returns>
 public byte[] CreateChangeTrackingStartRequest(SVHDX_CHANGE_TRACKING_START_REQUEST request)
 {
     return(TypeMarshal.ToBytes(request));
 }