windows-nt/Source/XPSP1/NT/ds/nw/nwlib/win95/nwatch95.c
2020-09-26 16:20:57 +08:00

383 lines
9.9 KiB
C

/*++
Copyright (C) 1996 Microsoft Corporation
Module Name:
nwatch95.c
Abstract:
Attachment routines for Win95
Author:
Felix Wong [t-felixw] 6-Sep-1996
Revision History:
--*/
#include "procs.h"
#include "nw95.h"
BOOLEAN* NlsMbOemCodePageTag = FALSE;
typedef struct _NWC_SERVER_INFO {
HANDLE hConn ;
UNICODE_STRING ServerString ;
} NWC_SERVER_INFO, *PNWC_SERVER_INFO ;
DWORD
szToWide(
LPWSTR lpszW,
LPCSTR lpszC,
INT nSize
);
HINSTANCE g_hinstDLL = NULL;
// Forwards
NWCCODE
NWAttachToFileServerWin95(
LPCSTR pszServerName,
WORD ScopeFlag,
NW_CONN_HANDLE *phNewConn
);
NWCCODE NWDetachFromFileServerWin95(
NW_CONN_HANDLE hConn
);
DWORD
WideToSz(
LPSTR lpszC,
LPCWSTR lpszW,
INT nSize
)
{
if (!WideCharToMultiByte(CP_ACP,
WC_COMPOSITECHECK | WC_SEPCHARS,
lpszW,
-1,
lpszC,
nSize,
NULL,
NULL))
{
return (GetLastError()) ;
}
return NO_ERROR ;
}
NWCCODE NWAPI DLLEXPORT
NWDetachFromFileServer(
NWCONN_HANDLE hConn
)
{
NWCCODE nwccode;
PNWC_SERVER_INFO pServerInfo;
if (!hConn)
return (NWCCODE)UNSUCCESSFUL;
pServerInfo = (PNWC_SERVER_INFO)hConn ;
// Do not detach server since Win95 does not have reference count. We will just
// wait for it to waitout and disconnect itself.
// This is suggested by VladS.
//nwccode = NWDetachFromFileServerWin95(pServerInfo->hConn);
nwccode = SUCCESSFUL;
if (pServerInfo->ServerString.Buffer != NULL) {
(void) LocalFree (pServerInfo->ServerString.Buffer);
pServerInfo->ServerString.Buffer = NULL;
}
pServerInfo->hConn = NULL ;
(void) LocalFree (pServerInfo) ;
return nwccode;
}
NWCCODE NWAPI DLLEXPORT
NWAttachToFileServerW(
const WCHAR NWFAR *pwszServerName,
NWLOCAL_SCOPE ScopeFlag,
NWCONN_HANDLE NWFAR *phNewConn
)
{
NW_STATUS NwStatus;
LPWSTR lpwszServerName = NULL; // Pointer to buffer for WIDE servername
LPSTR lpszServerName = NULL;
int nSize;
PNWC_SERVER_INFO pServerInfo = NULL;
UNREFERENCED_PARAMETER(ScopeFlag) ;
//
// check parameters and init return result to be null.
//
if (!pwszServerName || !phNewConn)
return INVALID_CONNECTION ;
*phNewConn = NULL ;
// Setup lpszServerName, used to pass into NWAttachToFileServerWin95
nSize = wcslen(pwszServerName) + 1;
if(!(lpszServerName = (LPSTR) LocalAlloc(
LPTR,
nSize * sizeof(CHAR) )))
{
NwStatus = REQUESTER_ERROR ;
goto ExitPoint ;
}
if (WideToSz( lpszServerName,
pwszServerName,
nSize ) != NO_ERROR)
{
NwStatus = REQUESTER_ERROR ;
goto ExitPoint ;
}
// Setup lpwszServerName, used as storage in server handle
nSize = nSize+2 ; // Adding 2 for the '\\'
if(!(lpwszServerName = (LPWSTR) LocalAlloc(
LPTR,
nSize * sizeof(WCHAR) )))
{
NwStatus = REQUESTER_ERROR ;
goto ExitPoint ;
}
wcscpy( lpwszServerName,
L"\\\\" );
wcscat( lpwszServerName,
pwszServerName );
//
// Allocate a buffer for the server info (handle + name pointer). Also
// init the unicode string.
//
if( !(pServerInfo = (PNWC_SERVER_INFO) LocalAlloc(
LPTR,
sizeof(NWC_SERVER_INFO))) )
{
NwStatus = REQUESTER_ERROR ;
goto ExitPoint ;
}
RtlInitUnicodeString(&pServerInfo->ServerString, lpwszServerName) ;
if (wcscmp(pwszServerName,L"*") != 0) {
NwStatus = NWAttachToFileServerWin95(
lpszServerName,
ScopeFlag,
&pServerInfo->hConn
);
}
else {
// hConn of NULL works as nearest server in Win95
pServerInfo->hConn = NULL;
NwStatus = SUCCESSFUL;
}
ExitPoint:
//
// Free the memory allocated above before exiting
//
if (lpszServerName)
(void) LocalFree( (HLOCAL) lpszServerName );
if (NwStatus != SUCCESSFUL) {
// only deallocate if unsucessful, or else it will
// be stored in pServerInfo->ServerString
if (lpwszServerName)
(void) LocalFree( (HLOCAL) lpwszServerName );
if (pServerInfo)
(void) LocalFree( (HLOCAL) pServerInfo );
}
else {
*phNewConn = (HANDLE) pServerInfo ;
}
//
// Return with NWCCODE
//
return( (NWCCODE)NwStatus );
}
NWCCODE NWAPI DLLEXPORT
NWAttachToFileServer(
const CHAR NWFAR *pszServerName,
NWLOCAL_SCOPE ScopeFlag,
NWCONN_HANDLE NWFAR *phNewConn
)
{
NW_STATUS NwStatus;
LPWSTR lpwszServerName = NULL; // Pointer to buffer for WIDE servername
LPWSTR lpwszServerNameTmp = NULL;
int nSize;
PNWC_SERVER_INFO pServerInfo = NULL;
UNREFERENCED_PARAMETER(ScopeFlag) ;
//
// check parameters and init return result to be null.
//
if (!pszServerName || !phNewConn)
return INVALID_CONNECTION ;
*phNewConn = NULL ;
nSize = strlen(pszServerName) + 1;
// Setup lpwszServerNameTmp
if(!(lpwszServerNameTmp = (LPWSTR) LocalAlloc(
LPTR,
nSize * sizeof(WCHAR) )))
{
NwStatus = REQUESTER_ERROR ;
goto ExitPoint ;
}
if (szToWide( lpwszServerNameTmp,
pszServerName,
nSize ) != NO_ERROR)
{
NwStatus = REQUESTER_ERROR ;
goto ExitPoint ;
}
// Setup lpwszServerName for storage in server handle
nSize = nSize + 2;
if(!(lpwszServerName = (LPWSTR) LocalAlloc(
LPTR,
nSize * sizeof(WCHAR) )))
{
NwStatus = REQUESTER_ERROR ;
goto ExitPoint ;
}
wcscpy( lpwszServerName,
L"\\\\" );
wcscat( lpwszServerName,
lpwszServerNameTmp );
//
// Allocate a buffer for the server info (handle + name pointer). Also
// init the unicode string.
//
if( !(pServerInfo = (PNWC_SERVER_INFO) LocalAlloc(
LPTR,
sizeof(NWC_SERVER_INFO))) )
{
NwStatus = REQUESTER_ERROR ;
goto ExitPoint ;
}
RtlInitUnicodeString(&pServerInfo->ServerString, lpwszServerName) ;
if (strcmp(pszServerName,"*") != 0) {
NwStatus = NWAttachToFileServerWin95(
pszServerName,
ScopeFlag,
&pServerInfo->hConn
);
}
else {
// hConn of NULL works as nearest server in Win95
pServerInfo->hConn = NULL;
NwStatus = SUCCESSFUL;
}
ExitPoint:
//
// Free the memory allocated above before exiting
//
if (lpwszServerNameTmp)
(void) LocalFree( (HLOCAL) lpwszServerNameTmp );
if (NwStatus != SUCCESSFUL) {
// only deallocate if unsucessful, or else it will
// be stored in pServerInfo->ServerString
if (lpwszServerName)
(void) LocalFree( (HLOCAL) lpwszServerName );
if (pServerInfo)
(void) LocalFree( (HLOCAL) pServerInfo );
}
else {
*phNewConn = (HANDLE) pServerInfo ;
}
//
// Return with NWCCODE
//
return( (NWCCODE)NwStatus );
}
NWCCODE
NWAttachToFileServerWin95(
LPCSTR pszServerName,
WORD ScopeFlag,
NW_CONN_HANDLE *phNewConn
)
{
NW_STATUS nwstatusReturn = UNSUCCESSFUL;
NW_STATUS (*lpfnAttachToFileServerWin95) (LPCSTR,
WORD,
NW_CONN_HANDLE
);
/* Load the NWAPI32.DLL library module. */
if (g_hinstDLL == NULL)
g_hinstDLL = LoadLibraryA("NWAPI32.DLL");
if (g_hinstDLL == NULL) {
goto Exit;
}
(FARPROC) lpfnAttachToFileServerWin95 =
GetProcAddress(g_hinstDLL, "NWAttachToFileServer");
if (lpfnAttachToFileServerWin95 == NULL)
goto Exit;
nwstatusReturn = (*lpfnAttachToFileServerWin95) (pszServerName,
ScopeFlag,
phNewConn
);
Exit:
//FreeLibrary(hinstDLL);
return (NWCCODE)nwstatusReturn;
}
NWCCODE NWDetachFromFileServerWin95(
NW_CONN_HANDLE hConn
)
{
NW_STATUS nwstatusReturn = UNSUCCESSFUL;
NW_STATUS (*lpfnDetachFromFileServerWin95) (NW_CONN_HANDLE);
/* Load the NWAPI32.DLL library module. */
if (g_hinstDLL == NULL)
g_hinstDLL = LoadLibraryA("NWAPI32.DLL");
if (g_hinstDLL == NULL)
goto Exit;
(FARPROC) lpfnDetachFromFileServerWin95 =
GetProcAddress(g_hinstDLL, "NWDetachFromFileServer");
if (lpfnDetachFromFileServerWin95 == NULL)
goto Exit;
nwstatusReturn = (*lpfnDetachFromFileServerWin95) (hConn);
Exit:
//FreeLibrary(hinstDLL);
return (NWCCODE)nwstatusReturn;
}