Source code of Windows XP (NT5)
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.

544 lines
12 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // TaskGetDomains.cpp
  7. //
  8. // Description:
  9. // Get DNS/NetBIOS Domain Names for the list of domains.
  10. //
  11. // Documentation:
  12. // Yes.
  13. //
  14. // Maintained By:
  15. // Galen Barbee (GalenB) 22-NOV-1999
  16. //
  17. //////////////////////////////////////////////////////////////////////////////
  18. #include "pch.h"
  19. #include "ClusCfgClient.h"
  20. #include "TaskGetDomains.h"
  21. // ADSI support, to get domain names
  22. #include <Lm.h>
  23. #include <Dsgetdc.h>
  24. DEFINE_THISCLASS("CTaskGetDomains")
  25. // ************************************************************************
  26. //
  27. // Constructor / Destructor
  28. //
  29. // ************************************************************************
  30. //////////////////////////////////////////////////////////////////////////////
  31. //
  32. // HRESULT
  33. // CTaskGetDomains::S_HrCreateInstance(
  34. // IUnknown ** ppunkOut
  35. // )
  36. //
  37. //////////////////////////////////////////////////////////////////////////////
  38. HRESULT
  39. CTaskGetDomains::S_HrCreateInstance(
  40. IUnknown ** ppunkOut
  41. )
  42. {
  43. TraceFunc( "" );
  44. Assert( ppunkOut != NULL );
  45. HRESULT hr;
  46. CTaskGetDomains * ptgd = new CTaskGetDomains;
  47. if ( ptgd != NULL )
  48. {
  49. hr = THR( ptgd->Init() );
  50. if ( SUCCEEDED( hr ) )
  51. {
  52. hr = THR( ptgd->TypeSafeQI( IUnknown, ppunkOut ) );
  53. //TraceMoveToMemoryList( *ppunkOut, g_GlobalMemoryList );
  54. }
  55. ptgd->Release();
  56. }
  57. else
  58. {
  59. hr = E_OUTOFMEMORY;
  60. }
  61. HRETURN( hr );
  62. } // S_HrCreateInstance()
  63. //////////////////////////////////////////////////////////////////////////////
  64. //
  65. // CTaskGetDomains::CTaskGetDomains( void )
  66. //
  67. //////////////////////////////////////////////////////////////////////////////
  68. CTaskGetDomains::CTaskGetDomains()
  69. {
  70. TraceFunc( "" );
  71. InterlockedIncrement( &g_cObjects );
  72. TraceFuncExit();
  73. } // CTaskGetDomains()
  74. //////////////////////////////////////////////////////////////////////////////
  75. //
  76. // STDMETHODIMP
  77. // CTaskGetDomains::Init( void )
  78. //
  79. //////////////////////////////////////////////////////////////////////////////
  80. STDMETHODIMP
  81. CTaskGetDomains::Init( void )
  82. {
  83. TraceFunc( "" );
  84. HRESULT hr = S_OK;
  85. // IUnknown stuff
  86. Assert( m_cRef == 0 );
  87. AddRef(); // Add one count
  88. // ITaskGetDomains
  89. Assert( m_pStream == NULL );
  90. Assert( m_ptgdcb == NULL );
  91. InitializeCriticalSection( &m_csCallback );
  92. HRETURN( hr );
  93. } // Init()
  94. //////////////////////////////////////////////////////////////////////////////
  95. //
  96. // CTaskGetDomains::~CTaskGetDomains()
  97. //
  98. //////////////////////////////////////////////////////////////////////////////
  99. CTaskGetDomains::~CTaskGetDomains()
  100. {
  101. TraceFunc( "" );
  102. if ( m_pStream != NULL)
  103. {
  104. m_pStream->Release();
  105. }
  106. if ( m_ptgdcb != NULL )
  107. {
  108. m_ptgdcb->Release();
  109. }
  110. DeleteCriticalSection( &m_csCallback );
  111. InterlockedDecrement( &g_cObjects );
  112. TraceFuncExit();
  113. } // ~CTaskGetDomains()
  114. // ************************************************************************
  115. //
  116. // IUnknown
  117. //
  118. // ************************************************************************
  119. //////////////////////////////////////////////////////////////////////////////
  120. //
  121. // STDMETHODIMP
  122. // CTaskGetDomains::QueryInterface(
  123. // REFIID riid,
  124. // LPVOID *ppv
  125. // )
  126. //
  127. //////////////////////////////////////////////////////////////////////////////
  128. STDMETHODIMP
  129. CTaskGetDomains::QueryInterface(
  130. REFIID riid,
  131. LPVOID *ppv)
  132. {
  133. TraceQIFunc( riid, ppv );
  134. HRESULT hr = E_NOINTERFACE;
  135. if (IsEqualIID( riid, IID_IUnknown ) )
  136. {
  137. *ppv = static_cast< ITaskGetDomains * >( this );
  138. hr = S_OK;
  139. } // if: IUnknown
  140. else if ( IsEqualIID( riid, IID_ITaskGetDomains ) )
  141. {
  142. *ppv = TraceInterface( __THISCLASS__, ITaskGetDomains, this, 0 );
  143. hr = S_OK;
  144. } // else if: ITaskGetDomains
  145. else if ( IsEqualIID( riid, IID_IDoTask ) )
  146. {
  147. *ppv = TraceInterface( __THISCLASS__, IDoTask, this, 0 );
  148. hr = S_OK;
  149. } // else if: IDoTask
  150. if ( SUCCEEDED( hr ) )
  151. {
  152. ( (IUnknown *) *ppv )->AddRef();
  153. } // if: success
  154. QIRETURN_IGNORESTDMARSHALLING( hr, riid );
  155. } // QueryInterface()
  156. //////////////////////////////////////////////////////////////////////////////
  157. //
  158. // STDMETHODIMP_(ULONG)
  159. // CTaskGetDomains::AddRef( void )
  160. //
  161. //////////////////////////////////////////////////////////////////////////////
  162. STDMETHODIMP_(ULONG)
  163. CTaskGetDomains::AddRef( void )
  164. {
  165. TraceFunc( "[IUnknown]" );
  166. InterlockedIncrement( &m_cRef );
  167. RETURN( m_cRef );
  168. } // AddRef()
  169. //////////////////////////////////////////////////////////////////////////////
  170. //
  171. // STDMETHODIMP_(ULONG)
  172. // CTaskGetDomains::Release( void )
  173. //
  174. //////////////////////////////////////////////////////////////////////////////
  175. STDMETHODIMP_(ULONG)
  176. CTaskGetDomains::Release( void )
  177. {
  178. TraceFunc( "[IUnknown]" );
  179. InterlockedDecrement( &m_cRef );
  180. if ( m_cRef )
  181. {
  182. RETURN(m_cRef);
  183. }
  184. TraceDo( delete this );
  185. RETURN( 0 );
  186. } // Release()
  187. // ************************************************************************
  188. //
  189. // IDoTask / ITaskGetDomains
  190. //
  191. // ************************************************************************
  192. //////////////////////////////////////////////////////////////////////////////
  193. //
  194. // STDMETHODIMP
  195. // CTaskGetDomains::BeginTask(void);
  196. //
  197. //////////////////////////////////////////////////////////////////////////////
  198. STDMETHODIMP
  199. CTaskGetDomains::BeginTask( void )
  200. {
  201. TraceFunc( "[IDoTask]" );
  202. HRESULT hr;
  203. ULONG ulLen;
  204. DWORD dwRes;
  205. ULONG idx;
  206. PDS_DOMAIN_TRUSTS paDomains = NULL;
  207. hr = THR( HrUnMarshallCallback() );
  208. if ( FAILED( hr ) )
  209. goto Cleanup;
  210. //
  211. // Enumerate the list of Domains
  212. //
  213. dwRes = TW32( DsEnumerateDomainTrusts( NULL,
  214. DS_DOMAIN_VALID_FLAGS,
  215. &paDomains,
  216. &ulLen
  217. ) );
  218. //
  219. // Might return ERROR_NOT_SUPPORTED if the DC is pre-W2k
  220. // In that case, retry in compatible mode
  221. //
  222. if ( dwRes == ERROR_NOT_SUPPORTED )
  223. {
  224. dwRes = TW32( DsEnumerateDomainTrusts( NULL,
  225. DS_DOMAIN_VALID_FLAGS & ( ~DS_DOMAIN_DIRECT_INBOUND),
  226. &paDomains,
  227. &ulLen
  228. ) );
  229. } // if:
  230. if ( dwRes != NO_ERROR )
  231. {
  232. hr = HRESULT_FROM_WIN32( dwRes );
  233. goto Cleanup;
  234. }
  235. //
  236. // Pass the information to the UI layer.
  237. //
  238. for ( idx = 0; idx < ulLen; idx++ )
  239. {
  240. if ( paDomains[ idx ].DnsDomainName != NULL )
  241. {
  242. if ( m_ptgdcb != NULL )
  243. {
  244. BSTR bstrDomainName = TraceSysAllocString( paDomains[ idx ].DnsDomainName );
  245. if ( bstrDomainName == NULL )
  246. goto OutOfMemory;
  247. hr = THR( ReceiveDomainName( bstrDomainName ) );
  248. // check error after freeing string
  249. TraceSysFreeString( bstrDomainName );
  250. if ( FAILED( hr ) )
  251. goto Cleanup;
  252. }
  253. else
  254. {
  255. break;
  256. }
  257. }
  258. else if ( paDomains[ idx ].NetbiosDomainName != NULL )
  259. {
  260. if ( m_ptgdcb != NULL )
  261. {
  262. BSTR bstrDomainName = TraceSysAllocString( paDomains[ idx ].NetbiosDomainName );
  263. if ( bstrDomainName == NULL )
  264. {
  265. hr = E_OUTOFMEMORY;
  266. goto Cleanup;
  267. }
  268. // send data
  269. hr = THR( ReceiveDomainName( bstrDomainName ) );
  270. TraceSysFreeString( bstrDomainName );
  271. if ( FAILED( hr ) )
  272. goto Cleanup;
  273. }
  274. }
  275. }
  276. hr = S_OK;
  277. Cleanup:
  278. if ( paDomains != NULL )
  279. {
  280. NetApiBufferFree( paDomains );
  281. }
  282. HRETURN( hr );
  283. OutOfMemory:
  284. hr = E_OUTOFMEMORY;
  285. goto Cleanup;
  286. } // BeginTask()
  287. //////////////////////////////////////////////////////////////////////////////
  288. //
  289. // STDMETHODIMP
  290. // CTaskGetDomains::StopTask( void )
  291. //
  292. //////////////////////////////////////////////////////////////////////////////
  293. STDMETHODIMP
  294. CTaskGetDomains::StopTask( void )
  295. {
  296. TraceFunc( "[IDoTask]" );
  297. HRESULT hr = S_OK;
  298. HRETURN( hr );
  299. } //*** StopTask
  300. //////////////////////////////////////////////////////////////////////////////
  301. //
  302. // STDMETHODIMP
  303. // CTaskGetDomains::SetCallback(
  304. // ITaskGetDomainsCallback * punkIn
  305. // )
  306. //
  307. //////////////////////////////////////////////////////////////////////////////
  308. STDMETHODIMP
  309. CTaskGetDomains::SetCallback(
  310. ITaskGetDomainsCallback * punkIn
  311. )
  312. {
  313. TraceFunc( "[ITaskGetDomains]" );
  314. HRESULT hr = E_UNEXPECTED;
  315. if ( punkIn != NULL )
  316. {
  317. EnterCriticalSection( &m_csCallback );
  318. hr = THR( CoMarshalInterThreadInterfaceInStream( IID_ITaskGetDomainsCallback,
  319. punkIn,
  320. &m_pStream
  321. ) );
  322. LeaveCriticalSection( &m_csCallback );
  323. }
  324. else
  325. {
  326. hr = THR( HrReleaseCurrentCallback() );
  327. }
  328. HRETURN( hr );
  329. } // SetCallback()
  330. //****************************************************************************
  331. //
  332. // Private
  333. //
  334. //****************************************************************************
  335. //////////////////////////////////////////////////////////////////////////////
  336. //
  337. // HRESULT
  338. // CTaskGetDomains::HrReleaseCurrentCallback( void )
  339. //
  340. //////////////////////////////////////////////////////////////////////////////
  341. HRESULT
  342. CTaskGetDomains::HrReleaseCurrentCallback( void )
  343. {
  344. TraceFunc( "" );
  345. HRESULT hr = S_OK;
  346. EnterCriticalSection( &m_csCallback );
  347. if ( m_pStream != NULL )
  348. {
  349. hr = THR( CoUnmarshalInterface( m_pStream,
  350. TypeSafeParams( ITaskGetDomainsCallback, &m_ptgdcb )
  351. ) );
  352. m_pStream->Release();
  353. m_pStream = NULL;
  354. }
  355. if ( m_ptgdcb != NULL )
  356. {
  357. m_ptgdcb->Release();
  358. m_ptgdcb = NULL;
  359. }
  360. LeaveCriticalSection( &m_csCallback );
  361. HRETURN( hr );
  362. } // HrReleaseCurrentCallback()
  363. //////////////////////////////////////////////////////////////////////////////
  364. //
  365. // HRESULT
  366. // CTaskGetDomains::HrUnMarshallCallback( void )
  367. //
  368. //////////////////////////////////////////////////////////////////////////////
  369. HRESULT
  370. CTaskGetDomains::HrUnMarshallCallback( void )
  371. {
  372. TraceFunc( "" );
  373. HRESULT hr;
  374. EnterCriticalSection( &m_csCallback );
  375. hr = THR( CoUnmarshalInterface( m_pStream,
  376. TypeSafeParams( ITaskGetDomainsCallback, &m_ptgdcb )
  377. ) );
  378. m_pStream->Release();
  379. m_pStream = NULL;
  380. LeaveCriticalSection( &m_csCallback );
  381. HRETURN( hr );
  382. } // HrUnMarshallCallback()
  383. //////////////////////////////////////////////////////////////////////////////
  384. //
  385. // STDMETHODIMP
  386. // CClusDomainPage::ReceiveDomainResult(
  387. // HRESULT hrIn
  388. // )
  389. //
  390. //////////////////////////////////////////////////////////////////////////////
  391. STDMETHODIMP
  392. CTaskGetDomains::ReceiveDomainResult(
  393. HRESULT hrIn
  394. )
  395. {
  396. TraceFunc( "" );
  397. HRESULT hr;
  398. EnterCriticalSection( &m_csCallback );
  399. if ( m_ptgdcb != NULL )
  400. {
  401. hr = THR( m_ptgdcb->ReceiveDomainResult( hrIn ) );
  402. }
  403. LeaveCriticalSection( &m_csCallback );
  404. HRETURN( hr );
  405. } // ReceiveResult()
  406. //////////////////////////////////////////////////////////////////////////////
  407. //
  408. // STDMETHODIMP
  409. // CTaskGetDomains::ReceiveDomainName(
  410. // BSTR bstrDomainNameIn
  411. // )
  412. //
  413. //////////////////////////////////////////////////////////////////////////////
  414. STDMETHODIMP
  415. CTaskGetDomains::ReceiveDomainName(
  416. BSTR bstrDomainNameIn
  417. )
  418. {
  419. TraceFunc( "" );
  420. HRESULT hr;
  421. EnterCriticalSection( &m_csCallback );
  422. if ( m_ptgdcb != NULL )
  423. {
  424. hr = THR( m_ptgdcb->ReceiveDomainName( bstrDomainNameIn ) );
  425. }
  426. LeaveCriticalSection( &m_csCallback );
  427. HRETURN( hr );
  428. } // ReceiveDomainName()