windows-nt/Source/XPSP1/NT/base/cluster/clusrtl/rpc.c
2020-09-26 16:20:57 +08:00

99 lines
1.7 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
rpc.c
Abstract:
Handy utility functions for supporting RPC
Author:
John Vert (jvert) 2-Jan-1996
Revision History:
--*/
#include "clusrtlp.h"
#include "rpc.h"
void __RPC_FAR * __RPC_API MIDL_user_allocate(size_t len)
{
return(LocalAlloc(LMEM_FIXED, len));
}
void __RPC_API MIDL_user_free(void __RPC_FAR * ptr)
{
LocalFree(ptr);
}
LPWSTR
ClRtlMakeGuid(
VOID
)
/*++
Routine Description:
Creates a new GUID in string form.
Arguments:
None.
Return Value:
A pointer to the GUID string if successful.
NULL if unsuccessful.
Notes:
The storage for the GUID string must be freed by the caller.
Sometimes, the GUID storage is copied to a buffer that is
allocated using another allocator. At that point, the free
routines can't tell where free method to call. Sometimes this
causes a problem. To get around this problem, antoher buffer
is allocated such that the free methods will always work.
--*/
{
DWORD sc;
UUID guid;
LPWSTR guidString = NULL;
LPWSTR guidBuffer = NULL;
sc = UuidCreate( &guid );
if ( ( sc != RPC_S_OK ) && ( sc != RPC_S_UUID_LOCAL_ONLY ) )
goto Error;
sc = UuidToString( &guid, &guidString );
if ( sc != RPC_S_OK )
goto Error;
guidBuffer = LocalAlloc( LMEM_FIXED, ( wcslen( guidString ) + 1 ) * sizeof( WCHAR ) );
if ( guidBuffer == NULL )
goto Error;
wcscpy( guidBuffer, guidString );
goto Cleanup;
Error:
SetLastError( sc );
Cleanup:
if ( guidString != NULL )
{
RpcStringFree( &guidString );
} // if:
return( guidBuffer );
} // ClRtlMakeGuid