static PQUERY_KEY LoadMultipleBlobs(LPBYTE pbLineBegin, LPBYTE pbLineEnd, DWORD * pdwBlobCount) { PQUERY_KEY pBlobArray = NULL; LPBYTE pbBuffer = NULL; DWORD dwBlobCount = GetBlobCount(pbLineBegin, pbLineEnd); int nError; // Only if there is at least 1 blob if(dwBlobCount != 0) { // Allocate the array of blobs pBlobArray = CASC_ALLOC(QUERY_KEY, dwBlobCount); if(pBlobArray != NULL) { // Zero the blob array memset(pBlobArray, 0, dwBlobCount * sizeof(QUERY_KEY)); // Allocate buffer for the blobs pbBuffer = CASC_ALLOC(BYTE, dwBlobCount * MAX_CASC_KEY_LENGTH); if(pbBuffer != NULL) { // Zero the buffer memset(pbBuffer, 0, dwBlobCount * MAX_CASC_KEY_LENGTH); // Load the entire blob array nError = LoadBlobArray(pBlobArray, dwBlobCount, pbLineBegin, pbLineEnd, pbBuffer, dwBlobCount * MAX_CASC_KEY_LENGTH); if(nError == ERROR_SUCCESS) { *pdwBlobCount = dwBlobCount; return pBlobArray; } // Free the buffer CASC_FREE(pbBuffer); } // Free the array of blobs CASC_FREE(pBlobArray); pBlobArray = NULL; } // Reset the blob count dwBlobCount = 0; } *pdwBlobCount = dwBlobCount; return pBlobArray; }
static int LoadSingleBlob(PQUERY_KEY pBlob, LPBYTE pbBlobBegin, LPBYTE pbBlobEnd) { LPBYTE pbBuffer; size_t nLength = (pbBlobEnd - pbBlobBegin) / 2; // Check maximum size if(nLength > MAX_CASC_KEY_LENGTH) return ERROR_INVALID_PARAMETER; // Allocate the blob buffer pbBuffer = CASC_ALLOC(BYTE, MAX_CASC_KEY_LENGTH); if(pbBuffer == NULL) return ERROR_NOT_ENOUGH_MEMORY; return LoadBlobArray(pBlob, 1, pbBlobBegin, pbBlobEnd, pbBuffer, MAX_CASC_KEY_LENGTH); }
static int LoadMultipleBlobs(PQUERY_KEY pBlob, const char * szLineBegin, const char * szLineEnd, DWORD dwBlobCount) { size_t nLength = (szLineEnd - szLineBegin); // We expect each blob to have length of the encoding key and one space between if(nLength > (dwBlobCount * MD5_STRING_SIZE) + ((dwBlobCount - 1) * sizeof(char))) return ERROR_INVALID_PARAMETER; // Allocate the blob buffer pBlob->pbData = CASC_ALLOC(BYTE, dwBlobCount * MD5_HASH_SIZE); if(pBlob->pbData == NULL) return ERROR_NOT_ENOUGH_MEMORY; // Set the buffer size and load the blob array pBlob->cbData = dwBlobCount * MD5_HASH_SIZE; return LoadBlobArray(pBlob, szLineBegin, szLineEnd, dwBlobCount); }