228 lines
4.4 KiB
C++
228 lines
4.4 KiB
C++
/*++
|
|
|
|
Copyright (C) 1996-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ProvFact.cpp
|
|
|
|
Abstract:
|
|
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
#include "PreComp.h"
|
|
#include <stdio.h>
|
|
|
|
// this redefines the DEFINE_GUID() macro to do allocation.
|
|
//
|
|
#include <initguid.h>
|
|
#ifndef INITGUID
|
|
#define INITGUID
|
|
#endif
|
|
|
|
#include <wbemint.h>
|
|
|
|
#include <Allocator.h>
|
|
#include <HelperFuncs.h>
|
|
#include "Globals.h"
|
|
#include "Task.h"
|
|
#include "CThread.h"
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
* `
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
HRESULT Process_MultiThread ( ULONG a_OperationCount )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
WmiAllocator t_Allocator ;
|
|
WmiStatusCode t_StatusCode = t_Allocator.Initialize () ;
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
WmiStatusCode t_StatusCode = WmiThread <ULONG> :: Static_Initialize ( t_Allocator ) ;
|
|
|
|
#if 1
|
|
WmiThread < ULONG > *t_Thread1 = new ClientThread ( t_Allocator ) ;
|
|
if ( t_Thread1 )
|
|
{
|
|
t_Thread1->AddRef () ;
|
|
|
|
t_StatusCode = t_Thread1->Initialize () ;
|
|
|
|
Task_Execute t_Task1 ( t_Allocator , a_OperationCount ) ;
|
|
t_Task1.Initialize () ;
|
|
t_Thread1->EnQueue ( 0 , t_Task1 ) ;
|
|
|
|
t_Task1.WaitInterruptable () ;
|
|
|
|
HANDLE t_Thread1Handle = NULL ;
|
|
|
|
BOOL t_Status = DuplicateHandle (
|
|
|
|
GetCurrentProcess () ,
|
|
t_Thread1->GetHandle () ,
|
|
GetCurrentProcess () ,
|
|
& t_Thread1Handle,
|
|
0 ,
|
|
FALSE ,
|
|
DUPLICATE_SAME_ACCESS
|
|
) ;
|
|
|
|
t_Thread1->Release () ;
|
|
|
|
WaitForSingleObject ( t_Thread1Handle , INFINITE ) ;
|
|
|
|
CloseHandle ( t_Thread1Handle ) ;
|
|
}
|
|
|
|
#else
|
|
WmiThread < ULONG > *t_Thread1 = new ClientThread ( t_Allocator ) ;
|
|
if ( t_Thread1 )
|
|
{
|
|
t_Thread1->AddRef () ;
|
|
|
|
t_StatusCode = t_Thread1->Initialize () ;
|
|
|
|
WmiThread < ULONG > *t_Thread2 = new ClientThread ( t_Allocator ) ;
|
|
if ( t_Thread2 )
|
|
{
|
|
t_Thread2->AddRef () ;
|
|
|
|
t_StatusCode = t_Thread2->Initialize () ;
|
|
|
|
Task_Execute t_Task1 ( t_Allocator , a_OperationCount ) ;
|
|
t_Task1.Initialize () ;
|
|
t_Thread1->EnQueue ( 0 , t_Task1 ) ;
|
|
|
|
Task_Execute t_Task2 ( t_Allocator , a_OperationCount ) ;
|
|
t_Task2.Initialize () ;
|
|
t_Thread2->EnQueue ( 0 , t_Task2 ) ;
|
|
|
|
t_Task1.WaitInterruptable () ;
|
|
t_Task2.WaitInterruptable () ;
|
|
|
|
HANDLE t_Thread1Handle = NULL ;
|
|
|
|
BOOL t_Status = DuplicateHandle (
|
|
|
|
GetCurrentProcess () ,
|
|
t_Thread1->GetHandle () ,
|
|
GetCurrentProcess () ,
|
|
& t_Thread1Handle,
|
|
0 ,
|
|
FALSE ,
|
|
DUPLICATE_SAME_ACCESS
|
|
) ;
|
|
|
|
t_Thread1->Release () ;
|
|
|
|
WaitForSingleObject ( t_Thread1Handle , INFINITE ) ;
|
|
|
|
CloseHandle ( t_Thread1Handle ) ;
|
|
|
|
HANDLE t_Thread2Handle = NULL ;
|
|
|
|
t_Status = DuplicateHandle (
|
|
|
|
GetCurrentProcess () ,
|
|
t_Thread2->GetHandle () ,
|
|
GetCurrentProcess () ,
|
|
& t_Thread2Handle,
|
|
0 ,
|
|
FALSE ,
|
|
DUPLICATE_SAME_ACCESS
|
|
) ;
|
|
|
|
t_Thread2->Release () ;
|
|
|
|
WaitForSingleObject ( t_Thread2Handle , INFINITE ) ;
|
|
|
|
CloseHandle ( t_Thread2Handle ) ;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
t_StatusCode = WmiThread <ULONG> :: Static_UnInitialize ( t_Allocator ) ;
|
|
}
|
|
else
|
|
{
|
|
t_Result = WBEM_E_OUT_OF_MEMORY ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
void Process ( ULONG a_OperationCount )
|
|
{
|
|
HRESULT t_Result = CoInitializeEx(0, COINIT_MULTITHREADED) ;
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
t_Result = CoInitializeSecurity (
|
|
|
|
NULL,
|
|
-1,
|
|
NULL,
|
|
NULL,
|
|
RPC_C_AUTHN_LEVEL_NONE,
|
|
RPC_C_IMP_LEVEL_IMPERSONATE,
|
|
NULL,
|
|
EOAC_NONE,
|
|
0
|
|
);
|
|
|
|
t_Result = Process_MultiThread ( a_OperationCount );
|
|
|
|
CoUninitialize () ;
|
|
}
|
|
else
|
|
{
|
|
// fwprintf ( stderr , L"CoInitilize: %lx\n" , t_Result ) ;
|
|
}
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
EXTERN_C int __cdecl wmain (
|
|
|
|
int argc ,
|
|
char **argv
|
|
)
|
|
{
|
|
ULONG t_OperationCount = 2 ;
|
|
|
|
Process ( t_OperationCount ) ;
|
|
|
|
return 0 ;
|
|
}
|
|
|
|
|