|
|
//---------------------------------------------------------------------------
//
// 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); }
|