92 lines
1.5 KiB
C++
92 lines
1.5 KiB
C++
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
alloc.c
|
|
|
|
Abstract:
|
|
|
|
Generic realloc code for any api that can fail with
|
|
ERROR_INSUFFICIENT_BUFFER.
|
|
|
|
Author:
|
|
|
|
Albert Ting (AlbertT) 25-Sept-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include "alloc.hxx"
|
|
|
|
PBYTE
|
|
pAllocRead(
|
|
HANDLE hUserData,
|
|
ALLOC_FUNC AllocFunc,
|
|
DWORD dwLenHint,
|
|
PDWORD pdwLen OPTIONAL
|
|
)
|
|
{
|
|
ALLOC_DATA AllocData;
|
|
PBYTE pBufferOut = NULL;
|
|
DWORD dwLastError;
|
|
DWORD cbActual;
|
|
|
|
if( pdwLen ){
|
|
*pdwLen = 0;
|
|
}
|
|
|
|
if( !dwLenHint ){
|
|
|
|
DBGMSG( DBG_ERROR, ( "ReallocRead: dwLenHint = 0\n" ));
|
|
|
|
SetLastError( ERROR_INVALID_PARAMETER );
|
|
return FALSE;
|
|
}
|
|
|
|
AllocData.pBuffer = NULL;
|
|
AllocData.cbBuffer = dwLenHint;
|
|
|
|
for( ; ; ){
|
|
|
|
cbActual = AllocData.cbBuffer;
|
|
AllocData.pBuffer = (PBYTE)LocalAlloc( LMEM_FIXED, cbActual );
|
|
|
|
if( !AllocData.pBuffer ){
|
|
break;
|
|
}
|
|
|
|
if( !AllocFunc( hUserData, &AllocData )){
|
|
|
|
//
|
|
// Call failed.
|
|
//
|
|
dwLastError = GetLastError();
|
|
LocalFree( (HLOCAL)AllocData.pBuffer );
|
|
|
|
if( dwLastError != ERROR_INSUFFICIENT_BUFFER &&
|
|
dwLastError != ERROR_MORE_DATA ){
|
|
|
|
break;
|
|
}
|
|
} else {
|
|
|
|
pBufferOut = AllocData.pBuffer;
|
|
|
|
if( pdwLen ){
|
|
*pdwLen = cbActual;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return pBufferOut;
|
|
}
|
|
|