NCryptStreamUpdate 函数 (ncryptprotect.h)
NCryptStreamUpdate 函数加密和解密数据块。
语法
SECURITY_STATUS NCryptStreamUpdate(
[in] NCRYPT_STREAM_HANDLE hStream,
[in] const BYTE *pbData,
SIZE_T cbData,
BOOL fFinal
);
参数
[in] hStream
通过调用 NCryptStreamOpenToProtect 或 NCryptStreamOpenToUnprotect 创建的流对象的句柄。
[in] pbData
指向要处理的字节数组的指针。
cbData
pbData 参数指定的二进制数组中的字节数。
fFinal
一个布尔值,指定是否已处理最后一个数据块。
返回值
返回指示函数成功或失败的状态代码。 可能的返回代码包括但不限于以下内容。
返回代码 | 说明 |
---|---|
|
函数成功。 |
|
无法解码内容。 |
|
hStream 参数指向的流句柄无效。 |
|
内存不足,无法处理内容。 |
注解
在调用 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 |