mirror of https://github.com/lianthony/NT4.0
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.
199 lines
3.4 KiB
199 lines
3.4 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: hard.cxx
|
|
//
|
|
// Contents: Disk Administrator volume extension class for hard disks
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 10-May-93 BruceFo Created from kevinro event report code
|
|
//
|
|
// Note: Eventually, this code will be generated by tools. Therefore, the
|
|
// comments and cleanliness is not up to par.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <headers.hxx>
|
|
#pragma hdrstop
|
|
|
|
#include "hard.hxx"
|
|
#include "global.hxx"
|
|
|
|
|
|
CHardIUnknown::CHardIUnknown()
|
|
: m_pClass(NULL),
|
|
m_uRefs(1)
|
|
{
|
|
InterlockedIncrement((LONG*)&g_ulcInstancesHard);
|
|
}
|
|
|
|
|
|
CHardIUnknown::~CHardIUnknown()
|
|
{
|
|
InterlockedDecrement((LONG*)&g_ulcInstancesHard);
|
|
delete m_pClass;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CHardIUnknown::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_IDAHardDiskInfo, riid))
|
|
{
|
|
pUnkTemp = (IDAHardDiskInfo*) m_pClass;
|
|
}
|
|
else
|
|
{
|
|
sc = E_NOINTERFACE;
|
|
}
|
|
|
|
if (pUnkTemp != NULL)
|
|
{
|
|
pUnkTemp->AddRef();
|
|
}
|
|
|
|
*ppvObj = pUnkTemp;
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CHardIUnknown::AddRef()
|
|
{
|
|
InterlockedIncrement((LONG*)&m_uRefs);
|
|
return m_uRefs;
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CHardIUnknown::Release()
|
|
{
|
|
ULONG cRef;
|
|
|
|
if (0 == (cRef=InterlockedDecrement((LONG*)&m_uRefs)))
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return cRef;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CHardCF::QueryInterface(REFIID riid, LPVOID* ppvObj)
|
|
{
|
|
*ppvObj = NULL;
|
|
|
|
IUnknown* pUnkTemp = NULL;
|
|
SCODE sc = S_OK;
|
|
|
|
if ( IsEqualIID(IID_IUnknown, riid)
|
|
|| IsEqualIID(IID_IClassFactory, riid))
|
|
{
|
|
pUnkTemp = (CHardCF *)this;
|
|
}
|
|
else
|
|
{
|
|
sc = E_NOINTERFACE;
|
|
}
|
|
|
|
if (pUnkTemp != NULL)
|
|
{
|
|
pUnkTemp->AddRef();
|
|
}
|
|
|
|
*ppvObj = pUnkTemp;
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CHardCF::AddRef()
|
|
{
|
|
InterlockedIncrement((LONG*)&g_ulcInstancesHard);
|
|
return g_ulcInstancesHard;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CHardCF::Release()
|
|
{
|
|
InterlockedDecrement((LONG*)&g_ulcInstancesHard);
|
|
return g_ulcInstancesHard;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// IClassFactory Overide
|
|
//
|
|
STDMETHODIMP
|
|
CHardCF::CreateInstance(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObj)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
CHardIUnknown* pIUnk = NULL;
|
|
|
|
pIUnk = new CHardIUnknown();
|
|
|
|
if (pUnkOuter == NULL)
|
|
{
|
|
pIUnk->m_pClass = new CHard(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 CHard(pUnkOuter);
|
|
*ppvObj = (IUnknown *)pIUnk;
|
|
pIUnk->AddRef();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
delete pIUnk;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CHardCF::LockServer(BOOL fLock)
|
|
{
|
|
//
|
|
// BUGBUG: Whats supposed to happen here?
|
|
//
|
|
return S_OK;
|
|
}
|