244 lines
4.8 KiB
C
244 lines
4.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
Utils95.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Utilities for Win95 OLEDS support in NWAPI32
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Felix Wong [t-felixw] 23-Sept-1996
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include <procs.h>
|
||
|
#include <nw95.h>
|
||
|
|
||
|
#define NULL_TERMINATED 0
|
||
|
|
||
|
//
|
||
|
// define error mapping structure
|
||
|
//
|
||
|
typedef struct _NWSTATUS_TO_NTSTATUS {
|
||
|
NTSTATUS NtStatus;
|
||
|
NW_STATUS NwStatus;
|
||
|
} NWSTATUS_TO_NTSTATUS, *LPNWSTATUS_TO_NTSTATUS;
|
||
|
|
||
|
//
|
||
|
// Error mappings for bindery errors
|
||
|
//
|
||
|
NWSTATUS_TO_NTSTATUS MapNtErrors[] =
|
||
|
{
|
||
|
{STATUS_ACCESS_DENIED, NO_OBJECT_READ_PRIVILEGE},
|
||
|
{STATUS_NO_MORE_ENTRIES, UNKNOWN_FILE_SERVER},
|
||
|
{STATUS_NO_MORE_ENTRIES, NO_SUCH_OBJECT},
|
||
|
{STATUS_INVALID_PARAMETER, NO_SUCH_PROPERTY},
|
||
|
{STATUS_UNSUCCESSFUL, INVALID_CONNECTION},
|
||
|
{STATUS_INSUFF_SERVER_RESOURCES, SERVER_OUT_OF_MEMORY},
|
||
|
{STATUS_NO_SUCH_DEVICE, VOLUME_DOES_NOT_EXIST},
|
||
|
{STATUS_INVALID_HANDLE, BAD_DIRECTORY_HANDLE},
|
||
|
{STATUS_OBJECT_PATH_NOT_FOUND, INVALID_PATH},
|
||
|
{ 0, 0 }
|
||
|
} ;
|
||
|
|
||
|
NTSTATUS
|
||
|
MapNwToNtStatus(
|
||
|
const NW_STATUS nwstatus
|
||
|
)
|
||
|
{
|
||
|
LPNWSTATUS_TO_NTSTATUS pErrorMap ;
|
||
|
|
||
|
if (nwstatus == SUCCESSFUL)
|
||
|
return STATUS_SUCCESS;
|
||
|
|
||
|
pErrorMap = MapNtErrors ;
|
||
|
|
||
|
while (pErrorMap->NwStatus)
|
||
|
{
|
||
|
if (pErrorMap->NwStatus == nwstatus)
|
||
|
return (pErrorMap->NtStatus) ;
|
||
|
pErrorMap++ ;
|
||
|
}
|
||
|
return STATUS_UNSUCCESSFUL;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
UnicodeToAnsiString(
|
||
|
LPWSTR pUnicode,
|
||
|
LPSTR pAnsi,
|
||
|
DWORD StringLength
|
||
|
)
|
||
|
{
|
||
|
LPSTR pTempBuf = NULL;
|
||
|
INT rc = 0;
|
||
|
|
||
|
if( StringLength == NULL_TERMINATED ) {
|
||
|
|
||
|
//
|
||
|
// StringLength is just the
|
||
|
// number of characters in the string
|
||
|
//
|
||
|
StringLength = wcslen( pUnicode );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// WideCharToMultiByte doesn't NULL terminate if we're copying
|
||
|
// just part of the string, so terminate here.
|
||
|
//
|
||
|
|
||
|
pUnicode[StringLength] = 0;
|
||
|
|
||
|
//
|
||
|
// Include one for the NULL
|
||
|
//
|
||
|
StringLength++;
|
||
|
|
||
|
//
|
||
|
// Unfortunately, WideCharToMultiByte doesn't do conversion in place,
|
||
|
// so allocate a temporary buffer, which we can then copy:
|
||
|
//
|
||
|
|
||
|
if( pAnsi == (LPSTR)pUnicode )
|
||
|
{
|
||
|
#ifdef DBCS
|
||
|
pTempBuf = (LPSTR)LocalAlloc( LPTR, StringLength * 2 );
|
||
|
#else
|
||
|
pTempBuf = (LPSTR)LocalAlloc( LPTR, StringLength );
|
||
|
#endif
|
||
|
pAnsi = pTempBuf;
|
||
|
}
|
||
|
|
||
|
if( pAnsi )
|
||
|
{
|
||
|
rc = WideCharToMultiByte( CP_ACP,
|
||
|
0,
|
||
|
pUnicode,
|
||
|
StringLength,
|
||
|
pAnsi,
|
||
|
#ifdef DBCS
|
||
|
StringLength*2,
|
||
|
#else
|
||
|
StringLength,
|
||
|
#endif
|
||
|
NULL,
|
||
|
NULL );
|
||
|
}
|
||
|
|
||
|
/* If pTempBuf is non-null, we must copy the resulting string
|
||
|
* so that it looks as if we did it in place:
|
||
|
*/
|
||
|
if( pTempBuf && ( rc > 0 ) )
|
||
|
{
|
||
|
pAnsi = (LPSTR)pUnicode;
|
||
|
strcpy( pAnsi, pTempBuf );
|
||
|
LocalFree( pTempBuf );
|
||
|
}
|
||
|
|
||
|
return rc;
|
||
|
}
|
||
|
|
||
|
LPSTR
|
||
|
AllocateAnsiString(
|
||
|
LPWSTR pPrinterName
|
||
|
)
|
||
|
{
|
||
|
LPSTR pAnsiString;
|
||
|
|
||
|
if (!pPrinterName)
|
||
|
return NULL;
|
||
|
|
||
|
pAnsiString = (LPSTR)LocalAlloc(LPTR, wcslen(pPrinterName)*sizeof(CHAR) +
|
||
|
sizeof(CHAR));
|
||
|
|
||
|
if (pAnsiString)
|
||
|
UnicodeToAnsiString(pPrinterName, pAnsiString, NULL_TERMINATED);
|
||
|
|
||
|
return pAnsiString;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
FreeAnsiString(
|
||
|
LPSTR pAnsiString
|
||
|
)
|
||
|
{
|
||
|
if (!pAnsiString)
|
||
|
return;
|
||
|
|
||
|
LocalFree(pAnsiString);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
AnsiToUnicodeString(
|
||
|
LPSTR pAnsi,
|
||
|
LPWSTR pUnicode,
|
||
|
DWORD StringLength
|
||
|
)
|
||
|
{
|
||
|
int iReturn;
|
||
|
|
||
|
if( StringLength == NULL_TERMINATED )
|
||
|
StringLength = strlen( pAnsi );
|
||
|
|
||
|
iReturn = MultiByteToWideChar(CP_ACP,
|
||
|
MB_PRECOMPOSED,
|
||
|
pAnsi,
|
||
|
StringLength + 1,
|
||
|
pUnicode,
|
||
|
StringLength + 1 );
|
||
|
|
||
|
//
|
||
|
// Ensure NULL termination.
|
||
|
//
|
||
|
pUnicode[StringLength] = 0;
|
||
|
|
||
|
return iReturn;
|
||
|
}
|
||
|
|
||
|
LPWSTR
|
||
|
AllocateUnicodeString(
|
||
|
LPSTR pAnsiString
|
||
|
)
|
||
|
{
|
||
|
LPWSTR pUnicodeString = NULL;
|
||
|
|
||
|
if (!pAnsiString)
|
||
|
return NULL;
|
||
|
|
||
|
pUnicodeString = (LPWSTR)LocalAlloc(
|
||
|
LPTR,
|
||
|
strlen(pAnsiString)*sizeof(WCHAR) +sizeof(WCHAR)
|
||
|
);
|
||
|
|
||
|
if (pUnicodeString) {
|
||
|
|
||
|
AnsiToUnicodeString(
|
||
|
pAnsiString,
|
||
|
pUnicodeString,
|
||
|
NULL_TERMINATED
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return pUnicodeString;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
FreeUnicodeString(
|
||
|
LPWSTR pUnicodeString
|
||
|
)
|
||
|
{
|
||
|
if (!pUnicodeString)
|
||
|
return;
|
||
|
|
||
|
LocalFree(pUnicodeString);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|