windows-nt/Source/XPSP1/NT/com/rpc/locator/client/util.cxx

349 lines
6.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (C) Microsoft Corporation, 1992 - 1999
Module Name:
util.cxx
Abstract:
This module contains utility functions used by the NSI client wrappers.
Author:
Steven Zeck (stevez) 03/27/92
--*/
#include <nsi.h>
#include <memory.h>
#include <string.h>
#include <stdio.h>
#ifndef WIN32
extern "C"
{
int atoi(char *);
void far pascal OutputDebugString(void far *);
void __RPC_FAR * __RPC_API
MIDL_user_allocate(
size_t cb
);
void __RPC_API
MIDL_user_free(
void __RPC_FAR * p
);
}
#else
#include <stdlib.h>
#endif
RPC_STATUS NsiToRpcStatus[] =
{
RPC_S_OK, // NSI_S_OK
RPC_S_NO_MORE_BINDINGS, // NSI_S_NO_MORE_BINDINGS
RPC_S_INTERFACE_NOT_FOUND, // NSI_S_INTERFACE_NOT_FOUND
RPC_S_ENTRY_NOT_FOUND, // NSI_S_ENTRY_NOT_FOUND
RPC_S_NAME_SERVICE_UNAVAILABLE,// NSI_S_NAME_SERVICE_UNAVAILABLE
RPC_S_ACCESS_DENIED, // NSI_S_NO_NS_PRIVILEGE
RPC_S_UNSUPPORTED_NAME_SYNTAX, // NSI_S_UNSUPPORTED_NAME_SYNTAX
RPC_S_NOT_ALL_OBJS_UNEXPORTED, // NSI_S_NOTHING_TO_UNEXPORT
RPC_S_INVALID_NAME_SYNTAX, // NSI_S_INVALID_NAME_SYNTAX
RPC_S_NO_CONTEXT_AVAILABLE, // NSI_S_INVALID_NS_HANDLE
RPC_S_OUT_OF_RESOURCES, // NSI_S_INVALID_OBJECT
RPC_S_NOT_ALL_OBJS_UNEXPORTED, // NSI_S_NOT_ALL_OBJS_UNEXPORTED
RPC_S_INVALID_STRING_BINDING, // NSI_S_INVALID_STRING_BINDING
RPC_S_INTERNAL_ERROR, // NSI_S_SOME_OTHER_ERROR
RPC_S_NOTHING_TO_EXPORT, // NSI_S_NOTHING_TO_EXPORT
RPC_S_CANNOT_SUPPORT, // NSI_S_UNIMPLEMENTED_API
RPC_S_NOTHING_TO_EXPORT, // NSI_S_NO_INTERFACES_EXPORTED
RPC_S_INCOMPLETE_NAME, // NSI_S_INCOMPLETE_NAME
RPC_S_INVALID_VERS_OPTION, // NSI_S_INVALID_VERS_OPTION
RPC_S_NO_MORE_MEMBERS, // NSI_S_NO_MORE_MEMBERS
RPC_S_ENTRY_ALREADY_EXISTS, // NSI_S_ENTRY_ALREADY_EXISTS
RPC_S_OUT_OF_MEMORY, // NSI_S_OUT_OF_MEMORY
RPC_S_GROUP_MEMBER_NOT_FOUND, // NSI_S_GROUP_MEMBER_NOT_FOUND
RPC_S_SERVER_UNAVAILABLE, // NSI_S_NO_MASTER_LOCATOR
RPC_S_ENTRY_TYPE_MISMATCH, // NSI_S_ENTRY_TYPE_MISMATCH
RPC_S_NOT_ALL_OBJS_EXPORTED, // NSI_S_NOT_ALL_OBJS_EXPORTED
RPC_S_INTERFACE_NOT_EXPORTED, // NSI_S_INTERFACE_NOT_EXPORTED
RPC_S_PROFILE_NOT_ADDED, // NSI_S_PROFILE_NOT_ADDED
RPC_S_PRF_ELT_NOT_ADDED, // NSI_S_PRF_ELT_NOT_ADDED
RPC_S_PRF_ELT_NOT_REMOVED, // NSI_S_PRF_ELT_NOT_REMOVED
RPC_S_GRP_ELT_NOT_ADDED, // NSI_S_GRP_ELT_NOT_ADDED
RPC_S_GRP_ELT_NOT_REMOVED // NSI_S_GRP_ELT_NOT_REMOVED
};
UNSIGNED16
MapException(
IN RPC_STATUS Exception
)
/*++
Routine Description:
Map a RPC exception to a NSI status code.
Arguments:
Exception - Stub generated exception code.
Returns:
NSI status code
--*/
{
#ifdef NTENV
// If an NT access fault was raised, re-raise it.
if (Exception == 0xc0000005)
RpcRaiseException(Exception);
#endif
switch(Exception)
{
case RPC_X_SS_CONTEXT_MISMATCH:
case RPC_X_SS_IN_NULL_CONTEXT:
case RPC_S_INVALID_BINDING:
return(NSI_S_INVALID_NS_HANDLE);
case RPC_S_OUT_OF_MEMORY:
return(NSI_S_OUT_OF_MEMORY);
case RPC_X_ENUM_VALUE_OUT_OF_RANGE:
return (NSI_S_UNIMPLEMENTED_API);
}
return(NSI_S_NAME_SERVICE_UNAVAILABLE);
}
WIDE_STRING::WIDE_STRING(
IN unsigned char * AsciiString OPTIONAL
)
/*++
Routine Description:
Make a UNICODE string from an ASCII string.
Arguments:
AsciiString - 8 bit string to widen to 16 bits.
Returns:
String is set to new value. If there was an allocation error, then
the value is set to AllocError.
--*/
{
if (!AsciiString)
{
String = 0;
AllocMode = AllocReference;
return;
}
int Size = (strlen((CONST_CHAR *) AsciiString) + 1) * sizeof(unsigned short);
if (! (String = (unsigned short *)I_RpcAllocate(Size)))
{
AllocMode = AllocError;
return;
}
AllocMode = AllocMemory;
#ifdef NTENV
AsciiToUnicodeNT(String, AsciiString);
#else
for (unsigned short *pT = String; *pT++ = *AsciiString++;) ;
#endif
}
#ifndef NTENV
int
UnicodeToAscii(
unsigned short *UnicodeString
)
/*++
Routine Description:
Make a ASCII string from an UNICODE string. This is done in
place so the string becomes ASCII.
Arguments:
UnicodeString - unicode string to convert
Returns:
1 if conversion was OK, 0 if there was an error.
--*/
{
unsigned char * AsciiString;
for (AsciiString = (unsigned char *) UnicodeString;
*UnicodeString <= 0xff && *UnicodeString; )
*AsciiString++ = *UnicodeString++;
*AsciiString = 0;
return((*UnicodeString == 0)? RPC_S_OK: RPC_S_OK);
}
#endif
void *
#if defined(WIN32)
__cdecl
#endif
operator new(
size_t size
)
{
return(I_RpcAllocate(size));
}
void
#if defined(WIN32)
__cdecl
#endif
operator delete(
void * p
)
{
I_RpcFree(p);
}
void CallExportInit() {}
unsigned char *
CopyString(
IN char * String
)
/*++
Routine Description:
Copy a string.
Arguments:
String - to copy
Returns:
pointer to a copy, Nil if out of memory.
--*/
{
unsigned char * pReturn;
if (!String || !( pReturn = new unsigned char [strlen(String)+1]))
return(0);
return ((unsigned char *) strcpy((char *) pReturn, (CONST_CHAR *) String));
}
void
GetDefaultEntrys(
IN void * Key
)
/*++
Routine Description:
Get the default Entry name and syntax type form the registry.
Arguments:
Key - open registry handle
--*/
{
// While we have the registry open, get the default syntax entrys.
if (! fSyntaxDefaultsLoaded)
{
unsigned char *SyntaxValue;
if (SyntaxValue = RegGetString(Key, "DefaultSyntax"))
{
DefaultSyntax = atoi((char *)SyntaxValue);
delete SyntaxValue;
}
if (SyntaxValue = RegGetString(Key, "DefaultEntry"))
{
DefaultName = new WIDE_STRING(SyntaxValue);
delete SyntaxValue;
}
fSyntaxDefaultsLoaded = 1;
}
}
#if !defined(NTENV) && DBG
void
RtlAssert(
void * FailedAssertion,
void * FileName,
unsigned long LineNumber,
char * Message
)
{
UNUSED(Message);
#if defined(OS212)
printf("Assert failed %s in %s line %ld\n",
FailedAssertion, FileName, LineNumber);
#elif defined(WIN)
char Buffer[300];
sprintf(Buffer, "Assert failed %s in %s line %ld\n",
FailedAssertion, FileName, LineNumber);
OutputDebugString(Buffer);
#endif
}
#endif