349 lines
6.6 KiB
C++
349 lines
6.6 KiB
C++
/*++
|
||
|
||
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
|
||
|