/*++ Copyright(c) 1996 Microsoft Corporation MODULE NAME dll.c ABSTRACT DLL initialization code AUTHOR Anthony Discolo (adiscolo) 12-Sep-1996 REVISION HISTORY --*/ #ifndef UNICODE #define UNICODE #endif #include #include #include #include #include #include #include #include #include "rasrpc.h" #include #include "loaddlls.h" #include "media.h" #include "wanpub.h" #include "defs.h" #include "structs.h" #include "protos.h" RPC_BINDING_HANDLE g_hBinding = NULL; DWORD RasRPCBind( IN LPWSTR lpwsServerName, OUT HANDLE* phServer, IN BOOL fLocal ); DWORD APIENTRY RasRPCBind( IN LPWSTR lpwszServerName, OUT HANDLE* phServer, IN BOOL fLocal ) { RPC_STATUS RpcStatus; LPWSTR lpwszStringBinding; LPWSTR pszServerPrincipalName = NULL; do { RpcStatus = RpcStringBindingCompose( NULL, TEXT("ncacn_np"), lpwszServerName, TEXT("\\PIPE\\ROUTER"), TEXT("Security=Impersonation Static True"), &lpwszStringBinding); if ( RpcStatus != RPC_S_OK ) { break;; } RpcStatus = RpcBindingFromStringBinding( lpwszStringBinding, (handle_t *)phServer ); RpcStringFree( &lpwszStringBinding ); if ( RpcStatus != RPC_S_OK ) { break; } if( RpcStatus != RPC_S_OK ) { break; } // // register authentication information with rpc // if(fLocal) { // // Query Servers principal name // RpcStatus = RpcMgmtInqServerPrincName( *phServer, RPC_C_AUTHN_GSS_NEGOTIATE, &pszServerPrincipalName); RpcStatus = RPC_S_OK; RpcStatus = RpcBindingSetAuthInfoW( *phServer, pszServerPrincipalName, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_AUTHN_WINNT , NULL, RPC_C_AUTHZ_NONE); } else { // // Query Servers principal name // RpcStatus = RpcMgmtInqServerPrincName( *phServer, RPC_C_AUTHN_GSS_NEGOTIATE, &pszServerPrincipalName); RpcStatus = RPC_S_OK; RpcStatus = RpcBindingSetAuthInfoW( *phServer, pszServerPrincipalName, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_AUTHN_GSS_NEGOTIATE, NULL, RPC_C_AUTHZ_NONE); } } while (FALSE); if(pszServerPrincipalName) { RpcStringFree(&pszServerPrincipalName); } if(RpcStatus != RPC_S_OK) { RpcBindingFree(*phServer); *phServer = NULL; return (I_RpcMapWin32Status(RpcStatus)); } return( NO_ERROR ); } DWORD APIENTRY RasRpcConnect( LPWSTR pwszServer, HANDLE* phServer ) { DWORD retcode = 0; WCHAR *pszComputerName; WCHAR wszComputerName [ MAX_COMPUTERNAME_LENGTH + 1 ] = {0}; DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; BOOL fLocal = FALSE; if (0 == GetComputerName(wszComputerName, &dwSize)) { return GetLastError(); } if(NULL != pwszServer) { pszComputerName = pwszServer; // // convert \\MACHINENAME to MACHINENAME // if ( (wcslen(pszComputerName) > 2) && (pszComputerName [0] == TEXT('\\')) && (pszComputerName [1] == TEXT('\\'))) { pszComputerName += 2; } if(0 == _wcsicmp(pszComputerName, wszComputerName)) { fLocal = TRUE; } } else { pszComputerName = wszComputerName; fLocal = TRUE; } if( fLocal && (NULL != g_hBinding)) { // // We are done - we already have a // binding. // *phServer = g_hBinding; goto done; } if( !fLocal && (NULL == phServer)) { retcode = E_INVALIDARG; goto done; } // // Bind with the server if we are not bound already. // By default we bind to the local server // RasmanOutputDebug ( "RASMAN: Binding to the server\n"); retcode = RasRPCBind( pszComputerName , fLocal ? &g_hBinding : phServer, fLocal) ; // // Set the bind handle for the caller if its local // if ( phServer && fLocal) *phServer = g_hBinding; done: return retcode; } DWORD APIENTRY RasRpcDisconnect( HANDLE* phServer ) { // // Release the binding resources. // RasmanOutputDebug ("RASMAN: Disconnecting From Server\n"); if(*phServer == g_hBinding) { g_hBinding = NULL; } (void)RpcBindingFree(phServer); return NO_ERROR; } DWORD APIENTRY RemoteSubmitRequest ( HANDLE hConnection, PBYTE pBuffer, DWORD dwSizeOfBuffer ) { DWORD dwStatus = ERROR_SUCCESS; RPC_BINDING_HANDLE hServer; // // NULL hConnection means the request is // for a local server. Better have a // hBinding with us in the global in this // case. // if(NULL == hConnection) { ASSERT(NULL != g_hBinding); hServer = g_hBinding; } else { ASSERT(NULL != ((RAS_RPC *)hConnection)->hRpcBinding); hServer = ((RAS_RPC *) hConnection)->hRpcBinding; } RpcTryExcept { dwStatus = RasRpcSubmitRequest( hServer, pBuffer, dwSizeOfBuffer ); } RpcExcept(I_RpcExceptionFilter(dwStatus = RpcExceptionCode())) { } RpcEndExcept return dwStatus; } #if 0 DWORD APIENTRY RasRpcLoadDll(LPTSTR lpszServer) { return LoadRasRpcDll(lpszServer); } #endif DWORD APIENTRY RasRpcConnectServer(LPTSTR lpszServer, HANDLE *pHConnection) { return InitializeConnection(lpszServer, pHConnection); } DWORD APIENTRY RasRpcDisconnectServer(HANDLE hConnection) { UninitializeConnection(hConnection); return NO_ERROR; } DWORD RasRpcUnloadDll() { return UnloadRasRpcDll(); } UINT APIENTRY RasRpcRemoteGetSystemDirectory( HANDLE hConnection, LPTSTR lpBuffer, UINT uSize ) { return g_pGetSystemDirectory( hConnection, lpBuffer, uSize); } DWORD APIENTRY RasRpcRemoteRasDeleteEntry( HANDLE hConnection, LPTSTR lpszPhonebook, LPTSTR lpszEntry ) { DWORD dwError = ERROR_SUCCESS; RAS_RPC *pRasRpcConnection = (RAS_RPC *) hConnection; if(NULL == hConnection) { dwError = g_pRasDeleteEntry(lpszPhonebook, lpszEntry); } else { // // Remote server case // dwError = RemoteRasDeleteEntry(hConnection, lpszPhonebook, lpszEntry); } return dwError; } DWORD APIENTRY RasRpcRemoteGetUserPreferences( HANDLE hConnection, PBUSER * pPBUser, DWORD dwMode ) { return g_pGetUserPreferences(hConnection, pPBUser, dwMode); } DWORD APIENTRY RasRpcRemoteSetUserPreferences( HANDLE hConnection, PBUSER * pPBUser, DWORD dwMode ) { return g_pSetUserPreferences(hConnection, pPBUser, dwMode); } /* DWORD APIENTRY RemoteRasDeviceEnum( PCHAR pszDeviceType, PBYTE lpDevices, PWORD pwcbDevices, PWORD pwcDevices ) { DWORD dwStatus; ASSERT(g_hBinding); RpcTryExcept { dwStatus = RasRpcDeviceEnum(g_hBinding, pszDeviceType, lpDevices, pwcbDevices, pwcDevices); } RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) { dwStatus = RpcExceptionCode(); } RpcEndExcept return dwStatus; } DWORD APIENTRY RemoteRasGetDevConfig( HPORT hport, PCHAR pszDeviceType, PBYTE lpConfig, LPDWORD lpcbConfig ) { DWORD dwStatus; ASSERT(g_hBinding); RpcTryExcept { dwStatus = RasRpcGetDevConfig(g_hBinding, hport, pszDeviceType, lpConfig, lpcbConfig); } RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) { dwStatus = RpcExceptionCode(); } RpcEndExcept return dwStatus; } DWORD APIENTRY RemoteRasPortEnum( PBYTE lpPorts, PWORD pwcbPorts, PWORD pwcPorts ) { DWORD dwStatus; ASSERT(g_hBinding); RpcTryExcept { dwStatus = RasRpcPortEnum(g_hBinding, lpPorts, pwcbPorts, pwcPorts); } RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) { dwStatus = RpcExceptionCode(); } RpcEndExcept return dwStatus; } DWORD RemoteRasPortGetInfo( HPORT porthandle, PBYTE buffer, PWORD pSize) { DWORD dwStatus; RpcTryExcept { dwStatus = RasRpcPortGetInfo(g_hBinding, porthandle, buffer, pSize); } RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) { dwStatus = RpcExceptionCode(); } RpcEndExcept return dwStatus; } */