Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

192 lines
3.3 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: hardmenu.cxx
//
// Contents: Disk Administrator extension class for hard disks: menu ops
//
// History: 11-Jan-94 BruceFo Created
//
//----------------------------------------------------------------------------
#include <headers.hxx>
#pragma hdrstop
#include "hardmenu.hxx"
#include "global.hxx"
CHardMenuIUnknown::CHardMenuIUnknown()
: m_pClass(NULL),
m_uRefs(1)
{
InterlockedIncrement((LONG*)&g_ulcInstancesHardMenu);
}
CHardMenuIUnknown::~CHardMenuIUnknown()
{
InterlockedDecrement((LONG*)&g_ulcInstancesHardMenu);
delete m_pClass;
}
STDMETHODIMP
CHardMenuIUnknown::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
*ppvObj = NULL;
IUnknown *pUnkTemp = NULL;
SCODE sc = S_OK;
if (IsEqualIID(IID_IUnknown, riid))
{
pUnkTemp = (IUnknown*) this;
}
else
if (IsEqualIID(IID_IDAMenuDispatch, riid))
{
pUnkTemp = (IDAMenuDispatch*) m_pClass;
}
else
{
sc = E_NOINTERFACE;
}
if (pUnkTemp != NULL)
{
pUnkTemp->AddRef();
}
*ppvObj = pUnkTemp;
return sc;
}
STDMETHODIMP_(ULONG)
CHardMenuIUnknown::AddRef()
{
InterlockedIncrement((LONG*)&m_uRefs);
return m_uRefs;
}
STDMETHODIMP_(ULONG)
CHardMenuIUnknown::Release()
{
ULONG cRef;
if (0 == (cRef=InterlockedDecrement((LONG*)&m_uRefs)))
{
delete this;
}
return cRef;
}
STDMETHODIMP
CHardMenuCF::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
*ppvObj = NULL;
IUnknown* pUnkTemp = NULL;
SCODE sc = S_OK;
if ( IsEqualIID(IID_IUnknown, riid)
|| IsEqualIID(IID_IClassFactory, riid))
{
pUnkTemp = (CHardMenuCF *)this;
}
else
{
sc = E_NOINTERFACE;
}
if (pUnkTemp != NULL)
{
pUnkTemp->AddRef();
}
*ppvObj = pUnkTemp;
return sc;
}
STDMETHODIMP_(ULONG)
CHardMenuCF::AddRef()
{
InterlockedIncrement((LONG*)&g_ulcInstancesHardMenu);
return g_ulcInstancesHardMenu;
}
STDMETHODIMP_(ULONG)
CHardMenuCF::Release()
{
InterlockedDecrement((LONG*)&g_ulcInstancesHardMenu);
return g_ulcInstancesHardMenu;
}
//
// IClassFactory Overide
//
STDMETHODIMP
CHardMenuCF::CreateInstance(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObj)
{
HRESULT hr = S_OK;
CHardMenuIUnknown* pIUnk = NULL;
pIUnk = new CHardMenuIUnknown();
if (pUnkOuter == NULL)
{
pIUnk->m_pClass = new CHardMenu(pIUnk);
hr = pIUnk->m_pClass->QueryInterface(riid, ppvObj);
pIUnk->Release();
if (FAILED(hr))
{
//
// BUGBUG: Whats the error code?
//
hr = E_NOINTERFACE;
}
}
else
{
if ( ! IsEqualIID(riid, IID_IUnknown) )
{
hr = E_NOINTERFACE;
}
else
{
pIUnk->m_pClass = new CHardMenu(pUnkOuter);
*ppvObj = (IUnknown *)pIUnk;
pIUnk->AddRef();
}
}
if (FAILED(hr))
{
delete pIUnk;
}
return hr;
}
STDMETHODIMP
CHardMenuCF::LockServer(BOOL fLock)
{
//
// BUGBUG: Whats supposed to happen here?
//
return S_OK;
}