Функция 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 . |
|
Недостаточно памяти для обработки содержимого. |
Комментарии
Необходимо вызвать NCryptStreamOpenToProtect или NCryptStreamOpenToUnprotect, чтобы открыть поток перед вызовом NCryptStreamUpdate.
Сообщения могут быть настолько большими, что их одновременное обработка путем сохранения всего сообщения в памяти может оказаться сложной задачей. Однако можно обрабатывать большие сообщения путем секционирования обрабатываемых данных на управляемые блоки.
Для этого используйте NCryptStreamUpdate в цикле, который проходит через блок файла за блоком. При обработке потокового сообщения полученные выходные данные передаются приложению с помощью указанной функции обратного вызова. Процедура показана в следующем примере. Дополнительные сведения о функции обратного вызова см. в разделе PFNCryptStreamOutputCallback.
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 |
Header | ncryptprotect.h |
Библиотека | NCrypt.lib |
DLL | NCrypt.dll |