windows-nt/Source/XPSP1/NT/ds/adsi/winnt/system.cxx
2020-09-26 16:20:57 +08:00

492 lines
9.7 KiB
C++

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995
//
// File: cPathname.cxx
//
// Contents: Pathname object
//
// History: 11-1-95 krishnag Created.
//
//----------------------------------------------------------------------------
#include "winnt.hxx"
#pragma hdrstop
extern "C" {
typedef struct _WKSTA_USER_INFO_1A {
LPSTR wkui1_username;
LPSTR wkui1_logon_domain;
LPSTR wkui1_oth_domains;
LPSTR wkui1_logon_server;
}WKSTA_USER_INFO_1A, *PWKSTA_USER_INFO_1A, *LPWKSTA_USER_INFO_1A;
NET_API_STATUS NET_API_FUNCTION
NetWkstaUserGetInfoA (
IN LPSTR reserved,
IN DWORD level,
OUT LPBYTE *bufptr
);
}
// Class CWinNTSystemInfo
DEFINE_IDispatch_Implementation(CWinNTSystemInfo)
//+---------------------------------------------------------------------------
// Function: CWinNTSystemInfo::CWinNTSystemInfo
//
// Synopsis: Constructor
//
// Arguments:
//
// Returns: HRESULT
//
// Modifies: -
//
// History:
//
//----------------------------------------------------------------------------
CWinNTSystemInfo::CWinNTSystemInfo():
_pDispMgr(NULL)
{
ENLIST_TRACKING(CWinNTSystemInfo);
}
//+---------------------------------------------------------------------------
// Function: CWinNTSystemInfo::CreateWinNTSystemInfo
//
// Synopsis:
//
// Arguments:
//
// Returns: HRESULT
//
// Modifies: -
//
// History:
//
//----------------------------------------------------------------------------
HRESULT
CWinNTSystemInfo::CreateWinNTSystemInfo(
REFIID riid,
void **ppvObj
)
{
CWinNTSystemInfo FAR * pWinNTSystemInfo = NULL;
HRESULT hr = S_OK;
hr = AllocateWinNTSystemInfoObject(&pWinNTSystemInfo);
BAIL_ON_FAILURE(hr);
hr = pWinNTSystemInfo->QueryInterface(riid, ppvObj);
BAIL_ON_FAILURE(hr);
pWinNTSystemInfo->Release();
RRETURN(hr);
error:
delete pWinNTSystemInfo;
RRETURN(hr);
}
//+---------------------------------------------------------------------------
// Function: CWinNTSystemInfo::~CWinNTSystemInfo
//
// Synopsis:
//
// Arguments:
//
// Returns: HRESULT
//
// Modifies: -
//
// History:
//
//----------------------------------------------------------------------------
CWinNTSystemInfo::~CWinNTSystemInfo( )
{
delete _pDispMgr;
}
//+---------------------------------------------------------------------------
// Function: CWinNTSystemInfo::QueryInterface
//
// Synopsis:
//
// Arguments:
//
// Returns: HRESULT
//
// Modifies: -
//
// History:
//
//----------------------------------------------------------------------------
STDMETHODIMP
CWinNTSystemInfo::QueryInterface(
REFIID iid,
LPVOID FAR* ppv
)
{
if (ppv == NULL) {
RRETURN(E_POINTER);
}
if (IsEqualIID(iid, IID_IUnknown))
{
*ppv = (IADsWinNTSystemInfo FAR *) this;
}
else if (IsEqualIID(iid, IID_IADsWinNTSystemInfo))
{
*ppv = (IADsWinNTSystemInfo FAR *) this;
}
else if (IsEqualIID(iid, IID_IDispatch))
{
*ppv = (IADsWinNTSystemInfo FAR *) this;
}
else if (IsEqualIID(iid, IID_ISupportErrorInfo))
{
*ppv = (ISupportErrorInfo FAR *) this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
//+---------------------------------------------------------------------------
// Function: CWinNTSystemInfo::AllocateWinNTSystemInfoObject
//
// Synopsis:
//
// Arguments:
//
// Returns: HRESULT
//
// Modifies: -
//
// History:
//
//----------------------------------------------------------------------------
HRESULT
CWinNTSystemInfo::AllocateWinNTSystemInfoObject(
CWinNTSystemInfo ** ppWinNTSystemInfo
)
{
CWinNTSystemInfo FAR * pWinNTSystemInfo = NULL;
CAggregatorDispMgr FAR * pDispMgr = NULL;
HRESULT hr = S_OK;
pWinNTSystemInfo = new CWinNTSystemInfo();
if (pWinNTSystemInfo == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
pDispMgr = new CAggregatorDispMgr;
if (pDispMgr == NULL) {
hr = E_OUTOFMEMORY;
}
BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry(
pDispMgr,
LIBID_ADs,
IID_IADsWinNTSystemInfo,
(IADsWinNTSystemInfo *)pWinNTSystemInfo,
DISPID_REGULAR
);
BAIL_ON_FAILURE(hr);
pWinNTSystemInfo->_pDispMgr = pDispMgr;
*ppWinNTSystemInfo = pWinNTSystemInfo;
RRETURN(hr);
error:
delete pDispMgr;
RRETURN_EXP_IF_ERR(hr);
}
//+---------------------------------------------------------------------------
// Function: CWinNTSystemInfo::InterfaceSupportsErrorInfo
//
// Synopsis:
//
// Arguments:
//
// Returns: HRESULT
//
// Modifies: -
//
// History:
//
//----------------------------------------------------------------------------
HRESULT
CWinNTSystemInfo::InterfaceSupportsErrorInfo(THIS_ REFIID riid)
{
if (IsEqualIID(riid, IID_IADsWinNTSystemInfo)) {
RRETURN(S_OK);
} else {
RRETURN(S_FALSE);
}
}
HRESULT
CWinNTSystemInfo::get_UserName(
BSTR * bstrUserName
)
{
PWSTR pszUserName = NULL;
ULONG uLength;
HRESULT hr;
//
// Validate parameters
//
if ( !bstrUserName )
{
RRETURN(HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
}
//
// Get length of buffer to be allocated
//
uLength = 0;
GetUserName(NULL, &uLength);
if (uLength > 0)
{
//
// Allocate memory and do the real work
//
pszUserName = (PWSTR)AllocADsMem(uLength * sizeof(WCHAR));
if (!pszUserName)
{
RRETURN(E_OUTOFMEMORY);
}
if (GetUserName(pszUserName, &uLength))
{
hr = ADsAllocString(pszUserName, bstrUserName);
BAIL_ON_FAILURE(hr);
}
else
hr = HRESULT_FROM_WIN32(GetLastError());
}
else
hr = HRESULT_FROM_WIN32(GetLastError());
error:
if (pszUserName)
{
FreeADsMem(pszUserName);
}
RRETURN(hr);
}
HRESULT
CWinNTSystemInfo::get_ComputerName(
BSTR * bstrComputerName
)
{
PWSTR pszComputerName = NULL;
ULONG uLength;
HRESULT hr;
//
// Validate parameters
//
if (!bstrComputerName)
{
RRETURN(HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
}
//
// Get length of buffer to be allocated
//
uLength = 0;
GetComputerName(NULL, &uLength);
if (uLength > 0)
{
//
// Allocated memory and do the real work
//
pszComputerName = (PWSTR)AllocADsMem(uLength * sizeof(WCHAR));
if (!pszComputerName)
{
RRETURN(E_OUTOFMEMORY);
}
if (GetComputerName(pszComputerName, &uLength))
{
hr = ADsAllocString(pszComputerName, bstrComputerName);
BAIL_ON_FAILURE(hr);
}
else
hr = HRESULT_FROM_WIN32(GetLastError());
}
else
hr = HRESULT_FROM_WIN32(GetLastError());
error:
if (pszComputerName)
{
FreeADsMem(pszComputerName);
}
RRETURN(hr);
}
HRESULT
CWinNTSystemInfo::get_DomainName(
BSTR * bstrDomainName
)
{
PWKSTA_USER_INFO_1 pInfo = NULL;
PWKSTA_USER_INFO_1A pInfoA = NULL;
DWORD err;
HRESULT hr = S_OK;
PWSTR pszDomainName = NULL;
//
// Validate parameters
//
if (!bstrDomainName )
{
RRETURN(HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
}
//
// Call NetWkstaUserGetInfo to find domain name
//
#if (defined WIN95)
err = NetWkstaUserGetInfoA(NULL, 1, (LPBYTE *) &pInfoA);
if (err != ERROR_SUCCESS)
{
RRETURN(HRESULT_FROM_WIN32(err));
}
pszDomainName = (PWSTR)AllocADsMem((lstrlenA(pInfoA->wkui1_logon_domain) + 1) * sizeof(WCHAR));
if (!pszDomainName)
{
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
}
if (MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
pInfoA->wkui1_logon_domain,
-1,
pszDomainName,
lstrlenA(pInfoA->wkui1_logon_domain) + 1) == 0)
{
BAIL_ON_FAILURE(hr = HRESULT_FROM_WIN32(GetLastError()));
}
hr = ADsAllocString(pszDomainName, bstrDomainName);
BAIL_ON_FAILURE(hr);
#else
err = NetWkstaUserGetInfo(NULL, 1, (LPBYTE*) &pInfo);
if (err != ERROR_SUCCESS)
{
RRETURN(HRESULT_FROM_WIN32(err));
}
hr = ADsAllocString((LPWSTR)pInfo->wkui1_logon_domain, bstrDomainName);
BAIL_ON_FAILURE(hr);
#endif
error:
if (pInfo)
{
NetApiBufferFree(pInfo);
}
if (pInfoA)
{
NetApiBufferFree(pInfoA);
}
if (pszDomainName)
{
FreeADsMem(pszDomainName);
}
RRETURN(hr);
}
HRESULT
CWinNTSystemInfo::get_PDC(
BSTR * bstrPDC
)
{
PWSTR pszPDC = NULL;
HRESULT hr;
DWORD err;
//
// Validate parameters
//
if (!bstrPDC )
{
RRETURN(HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
}
err = NetGetDCName(NULL, NULL, (LPBYTE*)&pszPDC);
if (err != ERROR_SUCCESS)
{
RRETURN(HRESULT_FROM_WIN32(GetLastError()));
}
hr = ADsAllocString(&pszPDC[2], bstrPDC); // remove '\\';
BAIL_ON_FAILURE(hr);
error:
if (pszPDC)
{
NetApiBufferFree(pszPDC);
}
return hr;
}
STDMETHODIMP
CWinNTSystemInfoCF::CreateInstance(
IUnknown * pUnkOuter,
REFIID iid,
LPVOID * ppv
)
{
HRESULT hr = E_FAIL;
if (pUnkOuter)
RRETURN(E_FAIL);
hr = CWinNTSystemInfo::CreateWinNTSystemInfo(
iid,
ppv
);
RRETURN(hr);
}