//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: D L L M A I N . C P P // // Contents: DLL entry points for netman.dll // // Notes: // // Author: shaunco 3 Apr 1998 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "nmbase.h" #include "nmres.h" #include "ncreg.h" #include "nceh.h" #define INITGUID #include "nmclsid.h" #include "..\conman\conman.h" //+--------------------------------------------------------------------------- // DLL Entry Point // EXTERN_C BOOL WINAPI DllMain ( IN HINSTANCE hinst, IN DWORD dwReason, IN WACKYAPI LPVOID pvReserved) { if (dwReason == DLL_PROCESS_ATTACH) { #ifndef DBG DisableThreadLibraryCalls (hinst); #endif EnableCPPExceptionHandling(); InitializeDebugging(); _Module.DllProcessAttach (hinst); } else if (dwReason == DLL_PROCESS_DETACH) { DbgCheckPrematureDllUnload ("netman.dll", _Module.GetLockCount()); _Module.DllProcessDetach (); UnInitializeDebugging(); DisableCPPExceptionHandling(); // Disable translation of SEH exceptions into CPP exceptions. } #ifdef DBG else if (dwReason == DLL_THREAD_DETACH) { CTracingIndent::FreeThreadInfo(); } #endif return TRUE; } //+--------------------------------------------------------------------------- // ServiceMain - Called by the generic service process when starting // this service. // // type of LPSERVICE_MAIN_FUNCTIONW // EXTERN_C VOID WINAPI ServiceMain ( DWORD argc, LPCWSTR argv[]) { _Module.ServiceMain (argc, argv); } //SD for netman const BYTE sdNetmanLaunchPermission[] = { 01,0x00,0x04,0x80,0x70,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00, 00,0x00,0x02,0x00,0x5c,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00, 05,0x20,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x05, 04,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x14,0x00,0x00,0x00,0x00, 00,0x14,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x12,0x00,0x00,0x00,0x01,0x05,0x00,0x00,0x00,0x00, 00,0x05,0x15,0x00,0x00,0x00,0xa0,0x5f,0x84,0x1f,0x5e,0x2e,0x6b,0x49,0xce,0x12,0x03,0x03,0xf4,0x01,0x00,0x00,0x01,0x05,0x00, 00,0x00,0x00,0x00,0x05,0x15,0x00,0x00,0x00,0xa0,0x5f,0x84,0x1f,0x5e,0x2e,0x6b,0x49,0xce,0x12,0x03,0x03,0xf4,0x01,0x00,0x00 }; const static WCHAR c_szNetmanAppId[] = L"AppId\\{27AF75ED-20D9-11D1-B1CE-00805FC1270E}"; const static WCHAR c_szLaunchPermission[] = L"LaunchPermission"; //+--------------------------------------------------------------------------- // DllRegisterServer - Adds entries to the system registry // STDAPI DllRegisterServer () { BOOL fCoUninitialize = TRUE; HRESULT hr = CoInitializeEx (NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); if (FAILED(hr)) { fCoUninitialize = FALSE; if (RPC_E_CHANGED_MODE == hr) { hr = S_OK; } } if (SUCCEEDED(hr)) { hr = _Module.UpdateRegistryFromResource (IDR_NETMAN, TRUE); if (SUCCEEDED(hr)) { HKEY hkNetmanAppId = NULL; hr = HrRegOpenKeyEx(HKEY_CLASSES_ROOT, c_szNetmanAppId, KEY_WRITE, &hkNetmanAppId); if (SUCCEEDED(hr)) { HrRegSetBinary(hkNetmanAppId, c_szLaunchPermission, sdNetmanLaunchPermission, sizeof(sdNetmanLaunchPermission)); if (SUCCEEDED(hr)) { hr = NcAtlModuleRegisterServer (&_Module); if (fCoUninitialize) { CoUninitialize (); } } RegCloseKey(hkNetmanAppId); } } } TraceHr (ttidError, FAL, hr, FALSE, "netman!DllRegisterServer"); return hr; } //+--------------------------------------------------------------------------- // DllUnregisterServer - Removes entries from the system registry // STDAPI DllUnregisterServer () { _Module.UpdateRegistryFromResource (IDR_NETMAN, FALSE); _Module.UnregisterServer (); return S_OK; } HRESULT GetClientAdvises(OUT LPWSTR** pppszAdviseUsers, OUT LPDWORD pdwCount) { HRESULT hr = S_OK; if ( (!pppszAdviseUsers) || (!pdwCount) ) { return E_POINTER; } CConnectionManager *pConMan = const_cast(CConnectionManager::g_pConMan); if (!pConMan) { return E_UNEXPECTED; } DWORD dwTotalLength = 0; DWORD dwNumItems = 0; list NameList; pConMan->g_fInUse = TRUE; pConMan->Lock(); for (ITERUSERNOTIFYMAP iter = pConMan->m_mapNotify.begin(); iter != pConMan->m_mapNotify.end(); iter++) { tstring szName = iter->second->szUserName; NameList.push_back(szName); dwTotalLength += sizeof(WCHAR) * (szName.length() + 1); dwNumItems++; } pConMan->Unlock(); pConMan->g_fInUse = FALSE; if (!dwNumItems) { *pppszAdviseUsers = NULL; *pdwCount = 0; return S_FALSE; } DWORD dwAllocSize = dwNumItems * sizeof(LPCWSTR) + dwTotalLength; *pppszAdviseUsers = reinterpret_cast(CoTaskMemAlloc(dwAllocSize)); if (!*pppszAdviseUsers) { return E_OUTOFMEMORY; } LPWSTR pszEndString = reinterpret_cast(reinterpret_cast(*pppszAdviseUsers) + dwAllocSize); // First string in the structure LPWSTR pszCurrentString = reinterpret_cast(reinterpret_cast(*pppszAdviseUsers) + (sizeof(LPWSTR) * dwNumItems)); // First pointer in the structure LPWSTR* lppArray = *pppszAdviseUsers; for (list::const_iterator iterName = NameList.begin(); iterName != NameList.end(); iterName++) { *lppArray = pszCurrentString; wcscpy(pszCurrentString, iterName->c_str()); lppArray++; pszCurrentString += (iterName->size() + 1); Assert(pszCurrentString <= pszEndString); } *pdwCount = dwNumItems; return hr; }