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
|
|||
|
|