다음을 통해 공유


IWMDMOperation::TransferObjectData 메서드(mswmdm.h)

TransferObjectData 메서드는 애플리케이션이 컴퓨터와 데이터 블록을 전송할 수 있도록 하기 위해 호출됩니다.

구문

HRESULT TransferObjectData(
  BYTE     *pData,
  DWORD    *pdwSize,
  BYTE [8] abMac
);

매개 변수

pData

데이터를 포함하는 버퍼에 대한 포인터입니다. 이 버퍼는 항상 Windows Media 장치 관리자 할당되고 해제됩니다. 애플리케이션은 이 버퍼를 할당하거나 해제해서는 안 됩니다.

BeginRead[in] 디바이스에서 읽는 동안 CSecureChannelClient::D ecryptParam 메서드를 사용하여 암호를 해독해야 하는 들어오는 데이터입니다. 애플리케이션은 버퍼의 할당을 취소할 필요가 없습니다.

BeginWrite[in, out] 디바이스에 쓰는 동안 입력 시 windows Media 장치 관리자 할당된 메모리 버퍼 pdwSize 바이트 길이입니다. 애플리케이션은 CSecureChannelClient::EncryptParam 메서드를 사용하여 암호화된 데이터로 이 버퍼를 채워야 합니다.

pdwSize

전송 버퍼 크기를 지정하는 DWORD 에 대한 포인터입니다.

BeginRead[in, out] 입력 시 pData에서 들어오는 데이터의 크기입니다. 출력에서 애플리케이션이 실제로 읽은 데이터의 양입니다.

BeginWriteOn 입력, pData 버퍼의 크기입니다. 출력에서 전송된 데이터의 실제 크기입니다.

abMac

이 메서드의 매개 변수 데이터에 대한 메시지 인증 코드를 지정하는 바이트 배열입니다.

BeginRead[in] pData에서 생성된 MAC 및 pdwSizepData가 암호 해독된 후 애플리케이션이 검사 데이터가 수정되지 않은지 확인합니다.

BeginWrite[out] pData가 암호화되기 전에pData 및 pdwSize에서 생성된 MAC입니다.

반환 값

애플리케이션은 다음 HRESULT 값 중 하나를 반환해야 합니다.

반환 코드 Description
S_OK
읽기 작업은 계속되어야 합니다.
WMDM_E_USER_CANCELLED
읽기 작업은 완료하지 않고 취소해야 합니다.
E_FAIL
지정되지 않은 오류가 발생했으며 읽기 작업을 완료하지 않고 취소해야 합니다.

설명

애플리케이션은 이 메서드가 호출되기 직전에 BeginRead 또는 BeginWrite 가 호출되었는지 여부를 모니터링하여 데이터를 디바이스에서 읽거나 디바이스에 쓸지 여부를 확인할 수 있습니다.

예제

다음 C++ 코드는 애플리케이션이 파일 전송 자체를 처리하기 위해 TransferObjectData 를 구현하는 방법을 보여 줍니다. 표시된 코드는 에서 데이터를 읽고 디바이스에 데이터를 쓰는 작업을 모두 처리합니다. 데이터 흐름의 방향은 beginRead 또는 BeginWrite에 대한 이전 호출에서 설정된 멤버 변수 m_OperationStatus 표시됩니다.


HRESULT TransferObjectData(BYTE* pData, DWORD* pdwSize, BYTE* pMac)
{
    HRESULT hr = S_OK;

    // Verify parameters.
    if (pData == NULL || pdwSize == NULL || pMac == NULL || m_File == INVALID_HANDLE_VALUE) 
    {
        // TODO: Display the message: "Invalid argument in SetObjectTotalSize."
        return E_INVALIDARG;
    }
    if ((m_OperationStatus != OPERATION_READ) && (m_OperationStatus != OPERATION_WRITE))
    {
        // TODO: Display the message: "Unable to determine direction of data transfer."
        return E_FAIL;
    }

    //////////////////////////////////////////////////////////////////////////
// Sending data to the device.
//////////////////////////////////////////////////////////////////////////
    if (m_OperationStatus == OPERATION_WRITE)
    {
        DWORD   dwReadLen;
        // The SAC is used to encrypt the data sent to the device.
        if (m_pSAC == NULL) 
        {
               // TODO: Display the message: "SAC not initialized in TransferObjectData."
            return E_FAIL;
        }

        // Read pdwSize bytes from the file into pData.
        dwReadLen = *pdwSize;
        if (ReadFile(m_File, pData, dwReadLen, pdwSize, NULL) == FALSE) 
        {
               // TODO: Display the message: "Couldn't read the file in TransferObjectData."
            return E_FAIL;
        }

        // If there is no more data, terminate the transfer.
        if (*pdwSize == 0)
        {
            return S_FALSE;
        }

        // Create the MAC to return to Windows Media Device Manager.
        HMAC hMAC;
        hr = m_pSAC->MACInit(&hMAC);
        hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(pData), *pdwSize);
        hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(DWORD));
        hr = m_pSAC->MACFinal(hMAC, (BYTE*)pMac);
        if (hr != S_OK) return E_FAIL;

        // Encrypt the data to send to the service provider/device.
        hr = m_pSAC->EncryptParam((BYTE*)(pData), *pdwSize);
        if (hr != S_OK) 
        {
            return E_FAIL;
        }
    }
    //////////////////////////////////////////////////////////////////////////
// Receiving data from the device.
//////////////////////////////////////////////////////////////////////////
    else 
    {
        // Copy the data to a temporary file for decryption.
        BYTE *pTmpData = new BYTE [*pdwSize];
        if (pTmpData == NULL)
        {
            return E_OUTOFMEMORY;
        }
        memcpy(pTmpData, pData, *pdwSize);

        // Decrypt the pData Parameter
        hr = m_pSAC->DecryptParam(pTmpData, *pdwSize);
        
        // Verify the MAC of the decrypted data.
        HMAC hMAC;
        BYTE pTestMac[WMDM_MAC_LENGTH];
        hr = m_pSAC->MACInit(&hMAC);
        hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(pTmpData), *pdwSize);
        hr = m_pSAC->MACUpdate(hMAC, (BYTE*)(pdwSize), sizeof(*pdwSize));
        hr = m_pSAC->MACFinal(hMAC, pTestMac);
        if ((memcmp(pMac, pTestMac, WMDM_MAC_LENGTH) != 0) || (hr != S_OK))
        {
            delete [] pTmpData;
            return WMDM_E_MAC_CHECK_FAILED;
        }

        // Write the data to file, and record the amount of data written.
        DWORD dwWritten = 0;
        if (WriteFile(m_File,pTmpData,*pdwSize,&dwWritten,NULL))
        {
            hr = S_OK;
            *pdwSize = dwWritten;
        }
        else 
        {
            hr = HRESULT_FROM_WIN32(GetLastError());
        }
        if (pTmpData)
        {
            delete [] pTmpData;
        }
    }
    return hr;
}

요구 사항

요구 사항
대상 플랫폼 Windows
헤더 mswmdm.h
라이브러리 Mssachlp.lib

추가 정보

암호화 및 암호 해독

수동으로 파일 전송 처리

IWMDMOperation 인터페이스

보안 인증 채널 사용