383 lines
9.9 KiB
C
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;
|
||
|
}
|
||
|
|