//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: dll.cpp // // Core entry points for the DLL // //-------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #define INITGUID #include #include "iids.h" /*---------------------------------------------------------------------------- / Globals /----------------------------------------------------------------------------*/ HINSTANCE g_hInstance = NULL; HINSTANCE g_hAclEditDll = NULL; DWORD g_tls = 0xffffffffL; /*----------------------------------------------------------------------------- / DllMain / ------- / Main entry point. We are passed reason codes and assored other / information when loaded or closed down. / / In: / hInstance = our instance handle / dwReason = reason code / pReserved = depends on the reason code. / / Out: / - /----------------------------------------------------------------------------*/ STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*pReserved*/) { switch (dwReason) { case DLL_PROCESS_ATTACH: g_hInstance = hInstance; g_tls = TlsAlloc(); DebugProcessAttach(); TraceSetMaskFromCLSID(CLSID_DsSecurity); #ifndef DEBUG DisableThreadLibraryCalls(hInstance); #endif break; case DLL_PROCESS_DETACH: SchemaCache_Destroy(); if (g_hAclEditDll) FreeLibrary(g_hAclEditDll); TlsFree(g_tls); DebugProcessDetach(); break; case DLL_THREAD_DETACH: DebugThreadDetach(); break; } return TRUE; } /*----------------------------------------------------------------------------- / DllCanUnloadNow / --------------- / Called by the outside world to determine if our DLL can be unloaded. If we / have any objects in existance then we must not unload. / / In: / - / Out: / BOOL inidicate unload state. /----------------------------------------------------------------------------*/ STDAPI DllCanUnloadNow(void) { return GLOBAL_REFCOUNT ? S_FALSE : S_OK; } /*----------------------------------------------------------------------------- / DllGetClassObject / ----------------- / Given a class ID and an interface ID, return the relevant object. This used / by the outside world to access the objects contained here in. / / In: / rCLISD = class ID required / riid = interface within that class required / ppv -> receives the newly created object. / / Out: / - /----------------------------------------------------------------------------*/ STDAPI DllGetClassObject(REFCLSID rCLSID, REFIID riid, LPVOID *ppv) { HRESULT hr; CDsSecurityClassFactory *pClassFactory; TraceEnter(TRACE_CORE, "DllGetClassObject"); TraceGUID("Object requested", rCLSID); TraceGUID("Interface requested", riid); *ppv = NULL; if (!IsEqualIID(rCLSID, CLSID_DsSecurity)) ExitGracefully(hr, CLASS_E_CLASSNOTAVAILABLE, "CLSID not supported"); pClassFactory = new CDsSecurityClassFactory; if (!pClassFactory) ExitGracefully(hr, E_OUTOFMEMORY, "Failed to create class factory"); hr = pClassFactory->QueryInterface(riid, ppv); if (FAILED(hr)) delete pClassFactory; exit_gracefully: TraceLeaveResult(hr); } /*----------------------------------------------------------------------------- / WaitOnThread / ----------------- / If a thread is running (if the handle is non-NULL) wait for it to complete. / Then set the handle to NULL. / / In: / phThread = address of thread handle / / Out: / Result of WaitForSingleObject, or zero. /----------------------------------------------------------------------------*/ DWORD WaitOnThread(HANDLE *phThread) { DWORD dwResult = 0; if (phThread != NULL && *phThread != NULL) { HCURSOR hcurPrevious = SetCursor(LoadCursor(NULL, IDC_WAIT)); SetThreadPriority(*phThread, THREAD_PRIORITY_HIGHEST); dwResult = WaitForSingleObject(*phThread, INFINITE); CloseHandle(*phThread); *phThread = NULL; SetCursor(hcurPrevious); } return dwResult; } /*----------------------------------------------------------------------------- / Thread Local Storage helpers /----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------- / ThreadCoInitialize / ------------------ / There is some thread local storage that indicates if we have called / CoInitialize. If CoInitialize has not yet been called, call it now. / Otherwise, do nothing. / / In: / - / Out: / HRESULT /----------------------------------------------------------------------------*/ HRESULT ThreadCoInitialize(void) { HRESULT hr = S_OK; TraceEnter(TRACE_CORE, "ThreadCoInitialize"); if (!TlsGetValue(g_tls)) { TraceMsg("Calling CoInitialize"); hr = CoInitialize(NULL); TlsSetValue(g_tls, (LPVOID)SUCCEEDED(hr)); } TraceLeaveResult(hr); } /*----------------------------------------------------------------------------- / ThreadCoUninitialize / ------------------ / There is some thread local storage that indicates if we have called / CoInitialize. If CoInitialize has been called, call CoUninitialize now. / Otherwise, do nothing. / / In: / - / Out: / HRESULT /----------------------------------------------------------------------------*/ void ThreadCoUninitialize(void) { TraceEnter(TRACE_CORE, "ThreadCoUninitialize"); if (TlsGetValue(g_tls)) { TraceMsg("Calling CoUninitialize"); CoUninitialize(); TlsSetValue(g_tls, NULL); } TraceLeaveVoid(); } // // Wrappers for delay-loading aclui.dll // char const c_szCreateSecurityPage[] = "CreateSecurityPage"; char const c_szEditSecurity[] = "EditSecurity"; typedef HPROPSHEETPAGE (WINAPI *PFN_CREATESECPAGE)(LPSECURITYINFO); typedef BOOL (WINAPI *PFN_EDITSECURITY)(HWND, LPSECURITYINFO); HRESULT _CreateSecurityPage(LPSECURITYINFO pSI, HPROPSHEETPAGE *phPage) { HRESULT hr = E_FAIL; if (NULL == g_hAclEditDll) g_hAclEditDll = LoadLibrary(c_szAclUI); if (g_hAclEditDll) { static PFN_CREATESECPAGE s_pfnCreateSecPage = NULL; if (NULL == s_pfnCreateSecPage) s_pfnCreateSecPage = (PFN_CREATESECPAGE)GetProcAddress(g_hAclEditDll, c_szCreateSecurityPage); if (s_pfnCreateSecPage) { hr = S_OK; *phPage = (*s_pfnCreateSecPage)(pSI); if (NULL == *phPage) hr = E_OUTOFMEMORY; } } return hr; } HRESULT _EditSecurity(HWND hwndOwner, LPSECURITYINFO pSI) { HRESULT hr = E_FAIL; if (NULL == g_hAclEditDll) g_hAclEditDll = LoadLibrary(c_szAclUI); if (g_hAclEditDll) { static PFN_EDITSECURITY s_pfnEditSecurity = NULL; if (NULL == s_pfnEditSecurity) s_pfnEditSecurity = (PFN_EDITSECURITY)GetProcAddress(g_hAclEditDll, c_szEditSecurity); if (s_pfnEditSecurity) { hr = S_OK; (*s_pfnEditSecurity)(hwndOwner, pSI); } } return hr; }