NCryptStreamUpdate 函数 (ncryptprotect.h)

NCryptStreamUpdate 函数加密和解密数据块。

语法

SECURITY_STATUS NCryptStreamUpdate(
  [in] NCRYPT_STREAM_HANDLE hStream,
  [in] const BYTE           *pbData,
       SIZE_T               cbData,
       BOOL                 fFinal
);

参数

[in] hStream

通过调用 NCryptStreamOpenToProtectNCryptStreamOpenToUnprotect 创建的流对象的句柄。

[in] pbData

指向要处理的字节数组的指针。

cbData

pbData 参数指定的二进制数组中的字节数。

fFinal

一个布尔值,指定是否已处理最后一个数据块。

返回值

返回指示函数成功或失败的状态代码。 可能的返回代码包括但不限于以下内容。

返回代码 说明
ERROR_SUCCESS
函数成功。
NTE_BAD_DATA
无法解码内容。
NTE_INVALID_HANDLE
hStream 参数指向的流句柄无效。
NTE_NO_MEMORY
内存不足,无法处理内容。

注解

在调用 NCryptStreamUpdate 之前,必须调用 NCryptStreamOpenToProtect 或 NCryptStreamOpenToUnprotect 以打开流

消息可能非常大,以至于通过将整个消息存储在内存中来一次性处理它们可能很困难。 但是,通过将要处理的数据分区为可管理的块,可以处理大型消息。

为此,请在逐个块推进文件块的循环中使用 NCryptStreamUpdate 。 处理流式处理的消息时,使用指定的回调函数将生成的输出数据传回应用程序。 下面的示例对此进行了展示。 有关回调函数的详细信息,请参阅 PFNCryptStreamOutputCallback

注意 建议不要使用过小的块大小。 小块需要更多的调用,因此需要更多的调用开销。 此外,流式处理 API 针对较大的块进行优化。 应尝试为必须处理的数据找到最佳块大小。
 
BOOL                        fFinal = FALSE;
PBYTE                       pbBuf = NULL;

// Determine the number of bytes to read.
DWORD cbData = GetFileSize( hFileIn, NULL );

// Call NCryptStreamUpdate while there is data left to read.
while(FALSE == fFinal)
{
    // Read dwBlockSize bytes from the file.
    if(dwBlockSize > 1)
    {
        if( !ReadFile(hFileIn, pbBuf, dwBlockSize, &cbResult, NULL) )
        {
            hr = HRESULT_FROM_WIN32(hr);            
            goto CleanUp;
        }
    }

    // Decrement the number of bytes to read by the current amount read.
    cbData -= cbResult;

    // Set fFinal if there are no bytes left to read.
    if (cbData <= 0) fFinal = TRUE;

    // Encrypt (or decrypt) the bytes pointed to by pbBuf
    hr = NCryptStreamUpdate(hStream, pbBuf, cbResult, fFinal); 
    if( FAILED(hr) )
    {            
        goto CleanUp;
    }         
}      

CleanUp:
    if( NULL != hStream )
    {
        NCryptStreamClose(hStream);
    }
    if( NULL != hDescriptor )
    {
        NCryptCloseProtectionDescriptor( hDescriptor );
    }
    if(NULL != pbBuf)
    {
        LocalFree(pbBuf);
        pbBuf = NULL;
    }

要求

要求
最低受支持的客户端 Windows 8 [仅限桌面应用]
最低受支持的服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows
标头 ncryptprotect.h
Library NCrypt.lib
DLL NCrypt.dll

另请参阅

CNG DPAPI 函数

NCRYPT_PROTECT_STREAM_INFO

NCryptStreamOpenToProtect

NCryptStreamOpenToUnprotect