/*++ 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 #include #include #include #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 #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