2025-04-27 07:49:33 -04:00

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