Funzione NCryptStreamUpdate (ncryptprotect.h)

La funzione NCryptStreamUpdate crittografa e decrittografa i blocchi di dati.

Sintassi

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

Parametri

[in] hStream

Gestire l'oggetto di flusso creato chiamando NCryptStreamOpenToProtect o NCryptStreamOpenToUnprotect.

[in] pbData

Puntatore alla matrice di byte da elaborare.

cbData

Numero di byte nella matrice binaria specificata dal parametro pbData .

fFinal

Valore booleano che specifica se l'ultimo blocco di dati è stato elaborato.

Valore restituito

Restituisce un codice di stato che indica l'esito positivo o negativo della funzione. I codici restituiti possibili includono, ma non sono limitati a, i seguenti.

Codice restituito Descrizione
ERROR_SUCCESS
La funzione ha avuto esito positivo.
NTE_BAD_DATA
Impossibile decodificare il contenuto.
NTE_INVALID_HANDLE
L'handle di flusso a cui punta il parametro hStream non è valido.
NTE_NO_MEMORY
Memoria insufficiente disponibile per elaborare il contenuto.

Commenti

È necessario chiamare NCryptStreamOpenToProtect o NCryptStreamOpenToUnprotect per aprire un flusso prima di chiamare NCryptStreamUpdate

I messaggi possono essere così grandi che elaborarli tutti contemporaneamente archiviando l'intero messaggio in memoria può essere difficile. È tuttavia possibile elaborare messaggi di grandi dimensioni partizionando i dati da elaborare in blocchi gestibili.

A tale scopo, usare NCryptStreamUpdate in un ciclo che avanza attraverso il blocco di file per blocco. Quando viene elaborato il messaggio in flusso, i dati di output risultanti vengono passati all'applicazione usando una funzione di callback specificata. come nell'esempio seguente. Per altre informazioni sulla funzione di callback, vedere PFNCryptStreamOutputCallback.

Nota È consigliabile usare dimensioni troppo piccole di un blocco. I blocchi di piccole dimensioni richiedono più chiamate e quindi un sovraccarico più chiamante. Inoltre, le API di streaming sono ottimizzate per blocchi più grandi. È consigliabile sperimentare per trovare le dimensioni del blocco migliori per i dati che è necessario elaborare.
 
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;
    }

Requisiti

Requisito Valore
Client minimo supportato Windows 8 [solo app desktop]
Server minimo supportato Windows Server 2012 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione ncryptprotect.h
Libreria NCrypt.lib
DLL NCrypt.dll

Vedi anche

Funzioni DPAPI CNG

NCRYPT_PROTECT_STREAM_INFO

NCryptStreamOpenToProtect

NCryptStreamOpenToUnprotect