windows-nt/Source/XPSP1/NT/base/win32/fusion/app/functions.cxx

434 lines
9.5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/**
* Asynchronous pluggable protocol for Applications
*
* Copyright (C) Microsoft Corporation, 2000
*/
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
#include "precomp.h"
#include "app.h"
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Private globals
HINSTANCE g_DllInstance;
long g_DllObjectCount;
// Prototypes
extern "C"
{
BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID);
STDAPI DllCanUnloadNow();
STDAPI DllGetClassObject(REFCLSID, REFIID, LPVOID*);
STDAPI DllRegisterServer();
STDAPI DllUnregisterServer();
}
/*HRESULT
InitDll()
{
HRESULT hr;
//LoadLibrary(L"XSPISAPI.DLL"); // to disable unloading
//hr = InitThreadPool();
//ON_ERROR_EXIT();
// hr = InitCodeGenerator();
// if (FAILED(hr))
// goto exit;
// hr = DllInitProcessModel();
//if (FAILED(hr))
// goto exit;
//exit:
hr = S_OK;
return hr;
}*/
/*HRESULT
UninitDll()
{
HRESULT hr;
// hr = UninitCodeGenerator();
hr = S_OK;
return hr;
}*/
BOOL WINAPI
DllMain(
HINSTANCE Instance,
DWORD Reason,
LPVOID)
{
HRESULT hr = S_OK;
BOOL ret = TRUE;
switch (Reason)
{
case DLL_PROCESS_ATTACH:
// remember the instance
g_DllInstance = Instance;
DisableThreadLibraryCalls(Instance);
// hr = InitDll();
if (hr)
{
ret = FALSE;
goto exit;
}
break;
case DLL_PROCESS_DETACH:
// hr = UninitDll();
break;
default:
break;
}
exit:
return ret;
}
ULONG
IncrementDllObjectCount()
{
return InterlockedIncrement(&g_DllObjectCount);
}
ULONG
DecrementDllObjectCount()
{
ULONG count = InterlockedDecrement(&g_DllObjectCount);
if (count == 0)
{
TerminateAppProtocol();
}
return count;
}
STDAPI
DllCanUnloadNow()
{
// TODO: Make this code thread safe.
return g_DllObjectCount > 0 ? S_FALSE : S_OK;
}
STDAPI
DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppv)
{
HRESULT hr = S_OK;
if (clsid == CLSID_AppProtocol)
{
hr = GetAppProtocolClassObject(iid, ppv);
if (FAILED(hr))
goto exit;
}
else
{
hr = CLASS_E_CLASSNOTAVAILABLE;
goto exit;
}
exit:
return hr;
}
// for errors define
#include <olectl.h>
STDAPI
DllRegisterServer()
{
// BUGBUG: for now! copy code from register.cxx XSP later
return SELFREG_E_CLASS;
}
STDAPI
DllUnregisterServer()
{
// BUGBUG: for now! copy code from register.cxx XSP later
return SELFREG_E_CLASS;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
BOOL (WINAPI * g_pInternetSetCookieW ) (LPCTSTR, LPCTSTR, LPCTSTR) = NULL;
BOOL (WINAPI * g_pInternetGetCookieW ) (LPCTSTR, LPCTSTR, LPTSTR, LPDWORD) = NULL;
HINTERNET (WINAPI * g_pInternetOpen ) (LPCTSTR, DWORD, LPCTSTR, LPCTSTR, DWORD) = NULL;
void (WINAPI * g_pInternetCloseHandle ) (HINTERNET) = NULL;
HINTERNET (WINAPI * g_pInternetOpenUrl ) (HINTERNET, LPCTSTR, LPCTSTR, DWORD, DWORD, DWORD_PTR) = NULL;
BOOL (WINAPI * g_pInternetReadFile ) (HINTERNET, LPVOID, DWORD, LPDWORD) = NULL;
BOOL (WINAPI * g_pInternetQueryOption ) (HINTERNET, DWORD, LPVOID, LPDWORD) = NULL;
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
HRESULT InitializeAppProtocol()
{
if (g_fStarted)
return TRUE;
HRESULT hr = S_OK;
HINSTANCE hWinInet = NULL;
////////////////////////////////////////////////////////////
// Step 3: Obtain entry points from WININET.DLL
hWinInet = GetModuleHandle(L"WININET.DLL");
if(hWinInet == NULL)
hWinInet = LoadLibrary(L"WININET.DLL");
if(hWinInet == NULL)
{
hr = GetLastWin32Error();
goto exit;
}
g_pInternetSetCookieW = (BOOL (WINAPI *)(LPCTSTR, LPCTSTR, LPCTSTR))
GetProcAddress(hWinInet, "InternetSetCookieW");
g_pInternetGetCookieW = (BOOL (WINAPI *)(LPCTSTR, LPCTSTR, LPTSTR, LPDWORD))
GetProcAddress(hWinInet, "InternetGetCookieW");
g_pInternetOpen = (HINTERNET (WINAPI *)(LPCTSTR, DWORD, LPCTSTR, LPCTSTR, DWORD))
GetProcAddress(hWinInet, "InternetOpenW");
g_pInternetCloseHandle = (void (WINAPI *)(HINTERNET))
GetProcAddress(hWinInet, "InternetCloseHandle");
g_pInternetOpenUrl = (HINTERNET (WINAPI *)(HINTERNET, LPCTSTR, LPCTSTR, DWORD, DWORD, DWORD_PTR))
GetProcAddress(hWinInet, "InternetOpenUrlW");
g_pInternetReadFile = (BOOL (WINAPI *)(HINTERNET, LPVOID, DWORD, LPDWORD))
GetProcAddress(hWinInet, "InternetReadFile");
g_pInternetQueryOption = (BOOL (WINAPI *)(HINTERNET, DWORD, LPVOID, LPDWORD))
GetProcAddress(hWinInet, "InternetQueryOptionW");
if ( g_pInternetSetCookieW == NULL ||
g_pInternetGetCookieW == NULL ||
g_pInternetOpen == NULL ||
g_pInternetCloseHandle == NULL ||
g_pInternetOpenUrl == NULL ||
g_pInternetReadFile == NULL ||
g_pInternetQueryOption == NULL )
{
hr = GetLastWin32Error();
goto exit;
}
g_fStarted = TRUE;
exit:
// ???? freelibrary later?
return hr;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
HRESULT
GetAppProtocolClassObject(
REFIID iid,
void ** ppv)
{
HRESULT hr;
hr = InitializeAppProtocol();
if (FAILED(hr))
goto exit;
hr = g_AppProtocolFactory.QueryInterface(iid, ppv);
if (FAILED(hr))
goto exit;
exit:
return hr;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
LPWSTR
DuplicateString ( LPCWSTR szString)
{
if (szString == NULL)
return NULL;
LPWSTR szReturn = (LPWSTR) MemAlloc((wcslen(szString) + 1) * sizeof(WCHAR));
if (szReturn != NULL)
wcscpy(szReturn, szString);
return szReturn;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Cleanup for process shutdown.
//????????
BOOL WINAPI TerminateExtension(DWORD)
{
return TRUE;
}
void
TerminateAppProtocol()
{
// TODO: This is never called. Figure out how to get proper shutdown. Consider possible refcount leaks.
if (g_fStarted)
{
TerminateExtension(0); // this is in xspprobe.cxx, but doesn't do anything!
g_fStarted = FALSE;
}
}
/**
* Allocate memory block.
*/
void *
MemAlloc(
size_t size)
{
return (void *)HeapAlloc(GetProcessHeap(), 0, size);
}
/**
* Allocate memory block and zero it out.
*/
void *
MemAllocClear(
size_t size)
{
return (void *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
}
/**
* Free allocated memory block.
*/
void
MemFree(
void *pMem)
{
if (pMem != NULL)
HeapFree(GetProcessHeap(), 0, pMem);
}
/**
* Free allocated memory block, then clear the reference.
*/
void
MemClearFn(void **ppMem)
{
if (*ppMem != NULL)
{
HeapFree(GetProcessHeap(), 0, *ppMem);
*ppMem = NULL;
}
}
/**
* Reallocate memory block
*/
void *
MemReAlloc(
void *pMem,
size_t NewSize)
{
void *pResult = NULL;
if (pMem != NULL)
{
pResult = (void *)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pMem, NewSize);
} else {
pResult = (void *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, NewSize);
}
return pResult;
}
/**
* Get the size of a memory block.
*/
size_t
MemGetSize(void *pv)
{
int result;
if (pv == NULL)
return 0;
result = HeapSize(GetProcessHeap(), 0, pv);
// ASSERT(result != -1);
return result;
}
/**
* Copy memory block
*/
void *
MemDup(void *pMem, int cb)
{
void *p = MemAlloc(cb);
if (p == NULL)
return NULL;
CopyMemory(p, pMem, cb);
return p;
}
void
ClearInterfaceFn(
IUnknown ** ppUnk)
{
IUnknown * pUnk;
pUnk = *ppUnk;
*ppUnk = NULL;
if (pUnk)
pUnk->Release();
}
void
ReplaceInterfaceFn(
IUnknown ** ppUnk,
IUnknown * pUnk)
{
IUnknown * pUnkOld = *ppUnk;
*ppUnk = pUnk;
// Note that we do AddRef before Release; this avoids
// accidentally destroying an object if this function
// is passed two aliases to it
if (pUnk)
pUnk->AddRef();
if (pUnkOld)
pUnkOld->Release();
}